diff --git a/components/brave_wallet/browser/brave_wallet_utils.cc b/components/brave_wallet/browser/brave_wallet_utils.cc index 3811ae86235..6a4e6b6b5a4 100644 --- a/components/brave_wallet/browser/brave_wallet_utils.cc +++ b/components/brave_wallet/browser/brave_wallet_utils.cc @@ -409,6 +409,171 @@ std::optional ValueToTransactionReceipt( return tx_receipt; } +std::string EncodeSwapProvider(mojom::SwapProvider provider) { + switch (provider) { + case mojom::SwapProvider::kAuto: + return "AUTO"; + case mojom::SwapProvider::kLiFi: + return "LIFI"; + case mojom::SwapProvider::kZeroEx: + return "ZERO_EX"; + case mojom::SwapProvider::kJupiter: + return "JUPITER"; + case mojom::SwapProvider::kSquid: + return "SQUID"; + case mojom::SwapProvider::kNearIntents: + return "NEAR_INTENTS"; + default: + return "AUTO"; + } +} + +mojom::SwapProvider DecodeSwapProvider(const std::string& provider_str) { + if (provider_str == "AUTO") { + return mojom::SwapProvider::kAuto; + } + + if (provider_str == "LIFI") { + return mojom::SwapProvider::kLiFi; + } + + if (provider_str == "ZERO_EX") { + return mojom::SwapProvider::kZeroEx; + } + + if (provider_str == "JUPITER") { + return mojom::SwapProvider::kJupiter; + } + + if (provider_str == "SQUID") { + return mojom::SwapProvider::kSquid; + } + + if (provider_str == "NEAR_INTENTS") { + return mojom::SwapProvider::kNearIntents; + } + + return mojom::SwapProvider::kAuto; +} + +base::Value::Dict SwapInfoToValue(const mojom::SwapInfoPtr& swap_info) { + base::Value::Dict dict; + if (!swap_info) { + return dict; + } + + auto source_coin_str = GetStringFromCoinType(swap_info->source_coin); + if (!source_coin_str) { + return dict; + } + dict.Set("source_coin", *source_coin_str); + dict.Set("source_chain_id", swap_info->source_chain_id); + dict.Set("source_token_address", swap_info->source_token_address); + dict.Set("source_amount", swap_info->source_amount); + + auto destination_coin_str = + GetStringFromCoinType(swap_info->destination_coin); + if (!destination_coin_str) { + return dict; + } + dict.Set("destination_coin", *destination_coin_str); + dict.Set("destination_chain_id", swap_info->destination_chain_id); + dict.Set("destination_token_address", swap_info->destination_token_address); + dict.Set("destination_amount", swap_info->destination_amount); + dict.Set("destination_amount_min", swap_info->destination_amount_min); + + dict.Set("recipient", swap_info->recipient); + dict.Set("provider", EncodeSwapProvider(swap_info->provider)); + + return dict; +} + +mojom::SwapInfoPtr ValueToSwapInfo(const base::Value::Dict& value) { + auto swap_info = mojom::SwapInfo::New(); + + const std::string* source_coin_str = value.FindString("source_coin"); + if (!source_coin_str) { + return nullptr; + } + auto source_coin = GetCoinTypeFromString(*source_coin_str); + if (!source_coin) { + return nullptr; + } + swap_info->source_coin = *source_coin; + + const std::string* source_chain_id = value.FindString("source_chain_id"); + if (!source_chain_id) { + return nullptr; + } + swap_info->source_chain_id = *source_chain_id; + + const std::string* source_token_address = + value.FindString("source_token_address"); + if (!source_token_address) { + return nullptr; + } + swap_info->source_token_address = *source_token_address; + + const std::string* source_amount = value.FindString("source_amount"); + if (!source_amount) { + return nullptr; + } + swap_info->source_amount = *source_amount; + + const std::string* destination_coin_str = + value.FindString("destination_coin"); + if (!destination_coin_str) { + return nullptr; + } + auto destination_coin = GetCoinTypeFromString(*destination_coin_str); + if (!destination_coin) { + return nullptr; + } + swap_info->destination_coin = *destination_coin; + + const std::string* destination_chain_id = + value.FindString("destination_chain_id"); + if (!destination_chain_id) { + return nullptr; + } + swap_info->destination_chain_id = *destination_chain_id; + + const std::string* destination_token_address = + value.FindString("destination_token_address"); + if (!destination_token_address) { + return nullptr; + } + swap_info->destination_token_address = *destination_token_address; + + const std::string* destination_amount = + value.FindString("destination_amount"); + if (!destination_amount) { + return nullptr; + } + swap_info->destination_amount = *destination_amount; + + // destination_amount_min is optional (only for EXACT_INPUT swaps) + const std::string* destination_amount_min = + value.FindString("destination_amount_min"); + swap_info->destination_amount_min = + destination_amount_min ? *destination_amount_min : ""; + + const std::string* recipient = value.FindString("recipient"); + if (!recipient) { + return nullptr; + } + swap_info->recipient = *recipient; + + const std::string* provider_str = value.FindString("provider"); + if (!provider_str) { + return nullptr; + } + + swap_info->provider = DecodeSwapProvider(*provider_str); + + return swap_info; +} + mojom::DefaultWallet GetDefaultEthereumWallet(PrefService* prefs) { return static_cast( prefs->GetInteger(kDefaultEthereumWallet)); diff --git a/components/brave_wallet/browser/brave_wallet_utils.h b/components/brave_wallet/browser/brave_wallet_utils.h index 649820138c9..a4c0a801172 100644 --- a/components/brave_wallet/browser/brave_wallet_utils.h +++ b/components/brave_wallet/browser/brave_wallet_utils.h @@ -54,6 +54,9 @@ base::Value::Dict TransactionReceiptToValue( std::optional ValueToTransactionReceipt( const base::Value::Dict& value); +base::Value::Dict SwapInfoToValue(const mojom::SwapInfoPtr& swap_info); +mojom::SwapInfoPtr ValueToSwapInfo(const base::Value::Dict& value); + bool IsEndpointUsingBraveWalletProxy(const GURL& url); base::flat_map MakeBraveServicesKeyHeaders(); diff --git a/components/brave_wallet/browser/brave_wallet_utils_unittest.cc b/components/brave_wallet/browser/brave_wallet_utils_unittest.cc index c7433e3fe43..f2b51541fb4 100644 --- a/components/brave_wallet/browser/brave_wallet_utils_unittest.cc +++ b/components/brave_wallet/browser/brave_wallet_utils_unittest.cc @@ -262,6 +262,160 @@ TEST(BraveWalletUtilsUnitTest, TransactionReceiptAndValue) { EXPECT_EQ(tx_receipt, *tx_receipt_from_value); } +TEST(BraveWalletUtilsUnitTest, SwapInfoToValue_Basic) { + auto swap_info = mojom::SwapInfo::New(); + swap_info->source_coin = mojom::CoinType::ETH; + swap_info->source_chain_id = mojom::kMainnetChainId; + swap_info->source_token_address = + "0x0D8775F648430679A709E98d2b0Cb6250d2887EF"; + swap_info->source_amount = "1000000000000000000"; + swap_info->destination_coin = mojom::CoinType::ETH; + swap_info->destination_chain_id = mojom::kMainnetChainId; + swap_info->destination_token_address = + "0xdAC17F958D2ee523a2206206994597C13D831ec7"; + swap_info->destination_amount = "2000000"; + swap_info->destination_amount_min = "1950000"; + swap_info->recipient = "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"; + swap_info->provider = mojom::SwapProvider::kZeroEx; + + base::Value::Dict value = SwapInfoToValue(swap_info); + + // Verify all fields are correctly serialized + EXPECT_EQ(*value.FindString("source_coin"), "ETH"); + EXPECT_EQ(*value.FindString("source_chain_id"), mojom::kMainnetChainId); + EXPECT_EQ(*value.FindString("source_token_address"), + "0x0D8775F648430679A709E98d2b0Cb6250d2887EF"); + EXPECT_EQ(*value.FindString("source_amount"), "1000000000000000000"); + EXPECT_EQ(*value.FindString("destination_coin"), "ETH"); + EXPECT_EQ(*value.FindString("destination_chain_id"), mojom::kMainnetChainId); + EXPECT_EQ(*value.FindString("destination_token_address"), + "0xdAC17F958D2ee523a2206206994597C13D831ec7"); + EXPECT_EQ(*value.FindString("destination_amount"), "2000000"); + EXPECT_EQ(*value.FindString("destination_amount_min"), "1950000"); + EXPECT_EQ(*value.FindString("recipient"), + "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"); + EXPECT_EQ(*value.FindString("provider"), "ZERO_EX"); +} + +TEST(BraveWalletUtilsUnitTest, SwapInfoToValueAndBack_RoundTrip) { + auto swap_info = mojom::SwapInfo::New(); + swap_info->source_coin = mojom::CoinType::SOL; + swap_info->source_chain_id = mojom::kSolanaMainnet; + swap_info->source_token_address = + "So11111111111111111111111111111111111111112"; + swap_info->source_amount = "1000000000"; + swap_info->destination_coin = mojom::CoinType::SOL; + swap_info->destination_chain_id = mojom::kSolanaMainnet; + swap_info->destination_token_address = + "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; + swap_info->destination_amount = "50000000"; + swap_info->destination_amount_min = "49000000"; + swap_info->recipient = "5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9"; + swap_info->provider = mojom::SwapProvider::kJupiter; + + base::Value::Dict value = SwapInfoToValue(swap_info); + auto swap_info_from_value = ValueToSwapInfo(value); + + ASSERT_TRUE(swap_info_from_value); + EXPECT_EQ(swap_info, swap_info_from_value); +} + +TEST(BraveWalletUtilsUnitTest, SwapInfoToValue_NullPtr) { + mojom::SwapInfoPtr null_swap_info; + base::Value::Dict value = SwapInfoToValue(null_swap_info); + EXPECT_TRUE(value.empty()); +} + +TEST(BraveWalletUtilsUnitTest, SwapInfoToValue_DifferentProviders) { + std::vector providers = { + mojom::SwapProvider::kAuto, mojom::SwapProvider::kLiFi, + mojom::SwapProvider::kZeroEx, mojom::SwapProvider::kJupiter, + mojom::SwapProvider::kSquid, mojom::SwapProvider::kNearIntents, + }; + + for (auto provider : providers) { + auto swap_info = mojom::SwapInfo::New(); + swap_info->source_coin = mojom::CoinType::ETH; + swap_info->source_chain_id = mojom::kMainnetChainId; + swap_info->source_token_address = ""; + swap_info->source_amount = "1000000000000000000"; + swap_info->destination_coin = mojom::CoinType::ETH; + swap_info->destination_chain_id = mojom::kMainnetChainId; + swap_info->destination_token_address = ""; + swap_info->destination_amount = "2000000000000000000"; + swap_info->destination_amount_min = ""; + swap_info->recipient = "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"; + swap_info->provider = provider; + + base::Value::Dict value = SwapInfoToValue(swap_info); + auto swap_info_from_value = ValueToSwapInfo(value); + + ASSERT_TRUE(swap_info_from_value); + EXPECT_EQ(swap_info->provider, swap_info_from_value->provider); + } +} + +TEST(BraveWalletUtilsUnitTest, ValueToSwapInfo_InvalidCoin) { + base::Value::Dict value; + value.Set("source_coin", "INVALID_COIN"); + value.Set("source_chain_id", mojom::kMainnetChainId); + value.Set("source_token_address", ""); + value.Set("source_amount", "1000000000000000000"); + value.Set("destination_coin", "ETH"); + value.Set("destination_chain_id", mojom::kMainnetChainId); + value.Set("destination_token_address", ""); + value.Set("destination_amount", "2000000000000000000"); + value.Set("recipient", "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"); + value.Set("provider", "AUTO"); + + auto swap_info = ValueToSwapInfo(value); + EXPECT_FALSE(swap_info); + + value.Set("source_coin", "ETH"); + swap_info = ValueToSwapInfo(value); + EXPECT_TRUE(swap_info); + + value.Set("destination_coin", "INVALID_COIN"); + swap_info = ValueToSwapInfo(value); + EXPECT_FALSE(swap_info); +} + +TEST(BraveWalletUtilsUnitTest, ValueToSwapInfo_MissingRequiredFields) { + // All required fields for mojom::SwapInfo + const char* required_fields[] = {"source_coin", + "source_chain_id", + "source_token_address", + "source_amount", + "destination_coin", + "destination_chain_id", + "destination_token_address", + "destination_amount", + "recipient", + "provider"}; + + base::Value::Dict base_value; + base_value.Set("source_coin", "ETH"); + base_value.Set("source_chain_id", mojom::kMainnetChainId); + base_value.Set("source_token_address", ""); + base_value.Set("source_amount", "1000000000000000000"); + base_value.Set("destination_coin", "ETH"); + base_value.Set("destination_chain_id", mojom::kMainnetChainId); + base_value.Set("destination_token_address", ""); + base_value.Set("destination_amount", "2000000000000000000"); + base_value.Set("recipient", "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"); + base_value.Set("provider", "AUTO"); + + // The valid dict should be accepted + EXPECT_TRUE(ValueToSwapInfo(base_value)); + + for (const auto* field : required_fields) { + base::Value::Dict value = base_value.Clone(); + value.Remove(field); + auto swap_info = ValueToSwapInfo(value); + EXPECT_FALSE(swap_info) << "Field missing: " << field; + } +} + TEST(BraveWalletUtilsTest, IsEndpointUsingBraveWalletProxy) { // Test with valid URLs that should match the proxy domains EXPECT_TRUE(IsEndpointUsingBraveWalletProxy( diff --git a/components/brave_wallet/browser/eth_data_parser.cc b/components/brave_wallet/browser/eth_data_parser.cc index 1c505c3e249..a2284bc2b26 100644 --- a/components/brave_wallet/browser/eth_data_parser.cc +++ b/components/brave_wallet/browser/eth_data_parser.cc @@ -527,10 +527,10 @@ std::optional LiFiBridgeDataDecode( } // namespace -std::optional, // tx_params - std::vector, // tx_args - mojom::SwapInfoPtr>> // swap_info +std::optional, // tx_params + std::vector, // tx_args + mojom::SwapInfoDeprecatedPtr>> // swap_info GetTransactionInfoFromData(const std::vector& data) { if (data.empty() || data == std::vector{0x0}) { return std::make_tuple(mojom::TransactionType::ETHSend, @@ -664,7 +664,7 @@ GetTransactionInfoFromData(const std::vector& data) { auto from_asset = decoded_path->front(); auto to_asset = decoded_path->back(); - auto swap_info = mojom::SwapInfo::New(); + auto swap_info = mojom::SwapInfoDeprecated::New(); swap_info->from_coin = mojom::CoinType::ETH; // from_chain_id and to_chain_id are filled by caller. swap_info->from_asset = kNativeEVMAssetContractAddress; @@ -723,7 +723,7 @@ GetTransactionInfoFromData(const std::vector& data) { auto from_asset = decoded_path->front(); auto to_asset = decoded_path->back(); - auto swap_info = mojom::SwapInfo::New(); + auto swap_info = mojom::SwapInfoDeprecated::New(); // from_chain_id and to_chain_id are filled by caller. swap_info->from_coin = mojom::CoinType::ETH; swap_info->from_asset = from_asset; @@ -774,7 +774,7 @@ GetTransactionInfoFromData(const std::vector& data) { return std::nullopt; } - auto swap_info = mojom::SwapInfo::New(); + auto swap_info = mojom::SwapInfoDeprecated::New(); // from_chain_id and to_chain_id are filled by caller. swap_info->from_coin = mojom::CoinType::ETH; swap_info->from_asset = from_asset.GetString(); @@ -816,7 +816,7 @@ GetTransactionInfoFromData(const std::vector& data) { return std::nullopt; } - auto swap_info = mojom::SwapInfo::New(); + auto swap_info = mojom::SwapInfoDeprecated::New(); // from_chain_id and to_chain_id are filled by caller. swap_info->from_coin = mojom::CoinType::ETH; swap_info->from_asset = decoded_calldata.value()[0].GetString(); @@ -913,7 +913,7 @@ GetTransactionInfoFromData(const std::vector& data) { } std::vector tx_args; - auto swap_info = mojom::SwapInfo::New(); + auto swap_info = mojom::SwapInfoDeprecated::New(); if (selector == kFillOtcOrderForEthSelector) { // The output of the swap is actually WETH but fillOtcOrderForEth() @@ -987,7 +987,7 @@ GetTransactionInfoFromData(const std::vector& data) { return std::nullopt; } - auto swap_info = mojom::SwapInfo::New(); + auto swap_info = mojom::SwapInfoDeprecated::New(); // from_chain_id and to_chain_id are filled by caller. swap_info->from_coin = mojom::CoinType::ETH; swap_info->from_asset = kNativeEVMAssetContractAddress; @@ -1052,7 +1052,7 @@ GetTransactionInfoFromData(const std::vector& data) { return std::nullopt; } - auto swap_info = mojom::SwapInfo::New(); + auto swap_info = mojom::SwapInfoDeprecated::New(); // from_chain_id and to_chain_id are filled by caller. swap_info->from_coin = mojom::CoinType::ETH; swap_info->from_asset = swap_data->sending_asset_id; @@ -1117,7 +1117,7 @@ GetTransactionInfoFromData(const std::vector& data) { return std::nullopt; } - auto swap_info = mojom::SwapInfo::New(); + auto swap_info = mojom::SwapInfoDeprecated::New(); // from_chain_id and to_chain_id are filled by caller. swap_info->from_coin = mojom::CoinType::ETH; swap_info->from_asset = swap_data->sending_asset_id; @@ -1196,7 +1196,7 @@ GetTransactionInfoFromData(const std::vector& data) { return std::nullopt; } - auto swap_info = mojom::SwapInfo::New(); + auto swap_info = mojom::SwapInfoDeprecated::New(); swap_info->from_coin = mojom::CoinType::ETH; // from_chain_id is filled in by the caller. swap_info->from_asset = swap_data->sending_asset_id; @@ -1260,7 +1260,7 @@ GetTransactionInfoFromData(const std::vector& data) { return std::nullopt; } - auto swap_info = mojom::SwapInfo::New(); + auto swap_info = mojom::SwapInfoDeprecated::New(); swap_info->from_coin = mojom::CoinType::ETH; // from_chain_id is filled in by the caller. swap_info->from_asset = bridge_data->sending_asset_id; @@ -1312,7 +1312,7 @@ GetTransactionInfoFromData(const std::vector& data) { return std::nullopt; } - auto swap_info = mojom::SwapInfo::New(); + auto swap_info = mojom::SwapInfoDeprecated::New(); swap_info->from_coin = mojom::CoinType::ETH; // from_chain_id and to_chain_id are filled by caller. swap_info->from_asset = decoded.value()[0].GetString(); diff --git a/components/brave_wallet/browser/eth_data_parser.h b/components/brave_wallet/browser/eth_data_parser.h index abfdf3615f2..7a3ab4373ab 100644 --- a/components/brave_wallet/browser/eth_data_parser.h +++ b/components/brave_wallet/browser/eth_data_parser.h @@ -15,10 +15,10 @@ namespace brave_wallet { -std::optional, // tx_params - std::vector, // tx_args - mojom::SwapInfoPtr>> // swap_info +std::optional, // tx_params + std::vector, // tx_args + mojom::SwapInfoDeprecatedPtr>> // swap_info GetTransactionInfoFromData(const std::vector& data); } // namespace brave_wallet diff --git a/components/brave_wallet/browser/eth_data_parser_unittest.cc b/components/brave_wallet/browser/eth_data_parser_unittest.cc index ebb212b1748..34fdf35cd8a 100644 --- a/components/brave_wallet/browser/eth_data_parser_unittest.cc +++ b/components/brave_wallet/browser/eth_data_parser_unittest.cc @@ -22,11 +22,11 @@ void TestGetTransactionInfoFromData( mojom::TransactionType expected_tx_type, std::vector expected_tx_params, std::vector expected_tx_args, - mojom::SwapInfoPtr expected_swap_info = nullptr) { + mojom::SwapInfoDeprecatedPtr expected_swap_info = nullptr) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; auto result = GetTransactionInfoFromData(data); ASSERT_NE(result, std::nullopt); @@ -50,7 +50,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataTransfer) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // OK: well-formed ERC20Transfer @@ -114,7 +114,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataApprove) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // OK: well-formed ERC20Approve @@ -196,7 +196,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataETHSend) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; ASSERT_TRUE(PrefixedHexStringToBytes("0x0", &data)); @@ -222,7 +222,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataERC721TransferFrom) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // OK: well-formed ERC721TransferFrom @@ -433,7 +433,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataOther) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; @@ -459,7 +459,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataSellEthForTokenToUniswapV3) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // TXN: WETH → STG @@ -514,7 +514,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataSellTokenForEthToUniswapV3) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // TXN: RSS3 → USDC → WETH @@ -574,7 +574,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataSellTokenForTokenToUniswapV3) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // TXN: COW → WETH → USDC @@ -634,7 +634,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataSellToUniswap) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // TXN: USDC → WETH → LDO @@ -693,7 +693,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataTransformERC20) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // TXN: ETH → DAI @@ -810,7 +810,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataFillOtcOrderForETH) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // TXN: USDC → ETH @@ -899,7 +899,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataFillOtcOrderWithETH) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // TXN: ETH → USDC @@ -983,7 +983,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataFillOtcOrder) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // TXN: USDC → USDT @@ -1072,7 +1072,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataCowOrderSellEth) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // TXN: XDAI → USDC @@ -1142,7 +1142,7 @@ TEST(EthDataParser, GetTransactionInfoFromFilForward) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; ASSERT_TRUE( @@ -1170,7 +1170,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataLiFiSwapTokensGeneric) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // TXN: token → token @@ -1394,7 +1394,7 @@ TEST(EthDataParser, mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // TXN: ETH → token @@ -1505,7 +1505,7 @@ TEST(EthDataParser, mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // TXN: token → ETH @@ -1612,7 +1612,7 @@ TEST(EthDataParser, mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // TXN: token → token @@ -1723,7 +1723,7 @@ TEST( mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // Function: @@ -1892,7 +1892,7 @@ TEST(EthDataParser, mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // Function: @@ -2076,7 +2076,7 @@ TEST(EthDataParser, mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // Function: @@ -2162,7 +2162,7 @@ TEST(EthDataParser, GetTransactionInfoFromDataLiFiStartBridgeTokensViaMayan) { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // Function: @@ -2284,7 +2284,7 @@ TEST(EthDataParser, mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // Function: @@ -2474,7 +2474,7 @@ TEST( mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // Function: @@ -2648,7 +2648,7 @@ TEST( mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // Function: @@ -2902,7 +2902,7 @@ TEST(EthDataParser, mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // Function: @@ -3057,7 +3057,7 @@ TEST(EthDataParser, mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data; // Function: diff --git a/components/brave_wallet/browser/eth_tx_manager_unittest.cc b/components/brave_wallet/browser/eth_tx_manager_unittest.cc index c7dea72db79..c9353021e6a 100644 --- a/components/brave_wallet/browser/eth_tx_manager_unittest.cc +++ b/components/brave_wallet/browser/eth_tx_manager_unittest.cc @@ -443,7 +443,7 @@ class EthTxManagerUnitTest : public testing::Test { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; auto tx_info = GetTransactionInfoFromData(data); ASSERT_NE(tx_info, std::nullopt); diff --git a/components/brave_wallet/browser/eth_tx_meta.cc b/components/brave_wallet/browser/eth_tx_meta.cc index 91c35bfb43e..0c004a91004 100644 --- a/components/brave_wallet/browser/eth_tx_meta.cc +++ b/components/brave_wallet/browser/eth_tx_meta.cc @@ -117,7 +117,7 @@ mojom::TransactionInfoPtr EthTxMeta::ToTransactionInfo() const { mojom::TransactionType tx_type; std::vector tx_params; std::vector tx_args; - mojom::SwapInfoPtr swap_info; + mojom::SwapInfoDeprecatedPtr swap_info; std::vector data{0x0}; if (tx_->data().size() > 0) { data = tx_->data(); diff --git a/components/brave_wallet/common/brave_wallet.mojom b/components/brave_wallet/common/brave_wallet.mojom index d8a510968a7..10c795ba26e 100644 --- a/components/brave_wallet/common/brave_wallet.mojom +++ b/components/brave_wallet/common/brave_wallet.mojom @@ -2619,6 +2619,27 @@ union TxDataUnion { }; struct SwapInfo { + CoinType source_coin; + string source_chain_id; + string source_token_address; + string source_amount; + + CoinType destination_coin; + string destination_chain_id; + // An empty string indicates that the asset could not be reliably determined. + string destination_token_address; + // An empty string indicates that the amount could not be reliably determined. + string destination_amount; + // Populated for EXACT_INPUT swaps + string destination_amount_min; + + // An empty string indicates that the recipient is not known. + string recipient; + SwapProvider provider; +}; + +// Deprecated in favour of SwapInfo +struct SwapInfoDeprecated { CoinType from_coin; string from_chain_id; string from_asset; @@ -2660,7 +2681,7 @@ struct TransactionInfo { string? effective_recipient; bool is_retriable; - SwapInfo? swap_info; + SwapInfoDeprecated? swap_info_deprecated; }; interface TxServiceObserver { diff --git a/components/brave_wallet_ui/common/constants/mocks.ts b/components/brave_wallet_ui/common/constants/mocks.ts index 22e18ad8684..130218ef9f2 100644 --- a/components/brave_wallet_ui/common/constants/mocks.ts +++ b/components/brave_wallet_ui/common/constants/mocks.ts @@ -90,7 +90,7 @@ export const getMockedTransactionInfo = }, effectiveRecipient: '0x8b52c24d6e2600bdb8dbb6e8da849ed38ab7e81f', isRetriable: false, - swapInfo: undefined, + swapInfoDeprecated: undefined, } } @@ -544,7 +544,7 @@ SerializableTransactionInfo = { }, effectiveRecipient: undefined, isRetriable: false, - swapInfo: undefined, + swapInfoDeprecated: undefined, } export const mockSolDappSignAllTransactionsRequest: // diff --git a/components/brave_wallet_ui/common/hooks/use-swap-tx-parser.ts b/components/brave_wallet_ui/common/hooks/use-swap-tx-parser.ts index 7eed90e0ba0..7eefcee7d09 100644 --- a/components/brave_wallet_ui/common/hooks/use-swap-tx-parser.ts +++ b/components/brave_wallet_ui/common/hooks/use-swap-tx-parser.ts @@ -21,30 +21,32 @@ export const useSwapTransactionParser = < T extends | Pick< SerializableTransactionInfo | BraveWallet.TransactionInfo, - 'chainId' | 'txType' | 'txDataUnion' | 'swapInfo' + 'chainId' | 'txType' | 'txDataUnion' | 'swapInfoDeprecated' > | undefined, >( transaction: T, ) => { const { data: sellNetwork } = useGetNetworkQuery( - transaction?.swapInfo?.fromAsset === NATIVE_EVM_ASSET_CONTRACT_ADDRESS + transaction?.swapInfoDeprecated?.fromAsset + === NATIVE_EVM_ASSET_CONTRACT_ADDRESS ? { - chainId: transaction?.swapInfo.fromChainId, - coin: transaction?.swapInfo.fromCoin, + chainId: transaction?.swapInfoDeprecated.fromChainId, + coin: transaction?.swapInfoDeprecated.fromCoin, } : skipToken, ) const { tokenInfo: sellTokenInfo } = useGetTokenInfo( - transaction?.swapInfo - && transaction.swapInfo.fromAsset - && transaction.swapInfo.fromAsset !== NATIVE_EVM_ASSET_CONTRACT_ADDRESS + transaction?.swapInfoDeprecated + && transaction.swapInfoDeprecated.fromAsset + && transaction.swapInfoDeprecated.fromAsset + !== NATIVE_EVM_ASSET_CONTRACT_ADDRESS ? { - contractAddress: transaction.swapInfo.fromAsset, + contractAddress: transaction.swapInfoDeprecated.fromAsset, network: { - chainId: transaction.swapInfo.fromChainId, - coin: transaction.swapInfo.fromCoin, + chainId: transaction.swapInfoDeprecated.fromChainId, + coin: transaction.swapInfoDeprecated.fromCoin, }, } : skipToken, @@ -59,23 +61,25 @@ export const useSwapTransactionParser = < }, [sellTokenInfo, sellNetwork]) const { data: buyNetwork } = useGetNetworkQuery( - transaction?.swapInfo?.toAsset === NATIVE_EVM_ASSET_CONTRACT_ADDRESS + transaction?.swapInfoDeprecated?.toAsset + === NATIVE_EVM_ASSET_CONTRACT_ADDRESS ? { - chainId: transaction?.swapInfo.toChainId, - coin: transaction?.swapInfo.toCoin, + chainId: transaction?.swapInfoDeprecated.toChainId, + coin: transaction?.swapInfoDeprecated.toCoin, } : skipToken, ) const { tokenInfo: buyTokenInfo } = useGetTokenInfo( - transaction?.swapInfo - && transaction.swapInfo.toAsset - && transaction.swapInfo.toAsset !== NATIVE_EVM_ASSET_CONTRACT_ADDRESS + transaction?.swapInfoDeprecated + && transaction.swapInfoDeprecated.toAsset + && transaction.swapInfoDeprecated.toAsset + !== NATIVE_EVM_ASSET_CONTRACT_ADDRESS ? { - contractAddress: transaction.swapInfo.toAsset, + contractAddress: transaction.swapInfoDeprecated.toAsset, network: { - chainId: transaction.swapInfo.toChainId, - coin: transaction.swapInfo.toCoin, + chainId: transaction.swapInfoDeprecated.toChainId, + coin: transaction.swapInfoDeprecated.toCoin, }, } : skipToken, @@ -89,9 +93,11 @@ export const useSwapTransactionParser = < return buyTokenInfo }, [buyTokenInfo, buyNetwork]) - const sellAmountWei = new Amount(transaction?.swapInfo?.fromAmount || '') - const buyAmountWei = transaction?.swapInfo?.toAmount - ? new Amount(transaction.swapInfo.toAmount) + const sellAmountWei = new Amount( + transaction?.swapInfoDeprecated?.fromAmount || '', + ) + const buyAmountWei = transaction?.swapInfoDeprecated?.toAmount + ? new Amount(transaction.swapInfoDeprecated.toAmount) : sellAmountWei return { @@ -99,7 +105,7 @@ export const useSwapTransactionParser = < sellAmountWei, buyToken, buyAmountWei, - receiver: transaction?.swapInfo?.receiver || '', - provider: transaction?.swapInfo?.provider, + receiver: transaction?.swapInfoDeprecated?.receiver || '', + provider: transaction?.swapInfoDeprecated?.provider, } } diff --git a/components/brave_wallet_ui/components/desktop/popup-modals/transaction_details_modal/transaction_details_modal.tsx b/components/brave_wallet_ui/components/desktop/popup-modals/transaction_details_modal/transaction_details_modal.tsx index 9d66680550d..c3b28b049a5 100644 --- a/components/brave_wallet_ui/components/desktop/popup-modals/transaction_details_modal/transaction_details_modal.tsx +++ b/components/brave_wallet_ui/components/desktop/popup-modals/transaction_details_modal/transaction_details_modal.tsx @@ -191,11 +191,11 @@ export const TransactionDetailsModal = ({ onClose, transaction }: Props) => { const { data: toNetwork } = useGetNetworkQuery( isBridgeTx - && transaction.swapInfo?.toChainId - && transaction.swapInfo.toCoin !== undefined + && transaction.swapInfoDeprecated?.toChainId + && transaction.swapInfoDeprecated.toCoin !== undefined ? { - chainId: transaction.swapInfo.toChainId, - coin: transaction.swapInfo.toCoin, + chainId: transaction.swapInfoDeprecated.toChainId, + coin: transaction.swapInfoDeprecated.toCoin, } : skipToken, ) @@ -644,7 +644,9 @@ export const TransactionDetailsModal = ({ onClose, transaction }: Props) => {