From 848e38c9f765779b2d3d1dcf7650851810cab446 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Mon, 23 Jan 2023 17:09:53 +0100 Subject: [PATCH 01/36] Add required strings to android_brave_strings.grd --- .../ui/android/strings/android_brave_strings.grd | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd index c17652ccbdfe..51ec34698627 100644 --- a/browser/ui/android/strings/android_brave_strings.grd +++ b/browser/ui/android/strings/android_brave_strings.grd @@ -2041,7 +2041,7 @@ Are you sure you want to do this? Balance: - Continue to Ramp + Select purchase method Brave Wallet @@ -2091,6 +2091,18 @@ Are you sure you want to do this? Yes + + Select one of the following options + + + Buy crypto with Visa or Mastercard. + + + Ramp.Network + + + Buy with Ramp + Clear transaction & nonce info From bcec462531e5b196c4636dae3a9083ec0fb3588e Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Thu, 26 Jan 2023 11:16:08 +0100 Subject: [PATCH 02/36] Implement new purchase method screen Implements new screen to select a purchase method containing Ramp.Network link. --- android/brave_java_resources.gni | 2 + android/brave_java_sources.gni | 1 + android/java/AndroidManifest.xml | 5 + .../activities/BuySendSwapActivity.java | 5 +- .../SelectPurchaseMethodActivity.java | 57 +++++++++ android/java/res/drawable-nodpi/ramp.png | Bin 0 -> 2062 bytes .../activity_select_purchase_method.xml | 121 ++++++++++++++++++ 7 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java create mode 100644 android/java/res/drawable-nodpi/ramp.png create mode 100644 android/java/res/layout/activity_select_purchase_method.xml diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index 6ba0c11eabe3..bf933dac29f3 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -175,6 +175,7 @@ brave_java_resources = [ "java/res/drawable-nodpi/ic_quick_action_search_and_bookmark_widget_preview.png", "java/res/drawable-nodpi/loader0.png", "java/res/drawable-nodpi/loader0_orange.png", + "java/res/drawable-nodpi/ramp.png", "java/res/drawable-xhdpi/bat_logo.png", "java/res/drawable-xhdpi/bat_unverified.png", "java/res/drawable-xhdpi/bat_verified.png", @@ -769,6 +770,7 @@ brave_java_resources = [ "java/res/layout/activity_network_selector.xml", "java/res/layout/activity_nft_detail.xml", "java/res/layout/activity_onboarding.xml", + "java/res/layout/activity_select_purchase_method.xml", "java/res/layout/activity_split_tunnel.xml", "java/res/layout/activity_welcome_onboarding.xml", "java/res/layout/application_item_layout.xml", diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index d41786059963..3e9418efb241 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -92,6 +92,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/NetworkSelectorActivity.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/NftDetailActivity.java", + "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/AccountSpinnerAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/ApproveTxFragmentPageAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/CreateAccountAdapter.java", diff --git a/android/java/AndroidManifest.xml b/android/java/AndroidManifest.xml index dd300b5c4bc8..6274cbd0a5a2 100644 --- a/android/java/AndroidManifest.xml +++ b/android/java/AndroidManifest.xml @@ -86,6 +86,11 @@ android:screenOrientation="sensorPortrait" tools:ignore="LockedOrientationActivity"/> + + { + TabUtils.openUrlInNewTab(false, mRampNetworkUrl); + TabUtils.bringChromeTabbedActivityToTheTop(this); + }); + } + + onInitialLayoutInflationComplete(); + } + + public static Intent getIntent(Context context, String rampNetworkUrl) { + Intent intent = new Intent(context, SelectPurchaseMethodActivity.class); + intent.putExtra(RAMP_NETWORK_URL, rampNetworkUrl); + intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); + return intent; + } +} diff --git a/android/java/res/drawable-nodpi/ramp.png b/android/java/res/drawable-nodpi/ramp.png new file mode 100644 index 0000000000000000000000000000000000000000..0e258349736b4c301668ac05788ef151d26b7b05 GIT binary patch literal 2062 zcmV+p2=VucP)xhY@MK1lG$}Qt%_Q=q$T%sG@(D}}W_+Z_mN6+(aqgH&3<8>ToM(X6<_knh z6G(+2HRSjNC>fk&BI!2oolcBopYHbVcAo_N8Z_o)o%GZGd++U905hlCTN?_Xi4Us) z;y^-h^I7A%2Xn$=^PHmsxq%OB0Lm9iZ6Dsg?*StvVB~cB%2gC{4IfsbAAPJqtbFJ! z!^_==zrc(+wZ3{4lxWd?4SymkAjC@f%g>*v?-i}6#+Wo%*uSVl+4I11#F-}vDGm?$@$ zS~=)H&hQlX?^}1b!6FhYl2r&HAZS1xcZ>OZ#q>O^iYVXLJkBd=kV6OU9f zZz=de*6;(((nlxZV~c5+Y%wN;jMJ0BQm=L2=oo0Ur9?uq_R)#I(qxMv8c3UI2sbxHS%j=so<$%EE6PyoZCbTxfJ#UM4Y_ zq%aHFMInyv^_V=ngU>m7{nW+hJd4RR&~pjFIQ|m@LWrr0PmJ`^_12@&cwe>Npud;p zIoeX_jdKZ6BB<+Lo*-nzR52&;8w?y`1k@KVoxh`dy;k?7@x~3Iu)7JgV_g~VE4C}E zG@Z(SLGQ7}h2?87-|rpXzIQS0y402u<<%Xqj#VKT13K9J=Gy*^k*3E?bmT)2^T zU80mcNveEU7cwGN%)c$qXA`4TGc3?ZU~2dE777_Bwkxv{MNVL9S~*qY zU~716ixorBUW)pHwczRmv0{!%c}Ikdm`gDeW6H34kwplFPc~;PgoqtuD3ch-U=w(7 zkEWGhOQF0vzVQ|?5XG}RoogAU<5LFz`yO^9H-Ukp`TkH!wY{}cu+SmPE%+En_jIo0 zTOY-X!SINS|Ky7FW`)F@YOb!(V-ZDssnCI={{$hxdtTp3T|hAk8Rys-v$($6!u!|& z9=bglG$iJ~Y5C70ga{NoNV}%mzU<6ENchtD1)T_o45VPI)^qHAZ!JqK%QjxTA2UrQJX;b#lol>ZTEO9S>?|;W zbN@A+!aDz(9fw!U@fciGm2w7{=wW_`f}`O&#c%xB!3ACFG}RE;XTG|sb0MFY_@Jl^ z`fE(VN$j?Qi@lZ?4kZ(@FPe%95ZW2CB1j3&vokwdA9(fWEf3c>mS$w}LTH6e3p!wc zgp6-?JriEXfrPvLLK(AB(7D z*|lZ9E1ORt#MC5LwSC1EptSn_f@Io*Vy4B!3t>)j#R?%33n$)AG4m~iNUdghyTr`D z5JIcO$nNZC0{qZESQ=kZCz0*GW-o;DGl#eCrk3Gq72`23U1&Ft7UpY4;RhCe$}Ud{isY z&k(>=wXjT9lj&ln3purM;SPro9FL!z5DS^2C7Gn)n+q#YfTu9p$t)&ZUxoP(yie#% z6B1S_D&>G>NJv?h>sGfyj0m?xfaIya1?4_(TsO9ujj9t}u#O6=E-AnW8OgQhaoA!4 zo-$7mE^P(^1H1`Bh+HjY#IWc>vP>sYPJ^P^kdybDt92QG_5>n7#e@)rb_Y{`&DCOX zno)-WppZIPr??QJ@IHDjF(rH{D1cJRa(2~>5W>ib6OkCoURrwN$}f8O=X<5H2li%- zT~k5`V`sAr)5_s=*{~QDwZvi!HwP`8wa}uwqckoUqR>DehuMR3vh7{b!Tixu3rnLk zt|^Qk!ZvI%%0R`sc_DX5U= z(8BbrO(6ue7%HZQ9AhBPTUJ3)jawBEW5jkLYspkFWZP-GcF+`qFr0MQQXw5p$S+{@b2#Z+Nn5SW0G+Csv5;@`i-5mQ?#wnfAsr7Y5CI^ zLW!gjRTd!x+gbNXVxsfBuE7i;F$u>`u?Znq|0={#%<>Bn{uvBW!Paq50`>hLIQGCC sK<9x)Ev5?LUxpAq4(c?9uzq3w2b-O-{xaZbQvd(}07*qoM6N<$f)%jG!T + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 52ec63aa933b93d81401b2d902fd4f9022124f6b Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Thu, 26 Jan 2023 13:28:40 +0100 Subject: [PATCH 03/36] Apply formatting --- .../crypto_wallet/activities/SelectPurchaseMethodActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java index dbb7f9810f39..806d3c7cea15 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java @@ -31,7 +31,7 @@ protected void triggerLayoutInflation() { if (intent != null) { mRampNetworkUrl = intent.getStringExtra(RAMP_NETWORK_URL); } - + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); From 25daffa433b47f71306233f7e78261dee355eb28 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Thu, 26 Jan 2023 18:21:48 +0100 Subject: [PATCH 04/36] Convert Ramp logo to a vector image --- android/brave_java_resources.gni | 2 +- android/java/res/drawable-nodpi/ramp.png | Bin 2062 -> 0 bytes android/java/res/drawable/ramp.xml | 20 ++++++++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) delete mode 100644 android/java/res/drawable-nodpi/ramp.png create mode 100644 android/java/res/drawable/ramp.xml diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index bf933dac29f3..7bdbbcdb465c 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -175,7 +175,6 @@ brave_java_resources = [ "java/res/drawable-nodpi/ic_quick_action_search_and_bookmark_widget_preview.png", "java/res/drawable-nodpi/loader0.png", "java/res/drawable-nodpi/loader0_orange.png", - "java/res/drawable-nodpi/ramp.png", "java/res/drawable-xhdpi/bat_logo.png", "java/res/drawable-xhdpi/bat_unverified.png", "java/res/drawable-xhdpi/bat_verified.png", @@ -693,6 +692,7 @@ brave_java_resources = [ "java/res/drawable/radio_button_holo_bg.xml", "java/res/drawable/radio_button_selected_bg.xml", "java/res/drawable/radiobutton_background.xml", + "java/res/drawable/ramp.xml", "java/res/drawable/rating_bottomsheet_background.xml", "java/res/drawable/rating_news_button_background.xml", "java/res/drawable/recovery_phrase_bg.xml", diff --git a/android/java/res/drawable-nodpi/ramp.png b/android/java/res/drawable-nodpi/ramp.png deleted file mode 100644 index 0e258349736b4c301668ac05788ef151d26b7b05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2062 zcmV+p2=VucP)xhY@MK1lG$}Qt%_Q=q$T%sG@(D}}W_+Z_mN6+(aqgH&3<8>ToM(X6<_knh z6G(+2HRSjNC>fk&BI!2oolcBopYHbVcAo_N8Z_o)o%GZGd++U905hlCTN?_Xi4Us) z;y^-h^I7A%2Xn$=^PHmsxq%OB0Lm9iZ6Dsg?*StvVB~cB%2gC{4IfsbAAPJqtbFJ! z!^_==zrc(+wZ3{4lxWd?4SymkAjC@f%g>*v?-i}6#+Wo%*uSVl+4I11#F-}vDGm?$@$ zS~=)H&hQlX?^}1b!6FhYl2r&HAZS1xcZ>OZ#q>O^iYVXLJkBd=kV6OU9f zZz=de*6;(((nlxZV~c5+Y%wN;jMJ0BQm=L2=oo0Ur9?uq_R)#I(qxMv8c3UI2sbxHS%j=so<$%EE6PyoZCbTxfJ#UM4Y_ zq%aHFMInyv^_V=ngU>m7{nW+hJd4RR&~pjFIQ|m@LWrr0PmJ`^_12@&cwe>Npud;p zIoeX_jdKZ6BB<+Lo*-nzR52&;8w?y`1k@KVoxh`dy;k?7@x~3Iu)7JgV_g~VE4C}E zG@Z(SLGQ7}h2?87-|rpXzIQS0y402u<<%Xqj#VKT13K9J=Gy*^k*3E?bmT)2^T zU80mcNveEU7cwGN%)c$qXA`4TGc3?ZU~2dE777_Bwkxv{MNVL9S~*qY zU~716ixorBUW)pHwczRmv0{!%c}Ikdm`gDeW6H34kwplFPc~;PgoqtuD3ch-U=w(7 zkEWGhOQF0vzVQ|?5XG}RoogAU<5LFz`yO^9H-Ukp`TkH!wY{}cu+SmPE%+En_jIo0 zTOY-X!SINS|Ky7FW`)F@YOb!(V-ZDssnCI={{$hxdtTp3T|hAk8Rys-v$($6!u!|& z9=bglG$iJ~Y5C70ga{NoNV}%mzU<6ENchtD1)T_o45VPI)^qHAZ!JqK%QjxTA2UrQJX;b#lol>ZTEO9S>?|;W zbN@A+!aDz(9fw!U@fciGm2w7{=wW_`f}`O&#c%xB!3ACFG}RE;XTG|sb0MFY_@Jl^ z`fE(VN$j?Qi@lZ?4kZ(@FPe%95ZW2CB1j3&vokwdA9(fWEf3c>mS$w}LTH6e3p!wc zgp6-?JriEXfrPvLLK(AB(7D z*|lZ9E1ORt#MC5LwSC1EptSn_f@Io*Vy4B!3t>)j#R?%33n$)AG4m~iNUdghyTr`D z5JIcO$nNZC0{qZESQ=kZCz0*GW-o;DGl#eCrk3Gq72`23U1&Ft7UpY4;RhCe$}Ud{isY z&k(>=wXjT9lj&ln3purM;SPro9FL!z5DS^2C7Gn)n+q#YfTu9p$t)&ZUxoP(yie#% z6B1S_D&>G>NJv?h>sGfyj0m?xfaIya1?4_(TsO9ujj9t}u#O6=E-AnW8OgQhaoA!4 zo-$7mE^P(^1H1`Bh+HjY#IWc>vP>sYPJ^P^kdybDt92QG_5>n7#e@)rb_Y{`&DCOX zno)-WppZIPr??QJ@IHDjF(rH{D1cJRa(2~>5W>ib6OkCoURrwN$}f8O=X<5H2li%- zT~k5`V`sAr)5_s=*{~QDwZvi!HwP`8wa}uwqckoUqR>DehuMR3vh7{b!Tixu3rnLk zt|^Qk!ZvI%%0R`sc_DX5U= z(8BbrO(6ue7%HZQ9AhBPTUJ3)jawBEW5jkLYspkFWZP-GcF+`qFr0MQQXw5p$S+{@b2#Z+Nn5SW0G+Csv5;@`i-5mQ?#wnfAsr7Y5CI^ zLW!gjRTd!x+gbNXVxsfBuE7i;F$u>`u?Znq|0={#%<>Bn{uvBW!Paq50`>hLIQGCC sK<9x)Ev5?LUxpAq4(c?9uzq3w2b-O-{xaZbQvd(}07*qoM6N<$f)%jG!T + + + + + From 62aca263770d7a908eec9ee481b41b916c31562f Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Mon, 30 Jan 2023 13:57:44 +0100 Subject: [PATCH 05/36] Include Transak and Sardine network --- android/brave_java_resources.gni | 5 +- android/brave_java_sources.gni | 1 + .../browser/app/domain/CryptoModel.java | 6 + .../browser/app/domain/OnRampModel.java | 34 +++++ .../activities/BuySendSwapActivity.java | 13 +- .../SelectPurchaseMethodActivity.java | 75 ++++++++-- .../java/res/drawable-night/sardine_logo.xml | 9 ++ .../res/drawable/{ramp.xml => ramp_logo.xml} | 0 android/java/res/drawable/sardine_logo.xml | 14 ++ android/java/res/drawable/transak_logo.xml | 21 +++ .../activity_select_purchase_method.xml | 138 +++++++++++++++++- .../android/strings/android_brave_strings.grd | 19 ++- 12 files changed, 310 insertions(+), 25 deletions(-) create mode 100644 android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java create mode 100644 android/java/res/drawable-night/sardine_logo.xml rename android/java/res/drawable/{ramp.xml => ramp_logo.xml} (100%) create mode 100644 android/java/res/drawable/sardine_logo.xml create mode 100644 android/java/res/drawable/transak_logo.xml diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index 7bdbbcdb465c..01b09a3eae48 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -692,7 +692,7 @@ brave_java_resources = [ "java/res/drawable/radio_button_holo_bg.xml", "java/res/drawable/radio_button_selected_bg.xml", "java/res/drawable/radiobutton_background.xml", - "java/res/drawable/ramp.xml", + "java/res/drawable/ramp_logo.xml", "java/res/drawable/rating_bottomsheet_background.xml", "java/res/drawable/rating_news_button_background.xml", "java/res/drawable/recovery_phrase_bg.xml", @@ -721,6 +721,7 @@ brave_java_resources = [ "java/res/drawable/rounded_top_corners.xml", "java/res/drawable/rounded_wallet_edittext.xml", "java/res/drawable/rounded_white_holo_bg.xml", + "java/res/drawable/sardine_logo.xml", "java/res/drawable/selected_dot.xml", "java/res/drawable/selected_indicator.xml", "java/res/drawable/set_default_rounded_button_disabled.xml", @@ -732,6 +733,7 @@ brave_java_resources = [ "java/res/drawable/tab_selector.xml", "java/res/drawable/tip_amount.xml", "java/res/drawable/toggle_text_color_selector.xml", + "java/res/drawable/transak_logo.xml", "java/res/drawable/transparent_bg_bordered.xml", "java/res/drawable/twitter_button_background.xml", "java/res/drawable/unverified_48_rounded_bg.xml", @@ -744,6 +746,7 @@ brave_java_resources = [ "java/res/drawable/white_rounded_bg.xml", "java/res/drawable/white_rounded_holo_button_thin.xml", "java/res/drawable/yearly_selector.xml", + "java/res/drawable-night/sardine_logo.xml", "java/res/font/poppins_300.ttf", "java/res/font/poppins_400.ttf", "java/res/font/poppins_500.ttf", diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index 3e9418efb241..74d26040c47b 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -52,6 +52,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/app/domain/KeyringModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/NetworkModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/NetworkSelectorModel.java", + "../../brave/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/PortfolioModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/SendModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/SwapModel.java", diff --git a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java index 6d5b32bc78c1..db049b444be0 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java @@ -78,6 +78,7 @@ public class CryptoModel { private NetworkModel mNetworkModel; private PortfolioModel mPortfolioModel; + private OnRampModel mOnRampModel; // Todo: create method to create and return new models for Asset, Account, // TransactionConfirmation, SwapModel, AssetModel, SendModel @@ -107,6 +108,7 @@ public CryptoModel(Context context, TxService txService, KeyringService keyringS mPortfolioModel = new PortfolioModel(context, mTxService, mKeyringService, mBlockchainRegistry, mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, mBraveWalletService, mAssetRatioService, mSharedData); + mOnRampModel = new OnRampModel(mBlockchainRegistry); _mIsSwapEnabled = new MediatorLiveData<>(); mIsSwapEnabled = _mIsSwapEnabled; _mIsSwapEnabled.addSource(mNetworkModel.mChainId, chainId -> { @@ -273,6 +275,10 @@ public NetworkModel getNetworkModel() { return mNetworkModel; } + public OnRampModel getOnRampModel() { + return mOnRampModel; + } + public PortfolioModel getPortfolioModel() { return mPortfolioModel; } diff --git a/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java b/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java new file mode 100644 index 000000000000..8f578d726c51 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java @@ -0,0 +1,34 @@ +/* Copyright (c) 2023 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +package org.chromium.chrome.browser.app.domain; + +import android.text.TextUtils; + +import org.chromium.brave_wallet.mojom.BlockchainRegistry; +import org.chromium.brave_wallet.mojom.OnRampProvider; + +public class OnRampModel { + private final BlockchainRegistry mBlockchainRegistry; + + public OnRampModel(BlockchainRegistry blockchainRegistry) { + mBlockchainRegistry = blockchainRegistry; + } + + public void getBuyUrl(int onRampProvider, String chainId, String from, String rampNetworkSymbol, String amount, OnRampCallback callback) { + mBlockchainRegistry.getBuyUrl(OnRampProvider.RAMP, chainId, + from, rampNetworkSymbol, amount, (url, error) -> { + if (error != null && !error.isEmpty()) { + callback.OnUrlReady(null); + return; + } + callback.OnUrlReady(url); + }); + } + + public interface OnRampCallback { + void OnUrlReady(String url); + } +} diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java index bbbda7420b13..c50ea655f44b 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java @@ -971,19 +971,10 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { }); } } else if (mActivityType == ActivityType.BUY) { - assert mBlockchainRegistry != null; String symbol = AssetUtils.mapToRampNetworkSymbol(mCurrentBlockchainToken); - mBlockchainRegistry.getBuyUrl(OnRampProvider.RAMP, mCurrentBlockchainToken.chainId, - from, symbol, amount, (url, error) -> { - if (error != null && !error.isEmpty() && Utils.isDebuggable(this)) { - Log.e(TAG, "Could not get buy URL: " + error); - return; - } + Intent selectPurchaseMethodIntent = SelectPurchaseMethodActivity.getIntent(this, mCurrentBlockchainToken.chainId, from, symbol, amount); + startActivity(selectPurchaseMethodIntent); - Intent selectPurchaseMethodIntent = - SelectPurchaseMethodActivity.getIntent(this, url); - startActivity(selectPurchaseMethodIntent); - }); } else if (mActivityType == ActivityType.SWAP) { if (mCurrentBlockchainToken != null) { String btnText = mBtnBuySendSwap.getText().toString(); diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java index 806d3c7cea15..105b42224297 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java @@ -10,47 +10,104 @@ import android.content.Context; import android.content.Intent; import android.text.TextUtils; +import android.view.View; +import android.view.ViewGroup; import android.widget.Button; import androidx.appcompat.widget.Toolbar; +import org.chromium.brave_wallet.mojom.OnRampProvider; import org.chromium.chrome.R; +import org.chromium.chrome.browser.app.BraveActivity; +import org.chromium.chrome.browser.app.domain.OnRampModel; import org.chromium.chrome.browser.util.TabUtils; public class SelectPurchaseMethodActivity extends BraveWalletBaseActivity { - private static final String RAMP_NETWORK_URL = "rampNetworkUrl"; + private static final String CHAIN_ID = "chainId"; + private static final String FROM = "from"; + private static final String RAMP_NETWORK_SYMBOL = "rampNetworkSymbol"; + private static final String AMOUNT = "amount"; - private String mRampNetworkUrl; + private OnRampModel mOnRampModel; + + private String mChainId; + private String mFrom; + private String mRampNetworkSymbol; + private String mAmount; + + private ViewGroup mRampNetworkLayout; + private ViewGroup mSardineLayout; + private ViewGroup mTransakLayout; private Button mRampButton; + private Button mSardineButton; + private Button mTransakButton; @Override protected void triggerLayoutInflation() { setContentView(R.layout.activity_select_purchase_method); + BraveActivity activity = BraveActivity.getBraveActivity(); + if (activity != null) { + mOnRampModel = activity.getWalletModel().getCryptoModel().getOnRampModel(); + } + Intent intent = getIntent(); if (intent != null) { - mRampNetworkUrl = intent.getStringExtra(RAMP_NETWORK_URL); + mChainId = intent.getStringExtra(CHAIN_ID); + mFrom = intent.getStringExtra(FROM); + mRampNetworkSymbol = intent.getStringExtra(RAMP_NETWORK_SYMBOL); + mAmount = intent.getStringExtra(AMOUNT); } Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); + mRampNetworkLayout = findViewById(R.id.ramp_network_container); + mSardineLayout = findViewById(R.id.sardine_container); + mTransakLayout = findViewById(R.id.transak_container); + mRampButton = findViewById(R.id.purchase_method_btn_ramp); + mSardineButton = findViewById(R.id.purchase_method_btn_sardine); + mTransakButton = findViewById(R.id.purchase_method_btn_transak); - if (!TextUtils.isEmpty(mRampNetworkUrl)) { - mRampButton.setOnClickListener(v -> { - TabUtils.openUrlInNewTab(false, mRampNetworkUrl); - TabUtils.bringChromeTabbedActivityToTheTop(this); + if (mOnRampModel != null) { + mOnRampModel.getBuyUrl(OnRampProvider.RAMP, mChainId, mFrom, mRampNetworkSymbol, mAmount, url -> { + if (url != null) { + enableOnRampService(mRampNetworkLayout, mRampButton, url); + } + }); + + mOnRampModel.getBuyUrl(OnRampProvider.SARDINE, mChainId, mFrom, mRampNetworkSymbol, mAmount, url -> { + if (url != null) { + enableOnRampService(mSardineLayout, mSardineButton, url); + } + }); + + mOnRampModel.getBuyUrl(OnRampProvider.TRANSAK, mChainId, mFrom, mRampNetworkSymbol, mAmount, url -> { + if (url != null) { + enableOnRampService(mTransakLayout, mTransakButton, url); + } }); } onInitialLayoutInflationComplete(); } - public static Intent getIntent(Context context, String rampNetworkUrl) { + private void enableOnRampService(ViewGroup onRampLayout, Button onRampButton, String onRampUrl) { + onRampButton.setOnClickListener(v -> { + TabUtils.openUrlInNewTab(false, onRampUrl); + TabUtils.bringChromeTabbedActivityToTheTop(this); + }); + onRampLayout.setVisibility(View.VISIBLE); + } + + public static Intent getIntent(Context context, String chainId, String from, String rampNetworkSymbol, String amount) { Intent intent = new Intent(context, SelectPurchaseMethodActivity.class); - intent.putExtra(RAMP_NETWORK_URL, rampNetworkUrl); + intent.putExtra(CHAIN_ID, chainId); + intent.putExtra(FROM, from); + intent.putExtra(RAMP_NETWORK_SYMBOL, rampNetworkSymbol); + intent.putExtra(AMOUNT, amount); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); return intent; } diff --git a/android/java/res/drawable-night/sardine_logo.xml b/android/java/res/drawable-night/sardine_logo.xml new file mode 100644 index 000000000000..bce9cd3ab9ed --- /dev/null +++ b/android/java/res/drawable-night/sardine_logo.xml @@ -0,0 +1,9 @@ + + + + diff --git a/android/java/res/drawable/ramp.xml b/android/java/res/drawable/ramp_logo.xml similarity index 100% rename from android/java/res/drawable/ramp.xml rename to android/java/res/drawable/ramp_logo.xml diff --git a/android/java/res/drawable/sardine_logo.xml b/android/java/res/drawable/sardine_logo.xml new file mode 100644 index 000000000000..e4e59eccc133 --- /dev/null +++ b/android/java/res/drawable/sardine_logo.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/android/java/res/drawable/transak_logo.xml b/android/java/res/drawable/transak_logo.xml new file mode 100644 index 000000000000..40083a727628 --- /dev/null +++ b/android/java/res/drawable/transak_logo.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/android/java/res/layout/activity_select_purchase_method.xml b/android/java/res/layout/activity_select_purchase_method.xml index e14bf4da09cd..ec7880fa8bcb 100644 --- a/android/java/res/layout/activity_select_purchase_method.xml +++ b/android/java/res/layout/activity_select_purchase_method.xml @@ -53,6 +53,7 @@ android:text="@string/brave_wallet_select_following_options"/> + android:baselineAligned="false" + android:visibility="gone"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd index 51ec34698627..b8ed6dcbad33 100644 --- a/browser/ui/android/strings/android_brave_strings.grd +++ b/browser/ui/android/strings/android_brave_strings.grd @@ -2096,13 +2096,28 @@ Are you sure you want to do this? Buy crypto with Visa or Mastercard. - + + + Instant buy with your bank account. Lower fees. + Ramp.Network + + Sardine + + + Transak + Buy with Ramp - + + + Buy with Sardine + + + Buy with Transak + Clear transaction & nonce info From 7a9535fe47e78bb2db7fad8fd791f2082ce0b2a6 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Mon, 30 Jan 2023 14:37:34 +0100 Subject: [PATCH 06/36] Apply code formatting --- android/brave_java_resources.gni | 2 +- .../browser/app/domain/OnRampModel.java | 19 ++++++----- .../activities/BuySendSwapActivity.java | 3 +- .../SelectPurchaseMethodActivity.java | 33 +++++++++++-------- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index 01b09a3eae48..71da9d54947c 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -169,6 +169,7 @@ brave_java_resources = [ "java/res/drawable-night-xhdpi/ic_cookie_background.png", "java/res/drawable-night-xxhdpi/ic_cookie_background.png", "java/res/drawable-night-xxxhdpi/ic_cookie_background.png", + "java/res/drawable-night/sardine_logo.xml", "java/res/drawable-nodpi/dylan_malval_sea_min.webp", "java/res/drawable-nodpi/eth.png", "java/res/drawable-nodpi/fee_icon.png", @@ -746,7 +747,6 @@ brave_java_resources = [ "java/res/drawable/white_rounded_bg.xml", "java/res/drawable/white_rounded_holo_button_thin.xml", "java/res/drawable/yearly_selector.xml", - "java/res/drawable-night/sardine_logo.xml", "java/res/font/poppins_300.ttf", "java/res/font/poppins_400.ttf", "java/res/font/poppins_500.ttf", diff --git a/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java b/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java index 8f578d726c51..a0fd8b0b1368 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java @@ -17,15 +17,16 @@ public OnRampModel(BlockchainRegistry blockchainRegistry) { mBlockchainRegistry = blockchainRegistry; } - public void getBuyUrl(int onRampProvider, String chainId, String from, String rampNetworkSymbol, String amount, OnRampCallback callback) { - mBlockchainRegistry.getBuyUrl(OnRampProvider.RAMP, chainId, - from, rampNetworkSymbol, amount, (url, error) -> { - if (error != null && !error.isEmpty()) { - callback.OnUrlReady(null); - return; - } - callback.OnUrlReady(url); - }); + public void getBuyUrl(int onRampProvider, String chainId, String from, String rampNetworkSymbol, + String amount, OnRampCallback callback) { + mBlockchainRegistry.getBuyUrl( + OnRampProvider.RAMP, chainId, from, rampNetworkSymbol, amount, (url, error) -> { + if (error != null && !error.isEmpty()) { + callback.OnUrlReady(null); + return; + } + callback.OnUrlReady(url); + }); } public interface OnRampCallback { diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java index c50ea655f44b..f3cde2984f77 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java @@ -972,7 +972,8 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { } } else if (mActivityType == ActivityType.BUY) { String symbol = AssetUtils.mapToRampNetworkSymbol(mCurrentBlockchainToken); - Intent selectPurchaseMethodIntent = SelectPurchaseMethodActivity.getIntent(this, mCurrentBlockchainToken.chainId, from, symbol, amount); + Intent selectPurchaseMethodIntent = SelectPurchaseMethodActivity.getIntent( + this, mCurrentBlockchainToken.chainId, from, symbol, amount); startActivity(selectPurchaseMethodIntent); } else if (mActivityType == ActivityType.SWAP) { diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java index 105b42224297..bd3ab731ab48 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java @@ -72,29 +72,33 @@ protected void triggerLayoutInflation() { mTransakButton = findViewById(R.id.purchase_method_btn_transak); if (mOnRampModel != null) { - mOnRampModel.getBuyUrl(OnRampProvider.RAMP, mChainId, mFrom, mRampNetworkSymbol, mAmount, url -> { + mOnRampModel.getBuyUrl( + OnRampProvider.RAMP, mChainId, mFrom, mRampNetworkSymbol, mAmount, url -> { if (url != null) { enableOnRampService(mRampNetworkLayout, mRampButton, url); } }); - mOnRampModel.getBuyUrl(OnRampProvider.SARDINE, mChainId, mFrom, mRampNetworkSymbol, mAmount, url -> { - if (url != null) { - enableOnRampService(mSardineLayout, mSardineButton, url); - } - }); - - mOnRampModel.getBuyUrl(OnRampProvider.TRANSAK, mChainId, mFrom, mRampNetworkSymbol, mAmount, url -> { - if (url != null) { - enableOnRampService(mTransakLayout, mTransakButton, url); - } - }); + mOnRampModel.getBuyUrl( + OnRampProvider.SARDINE, mChainId, mFrom, mRampNetworkSymbol, mAmount, url -> { + if (url != null) { + enableOnRampService(mSardineLayout, mSardineButton, url); + } + }); + + mOnRampModel.getBuyUrl( + OnRampProvider.TRANSAK, mChainId, mFrom, mRampNetworkSymbol, mAmount, url -> { + if (url != null) { + enableOnRampService(mTransakLayout, mTransakButton, url); + } + }); } onInitialLayoutInflationComplete(); } - private void enableOnRampService(ViewGroup onRampLayout, Button onRampButton, String onRampUrl) { + private void enableOnRampService( + ViewGroup onRampLayout, Button onRampButton, String onRampUrl) { onRampButton.setOnClickListener(v -> { TabUtils.openUrlInNewTab(false, onRampUrl); TabUtils.bringChromeTabbedActivityToTheTop(this); @@ -102,7 +106,8 @@ private void enableOnRampService(ViewGroup onRampLayout, Button onRampButton, St onRampLayout.setVisibility(View.VISIBLE); } - public static Intent getIntent(Context context, String chainId, String from, String rampNetworkSymbol, String amount) { + public static Intent getIntent( + Context context, String chainId, String from, String rampNetworkSymbol, String amount) { Intent intent = new Intent(context, SelectPurchaseMethodActivity.class); intent.putExtra(CHAIN_ID, chainId); intent.putExtra(FROM, from); From 1de26c9f2de03bd66736d7ce19c7c58d4001fb49 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Mon, 30 Jan 2023 17:14:35 +0100 Subject: [PATCH 07/36] Switch to getBuyUrlV1 --- .../browser/app/domain/CryptoModel.java | 2 +- .../browser/app/domain/OnRampModel.java | 30 ++++++++++++++----- .../SelectPurchaseMethodActivity.java | 12 ++++---- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java index db049b444be0..ba1b38eb868b 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java @@ -108,7 +108,7 @@ public CryptoModel(Context context, TxService txService, KeyringService keyringS mPortfolioModel = new PortfolioModel(context, mTxService, mKeyringService, mBlockchainRegistry, mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, mBraveWalletService, mAssetRatioService, mSharedData); - mOnRampModel = new OnRampModel(mBlockchainRegistry); + mOnRampModel = new OnRampModel(mAssetRatioService); _mIsSwapEnabled = new MediatorLiveData<>(); mIsSwapEnabled = _mIsSwapEnabled; _mIsSwapEnabled.addSource(mNetworkModel.mChainId, chainId -> { diff --git a/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java b/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java index a0fd8b0b1368..a993759a68b8 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java @@ -5,22 +5,38 @@ package org.chromium.chrome.browser.app.domain; +import android.content.res.Resources; import android.text.TextUtils; -import org.chromium.brave_wallet.mojom.BlockchainRegistry; +import androidx.core.os.ConfigurationCompat; + +import org.chromium.brave_wallet.mojom.AssetRatioService; import org.chromium.brave_wallet.mojom.OnRampProvider; +import java.util.Locale; + public class OnRampModel { - private final BlockchainRegistry mBlockchainRegistry; + private final AssetRatioService mAssetRatioService; + + private static final String CURRENCY_CODE_USD = "USD"; - public OnRampModel(BlockchainRegistry blockchainRegistry) { - mBlockchainRegistry = blockchainRegistry; + public OnRampModel(AssetRatioService assetRatioService) { + mAssetRatioService = assetRatioService; } public void getBuyUrl(int onRampProvider, String chainId, String from, String rampNetworkSymbol, - String amount, OnRampCallback callback) { - mBlockchainRegistry.getBuyUrl( - OnRampProvider.RAMP, chainId, from, rampNetworkSymbol, amount, (url, error) -> { + String amount, Resources resources, OnRampCallback callback) { + if (onRampProvider == OnRampProvider.SARDINE) { + // Sardine services are available only for US locales. + Locale currentLocale = + ConfigurationCompat.getLocales(resources.getConfiguration()).get(0); + if (currentLocale == null || !currentLocale.getCountry().equals("US")) { + callback.OnUrlReady(null); + return; + } + } + mAssetRatioService.getBuyUrlV1(onRampProvider, chainId, from, rampNetworkSymbol, amount, + CURRENCY_CODE_USD, (url, error) -> { if (error != null && !error.isEmpty()) { callback.OnUrlReady(null); return; diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java index bd3ab731ab48..f3b809b355eb 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java @@ -72,22 +72,22 @@ protected void triggerLayoutInflation() { mTransakButton = findViewById(R.id.purchase_method_btn_transak); if (mOnRampModel != null) { - mOnRampModel.getBuyUrl( - OnRampProvider.RAMP, mChainId, mFrom, mRampNetworkSymbol, mAmount, url -> { + mOnRampModel.getBuyUrl(OnRampProvider.RAMP, mChainId, mFrom, mRampNetworkSymbol, + mAmount, getResources(), url -> { if (url != null) { enableOnRampService(mRampNetworkLayout, mRampButton, url); } }); - mOnRampModel.getBuyUrl( - OnRampProvider.SARDINE, mChainId, mFrom, mRampNetworkSymbol, mAmount, url -> { + mOnRampModel.getBuyUrl(OnRampProvider.SARDINE, mChainId, mFrom, mRampNetworkSymbol, + mAmount, getResources(), url -> { if (url != null) { enableOnRampService(mSardineLayout, mSardineButton, url); } }); - mOnRampModel.getBuyUrl( - OnRampProvider.TRANSAK, mChainId, mFrom, mRampNetworkSymbol, mAmount, url -> { + mOnRampModel.getBuyUrl(OnRampProvider.TRANSAK, mChainId, mFrom, mRampNetworkSymbol, + mAmount, getResources(), url -> { if (url != null) { enableOnRampService(mTransakLayout, mTransakButton, url); } From f7f1301e0e0190914227614949d073e97975b105 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Tue, 31 Jan 2023 16:43:59 +0100 Subject: [PATCH 08/36] Add reset method to OnRampModel --- .../chrome/browser/app/domain/CryptoModel.java | 1 + .../chrome/browser/app/domain/OnRampModel.java | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java index ba1b38eb868b..975de1c27dfd 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java @@ -136,6 +136,7 @@ public void resetServices(Context context, TxService mTxService, KeyringService mPortfolioModel.resetServices(context, mTxService, mKeyringService, mBlockchainRegistry, mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, mBraveWalletService, mAssetRatioService); + mOnRampModel.resetServices(mAssetRatioService); } init(); } diff --git a/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java b/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java index a993759a68b8..7ae06126aef9 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java @@ -16,9 +16,9 @@ import java.util.Locale; public class OnRampModel { - private final AssetRatioService mAssetRatioService; - private static final String CURRENCY_CODE_USD = "USD"; + private final Object mLock = new Object(); + private AssetRatioService mAssetRatioService; public OnRampModel(AssetRatioService assetRatioService) { mAssetRatioService = assetRatioService; @@ -45,6 +45,12 @@ public void getBuyUrl(int onRampProvider, String chainId, String from, String ra }); } + void resetServices(AssetRatioService assetRatioService) { + synchronized (mLock) { + mAssetRatioService = assetRatioService; + } + } + public interface OnRampCallback { void OnUrlReady(String url); } From fe378661059d59b7cc3a234529be285b0e9f8afc Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Tue, 31 Jan 2023 18:55:03 +0100 Subject: [PATCH 09/36] Address review feedback --- .../SelectPurchaseMethodActivity.java | 8 ++++++-- .../layout/activity_select_purchase_method.xml | 18 ++++++------------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java index f3b809b355eb..33d21cf1a7e7 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java @@ -71,6 +71,12 @@ protected void triggerLayoutInflation() { mSardineButton = findViewById(R.id.purchase_method_btn_sardine); mTransakButton = findViewById(R.id.purchase_method_btn_transak); + onInitialLayoutInflationComplete(); + } + + @Override + public void finishNativeInitialization() { + super.finishNativeInitialization(); if (mOnRampModel != null) { mOnRampModel.getBuyUrl(OnRampProvider.RAMP, mChainId, mFrom, mRampNetworkSymbol, mAmount, getResources(), url -> { @@ -93,8 +99,6 @@ mAmount, getResources(), url -> { } }); } - - onInitialLayoutInflationComplete(); } private void enableOnRampService( diff --git a/android/java/res/layout/activity_select_purchase_method.xml b/android/java/res/layout/activity_select_purchase_method.xml index ec7880fa8bcb..7be4099447e3 100644 --- a/android/java/res/layout/activity_select_purchase_method.xml +++ b/android/java/res/layout/activity_select_purchase_method.xml @@ -88,8 +88,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="start" - android:paddingTop="8dp" - android:paddingBottom="8dp" + android:paddingVertical="8dp" android:text="@string/brave_wallet_ramp_network_title" android:textColor="@color/wallet_text_color" android:textSize="17sp" /> @@ -100,8 +99,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="start" - android:paddingTop="8dp" - android:paddingBottom="8dp" + android:paddingVertical="8dp" android:text="@string/brave_wallet_buy_crypto_visa_mastercard" android:textColor="@color/wallet_text_color" android:textSize="14sp" /> @@ -154,8 +152,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="start" - android:paddingTop="8dp" - android:paddingBottom="8dp" + android:paddingVertical="8dp" android:text="@string/brave_wallet_sardine_title" android:textColor="@color/wallet_text_color" android:textSize="17sp" /> @@ -166,8 +163,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="start" - android:paddingTop="8dp" - android:paddingBottom="8dp" + android:paddingVertical="8dp" android:text="@string/brave_wallet_instant_buy" android:textColor="@color/wallet_text_color" android:textSize="14sp" /> @@ -188,10 +184,8 @@ android:id="@+id/transak_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:paddingStart="14dp" - android:paddingEnd="14dp" + android:paddingVertical="8dp" + android:paddingHorizontal="14dp" android:layout_marginStart="14dp" android:layout_marginEnd="14dp" android:layout_marginBottom="8dp" From 05c14858f7a8d5bcfaa6ea214a9ba7799d35789f Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Tue, 31 Jan 2023 20:04:52 +0100 Subject: [PATCH 10/36] Perform small refactoring --- .../activities/SelectPurchaseMethodActivity.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java index 33d21cf1a7e7..d2e6be1f4e54 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java @@ -46,11 +46,6 @@ public class SelectPurchaseMethodActivity extends BraveWalletBaseActivity { protected void triggerLayoutInflation() { setContentView(R.layout.activity_select_purchase_method); - BraveActivity activity = BraveActivity.getBraveActivity(); - if (activity != null) { - mOnRampModel = activity.getWalletModel().getCryptoModel().getOnRampModel(); - } - Intent intent = getIntent(); if (intent != null) { mChainId = intent.getStringExtra(CHAIN_ID); @@ -77,6 +72,11 @@ protected void triggerLayoutInflation() { @Override public void finishNativeInitialization() { super.finishNativeInitialization(); + + BraveActivity activity = BraveActivity.getBraveActivity(); + if (activity != null) { + mOnRampModel = activity.getWalletModel().getCryptoModel().getOnRampModel(); + } if (mOnRampModel != null) { mOnRampModel.getBuyUrl(OnRampProvider.RAMP, mChainId, mFrom, mRampNetworkSymbol, mAmount, getResources(), url -> { From 2ed76d9a195a7e4507aa4dc2cef8eee80dbd64ad Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Wed, 1 Feb 2023 12:22:47 +0100 Subject: [PATCH 11/36] Simplify layout based on review feedback --- .../activity_select_purchase_method.xml | 67 ++++++------------- 1 file changed, 19 insertions(+), 48 deletions(-) diff --git a/android/java/res/layout/activity_select_purchase_method.xml b/android/java/res/layout/activity_select_purchase_method.xml index 7be4099447e3..fa3b7af82602 100644 --- a/android/java/res/layout/activity_select_purchase_method.xml +++ b/android/java/res/layout/activity_select_purchase_method.xml @@ -28,10 +28,8 @@ @@ -43,11 +41,7 @@ @@ -56,12 +50,9 @@ android:id="@+id/ramp_network_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:paddingStart="14dp" - android:paddingEnd="14dp" - android:layout_marginStart="14dp" - android:layout_marginEnd="14dp" + android:paddingVertical="8dp" + android:paddingHorizontal="14dp" + android:layout_marginHorizontal="14dp" android:layout_marginBottom="8dp" android:background="@drawable/rounded_filled_bg_radius_12" android:orientation="horizontal" @@ -85,33 +76,28 @@ + android:textSize="18sp" /> + android:textSize="18sp" /> @@ -120,12 +106,9 @@ android:id="@+id/sardine_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:paddingStart="14dp" - android:paddingEnd="14dp" - android:layout_marginStart="14dp" - android:layout_marginEnd="14dp" + android:paddingVertical="8dp" + android:paddingHorizontal="14dp" + android:layout_marginHorizontal="14dp" android:layout_marginBottom="8dp" android:background="@drawable/rounded_filled_bg_radius_12" android:orientation="horizontal" @@ -149,33 +132,28 @@ + android:textSize="18sp" /> + android:textSize="18sp" /> @@ -186,8 +164,7 @@ android:layout_height="wrap_content" android:paddingVertical="8dp" android:paddingHorizontal="14dp" - android:layout_marginStart="14dp" - android:layout_marginEnd="14dp" + android:layout_marginHorizontal="14dp" android:layout_marginBottom="8dp" android:background="@drawable/rounded_filled_bg_radius_12" android:orientation="horizontal" @@ -211,35 +188,29 @@ + android:textSize="18sp" /> + android:textSize="18sp" /> From ad3bf8805c6acf7d333df1b5ecadb9c23f9d3e14 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Wed, 1 Feb 2023 12:33:28 +0100 Subject: [PATCH 12/36] Rename OnRampModel class to BuyModel --- android/brave_java_sources.gni | 2 +- .../app/domain/{OnRampModel.java => BuyModel.java} | 4 ++-- .../chrome/browser/app/domain/CryptoModel.java | 10 +++++----- .../activities/SelectPurchaseMethodActivity.java | 14 +++++++------- 4 files changed, 15 insertions(+), 15 deletions(-) rename android/java/org/chromium/chrome/browser/app/domain/{OnRampModel.java => BuyModel.java} (95%) diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index 74d26040c47b..8772b4f881b0 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -45,6 +45,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/app/BraveActivity.java", "../../brave/android/java/org/chromium/chrome/browser/app/appmenu/AppMenuIconRowFooter.java", "../../brave/android/java/org/chromium/chrome/browser/app/appmenu/BraveAppMenuPropertiesDelegateImpl.java", + "../../brave/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/CryptoSharedActions.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/CryptoSharedData.java", @@ -52,7 +53,6 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/app/domain/KeyringModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/NetworkModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/NetworkSelectorModel.java", - "../../brave/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/PortfolioModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/SendModel.java", "../../brave/android/java/org/chromium/chrome/browser/app/domain/SwapModel.java", diff --git a/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java b/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java similarity index 95% rename from android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java rename to android/java/org/chromium/chrome/browser/app/domain/BuyModel.java index 7ae06126aef9..3e057359eb6d 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/OnRampModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java @@ -15,12 +15,12 @@ import java.util.Locale; -public class OnRampModel { +public class BuyModel { private static final String CURRENCY_CODE_USD = "USD"; private final Object mLock = new Object(); private AssetRatioService mAssetRatioService; - public OnRampModel(AssetRatioService assetRatioService) { + public BuyModel(AssetRatioService assetRatioService) { mAssetRatioService = assetRatioService; } diff --git a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java index 975de1c27dfd..4b52dae13fb3 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java @@ -78,7 +78,7 @@ public class CryptoModel { private NetworkModel mNetworkModel; private PortfolioModel mPortfolioModel; - private OnRampModel mOnRampModel; + private BuyModel mBuyModel; // Todo: create method to create and return new models for Asset, Account, // TransactionConfirmation, SwapModel, AssetModel, SendModel @@ -108,7 +108,7 @@ public CryptoModel(Context context, TxService txService, KeyringService keyringS mPortfolioModel = new PortfolioModel(context, mTxService, mKeyringService, mBlockchainRegistry, mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, mBraveWalletService, mAssetRatioService, mSharedData); - mOnRampModel = new OnRampModel(mAssetRatioService); + mBuyModel = new BuyModel(mAssetRatioService); _mIsSwapEnabled = new MediatorLiveData<>(); mIsSwapEnabled = _mIsSwapEnabled; _mIsSwapEnabled.addSource(mNetworkModel.mChainId, chainId -> { @@ -136,7 +136,7 @@ public void resetServices(Context context, TxService mTxService, KeyringService mPortfolioModel.resetServices(context, mTxService, mKeyringService, mBlockchainRegistry, mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, mBraveWalletService, mAssetRatioService); - mOnRampModel.resetServices(mAssetRatioService); + mBuyModel.resetServices(mAssetRatioService); } init(); } @@ -276,8 +276,8 @@ public NetworkModel getNetworkModel() { return mNetworkModel; } - public OnRampModel getOnRampModel() { - return mOnRampModel; + public BuyModel getBuyModel() { + return mBuyModel; } public PortfolioModel getPortfolioModel() { diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java index d2e6be1f4e54..578db05b62b6 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java @@ -19,7 +19,7 @@ import org.chromium.brave_wallet.mojom.OnRampProvider; import org.chromium.chrome.R; import org.chromium.chrome.browser.app.BraveActivity; -import org.chromium.chrome.browser.app.domain.OnRampModel; +import org.chromium.chrome.browser.app.domain.BuyModel; import org.chromium.chrome.browser.util.TabUtils; public class SelectPurchaseMethodActivity extends BraveWalletBaseActivity { @@ -28,7 +28,7 @@ public class SelectPurchaseMethodActivity extends BraveWalletBaseActivity { private static final String RAMP_NETWORK_SYMBOL = "rampNetworkSymbol"; private static final String AMOUNT = "amount"; - private OnRampModel mOnRampModel; + private BuyModel mBuyModel; private String mChainId; private String mFrom; @@ -75,24 +75,24 @@ public void finishNativeInitialization() { BraveActivity activity = BraveActivity.getBraveActivity(); if (activity != null) { - mOnRampModel = activity.getWalletModel().getCryptoModel().getOnRampModel(); + mBuyModel = activity.getWalletModel().getCryptoModel().getBuyModel(); } - if (mOnRampModel != null) { - mOnRampModel.getBuyUrl(OnRampProvider.RAMP, mChainId, mFrom, mRampNetworkSymbol, + if (mBuyModel != null) { + mBuyModel.getBuyUrl(OnRampProvider.RAMP, mChainId, mFrom, mRampNetworkSymbol, mAmount, getResources(), url -> { if (url != null) { enableOnRampService(mRampNetworkLayout, mRampButton, url); } }); - mOnRampModel.getBuyUrl(OnRampProvider.SARDINE, mChainId, mFrom, mRampNetworkSymbol, + mBuyModel.getBuyUrl(OnRampProvider.SARDINE, mChainId, mFrom, mRampNetworkSymbol, mAmount, getResources(), url -> { if (url != null) { enableOnRampService(mSardineLayout, mSardineButton, url); } }); - mOnRampModel.getBuyUrl(OnRampProvider.TRANSAK, mChainId, mFrom, mRampNetworkSymbol, + mBuyModel.getBuyUrl(OnRampProvider.TRANSAK, mChainId, mFrom, mRampNetworkSymbol, mAmount, getResources(), url -> { if (url != null) { enableOnRampService(mTransakLayout, mTransakButton, url); From dd76f6cda8f67627f34398c8a8ec03f0e0bbd423 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Wed, 1 Feb 2023 13:24:00 +0100 Subject: [PATCH 13/36] Extract locale check to improve UX --- .../chrome/browser/app/domain/BuyModel.java | 13 +++--- .../SelectPurchaseMethodActivity.java | 46 +++++++++++-------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java b/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java index 3e057359eb6d..97a5fb209b9e 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java @@ -24,17 +24,18 @@ public BuyModel(AssetRatioService assetRatioService) { mAssetRatioService = assetRatioService; } - public void getBuyUrl(int onRampProvider, String chainId, String from, String rampNetworkSymbol, - String amount, Resources resources, OnRampCallback callback) { + public boolean isAvailable(int onRampProvider, Resources resources) { if (onRampProvider == OnRampProvider.SARDINE) { // Sardine services are available only for US locales. Locale currentLocale = ConfigurationCompat.getLocales(resources.getConfiguration()).get(0); - if (currentLocale == null || !currentLocale.getCountry().equals("US")) { - callback.OnUrlReady(null); - return; - } + return (currentLocale != null && currentLocale.getCountry().equals("US")); } + return true; + } + + public void getBuyUrl(int onRampProvider, String chainId, String from, String rampNetworkSymbol, + String amount, OnRampCallback callback) { mAssetRatioService.getBuyUrlV1(onRampProvider, chainId, from, rampNetworkSymbol, amount, CURRENCY_CODE_USD, (url, error) -> { if (error != null && !error.isEmpty()) { diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java index 578db05b62b6..144b5a23ad64 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java @@ -78,36 +78,42 @@ public void finishNativeInitialization() { mBuyModel = activity.getWalletModel().getCryptoModel().getBuyModel(); } if (mBuyModel != null) { - mBuyModel.getBuyUrl(OnRampProvider.RAMP, mChainId, mFrom, mRampNetworkSymbol, - mAmount, getResources(), url -> { - if (url != null) { + if (mBuyModel.isAvailable(OnRampProvider.RAMP, getResources())) { + mRampNetworkLayout.setVisibility(View.VISIBLE); + mBuyModel.getBuyUrl(OnRampProvider.RAMP, mChainId, mFrom, mRampNetworkSymbol, + mAmount, url -> { enableOnRampService(mRampNetworkLayout, mRampButton, url); - } - }); + }); + } - mBuyModel.getBuyUrl(OnRampProvider.SARDINE, mChainId, mFrom, mRampNetworkSymbol, - mAmount, getResources(), url -> { - if (url != null) { + if (mBuyModel.isAvailable(OnRampProvider.SARDINE, getResources())) { + mSardineLayout.setVisibility(View.VISIBLE); + mBuyModel.getBuyUrl(OnRampProvider.SARDINE, mChainId, mFrom, mRampNetworkSymbol, + mAmount, url -> { enableOnRampService(mSardineLayout, mSardineButton, url); - } - }); + }); + } - mBuyModel.getBuyUrl(OnRampProvider.TRANSAK, mChainId, mFrom, mRampNetworkSymbol, - mAmount, getResources(), url -> { - if (url != null) { + if (mBuyModel.isAvailable(OnRampProvider.TRANSAK, getResources())) { + mTransakLayout.setVisibility(View.VISIBLE); + mBuyModel.getBuyUrl(OnRampProvider.TRANSAK, mChainId, mFrom, mRampNetworkSymbol, + mAmount, url -> { enableOnRampService(mTransakLayout, mTransakButton, url); - } - }); + }); + } } } private void enableOnRampService( ViewGroup onRampLayout, Button onRampButton, String onRampUrl) { - onRampButton.setOnClickListener(v -> { - TabUtils.openUrlInNewTab(false, onRampUrl); - TabUtils.bringChromeTabbedActivityToTheTop(this); - }); - onRampLayout.setVisibility(View.VISIBLE); + if (onRampUrl == null) { + onRampLayout.setVisibility(View.GONE); + } else { + onRampButton.setOnClickListener(v -> { + TabUtils.openUrlInNewTab(false, onRampUrl); + TabUtils.bringChromeTabbedActivityToTheTop(this); + }); + } } public static Intent getIntent( From e6210e80ea8f34522ddba375beb94870033b1b09 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Wed, 1 Feb 2023 13:32:37 +0100 Subject: [PATCH 14/36] Lazy load BuyModel --- .../chromium/chrome/browser/app/domain/CryptoModel.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java index 4b52dae13fb3..05b045afbbd9 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java @@ -108,7 +108,6 @@ public CryptoModel(Context context, TxService txService, KeyringService keyringS mPortfolioModel = new PortfolioModel(context, mTxService, mKeyringService, mBlockchainRegistry, mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, mBraveWalletService, mAssetRatioService, mSharedData); - mBuyModel = new BuyModel(mAssetRatioService); _mIsSwapEnabled = new MediatorLiveData<>(); mIsSwapEnabled = _mIsSwapEnabled; _mIsSwapEnabled.addSource(mNetworkModel.mChainId, chainId -> { @@ -136,7 +135,9 @@ public void resetServices(Context context, TxService mTxService, KeyringService mPortfolioModel.resetServices(context, mTxService, mKeyringService, mBlockchainRegistry, mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, mBraveWalletService, mAssetRatioService); - mBuyModel.resetServices(mAssetRatioService); + if (mBuyModel != null) { + mBuyModel.resetServices(mAssetRatioService); + } } init(); } @@ -277,6 +278,9 @@ public NetworkModel getNetworkModel() { } public BuyModel getBuyModel() { + if (mBuyModel == null) { + mBuyModel = new BuyModel(mAssetRatioService); + } return mBuyModel; } From dcc2aa06caebd7ab15a7c5740f76cbd74d635c3a Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Wed, 1 Feb 2023 13:35:11 +0100 Subject: [PATCH 15/36] Apply code formatting --- .../activities/SelectPurchaseMethodActivity.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java index 144b5a23ad64..35e38834be30 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java @@ -81,25 +81,22 @@ public void finishNativeInitialization() { if (mBuyModel.isAvailable(OnRampProvider.RAMP, getResources())) { mRampNetworkLayout.setVisibility(View.VISIBLE); mBuyModel.getBuyUrl(OnRampProvider.RAMP, mChainId, mFrom, mRampNetworkSymbol, - mAmount, url -> { - enableOnRampService(mRampNetworkLayout, mRampButton, url); - }); + mAmount, + url -> { enableOnRampService(mRampNetworkLayout, mRampButton, url); }); } if (mBuyModel.isAvailable(OnRampProvider.SARDINE, getResources())) { mSardineLayout.setVisibility(View.VISIBLE); mBuyModel.getBuyUrl(OnRampProvider.SARDINE, mChainId, mFrom, mRampNetworkSymbol, - mAmount, url -> { - enableOnRampService(mSardineLayout, mSardineButton, url); - }); + mAmount, + url -> { enableOnRampService(mSardineLayout, mSardineButton, url); }); } if (mBuyModel.isAvailable(OnRampProvider.TRANSAK, getResources())) { mTransakLayout.setVisibility(View.VISIBLE); mBuyModel.getBuyUrl(OnRampProvider.TRANSAK, mChainId, mFrom, mRampNetworkSymbol, - mAmount, url -> { - enableOnRampService(mTransakLayout, mTransakButton, url); - }); + mAmount, + url -> { enableOnRampService(mTransakLayout, mTransakButton, url); }); } } } From 133d34aef3b3e54a6f94f5e75c0578ea60c26f7f Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Fri, 3 Feb 2023 15:59:46 +0100 Subject: [PATCH 16/36] Implement core method that accepts multiple on-ramp providers --- .../browser/blockchain_registry.cc | 66 +++++++++++++------ .../browser/blockchain_registry.h | 7 ++ .../brave_wallet/common/brave_wallet.mojom | 1 + 3 files changed, 55 insertions(+), 19 deletions(-) diff --git a/components/brave_wallet/browser/blockchain_registry.cc b/components/brave_wallet/browser/blockchain_registry.cc index 3b6ace7c324a..0237b10dd5db 100644 --- a/components/brave_wallet/browser/blockchain_registry.cc +++ b/components/brave_wallet/browser/blockchain_registry.cc @@ -116,35 +116,63 @@ void BlockchainRegistry::GetAllTokens(const std::string& chain_id, std::move(callback).Run(std::move(tokens_copy)); } -void BlockchainRegistry::GetBuyTokens(mojom::OnRampProvider provider, - const std::string& chain_id, - GetBuyTokensCallback callback) { +std::vector +BlockchainRegistry::GetBuyTokens( + const std::vector& providers, + const std::string& chain_id) { std::vector blockchain_buy_tokens; - const std::vector* buy_tokens = nullptr; - if (provider == mojom::OnRampProvider::kWyre) - buy_tokens = &GetWyreBuyTokens(); - else if (provider == mojom::OnRampProvider::kRamp) - buy_tokens = &GetRampBuyTokens(); - else if (provider == mojom::OnRampProvider::kSardine) - buy_tokens = &GetSardineBuyTokens(); - else if (provider == mojom::OnRampProvider::kTransak) - buy_tokens = &GetTransakBuyTokens(); - - if (buy_tokens == nullptr) { - std::move(callback).Run(std::move(blockchain_buy_tokens)); - return; + std::vector buy_tokens; + if (std::find(providers.begin(), providers.end(), + mojom::OnRampProvider::kWyre) != providers.end()) { + buy_tokens.insert(std::end(buy_tokens), std::begin(GetWyreBuyTokens()), + std::end(GetWyreBuyTokens())); } - - for (const auto& token : *buy_tokens) { + if (std::find(providers.begin(), providers.end(), + mojom::OnRampProvider::kRamp) != providers.end()) { + buy_tokens.insert(std::end(buy_tokens), std::begin(GetRampBuyTokens()), + std::end(GetRampBuyTokens())); + } + if (std::find(providers.begin(), providers.end(), + mojom::OnRampProvider::kSardine) != providers.end()) { + buy_tokens.insert(std::end(buy_tokens), std::begin(GetSardineBuyTokens()), + std::end(GetSardineBuyTokens())); + } + if (std::find(providers.begin(), providers.end(), + mojom::OnRampProvider::kTransak) != providers.end()) { + buy_tokens.insert(std::end(buy_tokens), std::begin(GetTransakBuyTokens()), + std::end(GetTransakBuyTokens())); + } + if (buy_tokens.empty()) { + return blockchain_buy_tokens; + } + for (const auto& token : buy_tokens) { if (token.chain_id != chain_id) { continue; } - blockchain_buy_tokens.push_back( brave_wallet::mojom::BlockchainToken::New(token)); } + LOG(ERROR) << "blockchain_buy_tokens size: " << blockchain_buy_tokens.size(); + return blockchain_buy_tokens; +} + +void BlockchainRegistry::GetBuyTokens(mojom::OnRampProvider provider, + const std::string& chain_id, + GetBuyTokensCallback callback) { + std::vector blockchain_buy_tokens = + GetBuyTokens({provider}, chain_id); std::move(callback).Run(std::move(blockchain_buy_tokens)); } + +void BlockchainRegistry::GetProvidersBuyTokens( + const std::vector& providers, + const std::string& chain_id, + GetProvidersBuyTokensCallback callback) { + std::vector blockchain_buy_tokens = + GetBuyTokens(providers, chain_id); + std::move(callback).Run(std::move(blockchain_buy_tokens)); +} + // TODO(muliswilliam) - Remove this function when iOS and Android no longer // depend on it https://github.com/brave/brave-browser/issues/23503 void BlockchainRegistry::GetBuyUrl(mojom::OnRampProvider provider, diff --git a/components/brave_wallet/browser/blockchain_registry.h b/components/brave_wallet/browser/blockchain_registry.h index 75363223bdb0..1b15af1a0beb 100644 --- a/components/brave_wallet/browser/blockchain_registry.h +++ b/components/brave_wallet/browser/blockchain_registry.h @@ -51,9 +51,16 @@ class BlockchainRegistry : public mojom::BlockchainRegistry { void GetAllTokens(const std::string& chain_id, mojom::CoinType coin, GetAllTokensCallback callback) override; + std::vector GetBuyTokens( + const std::vector& providers, + const std::string& chain_id); void GetBuyTokens(mojom::OnRampProvider provider, const std::string& chain_id, GetBuyTokensCallback callback) override; + void GetProvidersBuyTokens( + const std::vector& providers, + const std::string& chain_id, + GetProvidersBuyTokensCallback callback) override; void GetBuyUrl(mojom::OnRampProvider provider, const std::string& chain_id, const std::string& address, diff --git a/components/brave_wallet/common/brave_wallet.mojom b/components/brave_wallet/common/brave_wallet.mojom index ced671391d60..07f406407943 100644 --- a/components/brave_wallet/common/brave_wallet.mojom +++ b/components/brave_wallet/common/brave_wallet.mojom @@ -672,6 +672,7 @@ interface BlockchainRegistry { // Below APIs are Ethereum only for the moment. // Obtains all tokens for the Buy UI GetBuyTokens(OnRampProvider provider, string chain_id) => (array tokens); + GetProvidersBuyTokens(array providers, string chain_id) => (array tokens); // Obtains the URL used for buying assets. GetBuyUrl(OnRampProvider provider, string chain_id, string address, string symbol, string amount) => (string url, string? error); From b7fe2b8650258c36b281f1c6bcc1c5e7391d3911 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Fri, 3 Feb 2023 16:07:43 +0100 Subject: [PATCH 17/36] Fetch available assets and perform refactoring --- .../chrome/browser/app/domain/BuyModel.java | 40 +++++++-- .../browser/app/domain/CryptoModel.java | 17 +--- .../activities/AssetDetailActivity.java | 6 +- .../activities/BuySendSwapActivity.java | 6 +- .../SelectPurchaseMethodActivity.java | 81 ++++++++++++------- ...isibleAssetsBottomSheetDialogFragment.java | 3 +- .../crypto_wallet/util/AssetUtils.java | 16 ++-- .../crypto_wallet/util/TokenUtils.java | 4 +- 8 files changed, 110 insertions(+), 63 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java b/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java index 97a5fb209b9e..6aad91e342e4 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java @@ -11,17 +11,28 @@ import androidx.core.os.ConfigurationCompat; import org.chromium.brave_wallet.mojom.AssetRatioService; +import org.chromium.brave_wallet.mojom.BlockchainRegistry; +import org.chromium.brave_wallet.mojom.NetworkInfo; import org.chromium.brave_wallet.mojom.OnRampProvider; +import org.chromium.chrome.browser.crypto_wallet.util.AssetUtils; +import org.chromium.chrome.browser.crypto_wallet.util.JavaUtils; +import org.chromium.chrome.browser.crypto_wallet.util.TokenUtils; +import org.chromium.mojo.bindings.Callbacks.Callback1; import java.util.Locale; public class BuyModel { + public static final int[] SUPPORTED_RAMP_PROVIDERS = { + OnRampProvider.RAMP, OnRampProvider.SARDINE, OnRampProvider.TRANSAK}; + private static final String CURRENCY_CODE_USD = "USD"; private final Object mLock = new Object(); private AssetRatioService mAssetRatioService; + private BlockchainRegistry mBlockchainRegistry; - public BuyModel(AssetRatioService assetRatioService) { + public BuyModel(AssetRatioService assetRatioService, BlockchainRegistry blockchainRegistry) { mAssetRatioService = assetRatioService; + mBlockchainRegistry = blockchainRegistry; } public boolean isAvailable(int onRampProvider, Resources resources) { @@ -34,10 +45,14 @@ public boolean isAvailable(int onRampProvider, Resources resources) { return true; } - public void getBuyUrl(int onRampProvider, String chainId, String from, String rampNetworkSymbol, - String amount, OnRampCallback callback) { - mAssetRatioService.getBuyUrlV1(onRampProvider, chainId, from, rampNetworkSymbol, amount, - CURRENCY_CODE_USD, (url, error) -> { + public void getBuyUrl(int onRampProvider, String chainId, String from, String symbol, + String amount, String contractAddress, OnRampCallback callback) { + if (onRampProvider == OnRampProvider.RAMP) { + // Ramp.Network is a special case that requires a modified asset symbol. + symbol = AssetUtils.mapToRampNetworkSymbol(chainId, symbol, contractAddress); + } + mAssetRatioService.getBuyUrlV1( + onRampProvider, chainId, from, symbol, amount, CURRENCY_CODE_USD, (url, error) -> { if (error != null && !error.isEmpty()) { callback.OnUrlReady(null); return; @@ -46,9 +61,22 @@ public void getBuyUrl(int onRampProvider, String chainId, String from, String ra }); } - void resetServices(AssetRatioService assetRatioService) { + public void isBuySupported(NetworkInfo selectedNetwork, String assetSymbol, + String contractAddress, String chainId, int[] rampProviders, + Callback1 callback) { + TokenUtils.getBuyTokensFiltered(mBlockchainRegistry, selectedNetwork, + TokenUtils.TokenType.ALL, rampProviders, tokens -> { + callback.call(JavaUtils.includes(tokens, + iToken + -> AssetUtils.Filters.isSameToken( + iToken, assetSymbol, contractAddress, chainId))); + }); + } + + void resetServices(AssetRatioService assetRatioService, BlockchainRegistry blockchainRegistry) { synchronized (mLock) { mAssetRatioService = assetRatioService; + mBlockchainRegistry = blockchainRegistry; } } diff --git a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java index 05b045afbbd9..9ea9504f2819 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/CryptoModel.java @@ -136,7 +136,7 @@ public void resetServices(Context context, TxService mTxService, KeyringService mJsonRpcService, mEthTxManagerProxy, mSolanaTxManagerProxy, mBraveWalletService, mAssetRatioService); if (mBuyModel != null) { - mBuyModel.resetServices(mAssetRatioService); + mBuyModel.resetServices(mAssetRatioService, mBlockchainRegistry); } } init(); @@ -279,7 +279,7 @@ public NetworkModel getNetworkModel() { public BuyModel getBuyModel() { if (mBuyModel == null) { - mBuyModel = new BuyModel(mAssetRatioService); + mBuyModel = new BuyModel(mAssetRatioService, mBlockchainRegistry); } return mBuyModel; } @@ -335,21 +335,10 @@ public void setAccountInfosFromKeyRingModel( mNetworkModel.setAccountInfosFromKeyRingModel(accountInfosFromKeyRingModel); } - // TODO: Move to BuyModel class - public void isBuySupported(NetworkInfo selectedNetwork, String assetSymbol, - String contractAddress, String chainId, Callback1 callback) { - TokenUtils.getBuyTokensFiltered( - mBlockchainRegistry, selectedNetwork, TokenUtils.TokenType.ALL, tokens -> { - callback.call(JavaUtils.includes(tokens, - iToken - -> AssetUtils.Filters.isSameToken( - iToken, assetSymbol, contractAddress, chainId))); - }); - } - // Clear buy send swap model public void clearBSS() { mSendModel = null; + mBuyModel = null; } /* diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AssetDetailActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AssetDetailActivity.java index eae9635015de..1f32a5027a9c 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AssetDetailActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/AssetDetailActivity.java @@ -40,6 +40,7 @@ import org.chromium.brave_wallet.mojom.TransactionInfo; import org.chromium.chrome.R; import org.chromium.chrome.browser.app.BraveActivity; +import org.chromium.chrome.browser.app.domain.BuyModel; import org.chromium.chrome.browser.app.domain.WalletModel; import org.chromium.chrome.browser.crypto_wallet.BlockchainRegistryFactory; import org.chromium.chrome.browser.crypto_wallet.adapters.WalletCoinAdapter; @@ -506,8 +507,9 @@ private void showHideBuyUi() { LiveDataUtil.observeOnce(mWalletModel.getCryptoModel().getNetworkModel().mDefaultNetwork, selectedNetwork -> { - mWalletModel.getCryptoModel().isBuySupported(selectedNetwork, mAssetSymbol, - mContractAddress, mChainId, isBuyEnabled -> { + mWalletModel.getCryptoModel().getBuyModel().isBuySupported(selectedNetwork, + mAssetSymbol, mContractAddress, mChainId, + BuyModel.SUPPORTED_RAMP_PROVIDERS, isBuyEnabled -> { if (isBuyEnabled) { AndroidUtils.show(mBtnBuy); } else { diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java index f3cde2984f77..f447614f6a68 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/BuySendSwapActivity.java @@ -971,9 +971,9 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { }); } } else if (mActivityType == ActivityType.BUY) { - String symbol = AssetUtils.mapToRampNetworkSymbol(mCurrentBlockchainToken); - Intent selectPurchaseMethodIntent = SelectPurchaseMethodActivity.getIntent( - this, mCurrentBlockchainToken.chainId, from, symbol, amount); + Intent selectPurchaseMethodIntent = SelectPurchaseMethodActivity.getIntent(this, + mCurrentBlockchainToken.chainId, from, mCurrentBlockchainToken.symbol, + mCurrentBlockchainToken.contractAddress, amount); startActivity(selectPurchaseMethodIntent); } else if (mActivityType == ActivityType.SWAP) { diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java index 35e38834be30..eb5beb3c845e 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java @@ -20,19 +20,24 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.app.BraveActivity; import org.chromium.chrome.browser.app.domain.BuyModel; +import org.chromium.chrome.browser.app.domain.WalletModel; +import org.chromium.chrome.browser.util.LiveDataUtil; import org.chromium.chrome.browser.util.TabUtils; public class SelectPurchaseMethodActivity extends BraveWalletBaseActivity { private static final String CHAIN_ID = "chainId"; private static final String FROM = "from"; - private static final String RAMP_NETWORK_SYMBOL = "rampNetworkSymbol"; + private static final String ASSET_SYMBOL = "assetSymbol"; + private static final String CONTRACT_ADDRESS = "contractAddress"; private static final String AMOUNT = "amount"; private BuyModel mBuyModel; + private WalletModel mWalletModel; private String mChainId; private String mFrom; - private String mRampNetworkSymbol; + private String mAssetSymbol; + private String mContractAddress; private String mAmount; private ViewGroup mRampNetworkLayout; @@ -50,7 +55,8 @@ protected void triggerLayoutInflation() { if (intent != null) { mChainId = intent.getStringExtra(CHAIN_ID); mFrom = intent.getStringExtra(FROM); - mRampNetworkSymbol = intent.getStringExtra(RAMP_NETWORK_SYMBOL); + mAssetSymbol = intent.getStringExtra(ASSET_SYMBOL); + mContractAddress = intent.getStringExtra(CONTRACT_ADDRESS); mAmount = intent.getStringExtra(AMOUNT); } @@ -75,29 +81,49 @@ public void finishNativeInitialization() { BraveActivity activity = BraveActivity.getBraveActivity(); if (activity != null) { - mBuyModel = activity.getWalletModel().getCryptoModel().getBuyModel(); - } - if (mBuyModel != null) { - if (mBuyModel.isAvailable(OnRampProvider.RAMP, getResources())) { - mRampNetworkLayout.setVisibility(View.VISIBLE); - mBuyModel.getBuyUrl(OnRampProvider.RAMP, mChainId, mFrom, mRampNetworkSymbol, - mAmount, - url -> { enableOnRampService(mRampNetworkLayout, mRampButton, url); }); - } - - if (mBuyModel.isAvailable(OnRampProvider.SARDINE, getResources())) { - mSardineLayout.setVisibility(View.VISIBLE); - mBuyModel.getBuyUrl(OnRampProvider.SARDINE, mChainId, mFrom, mRampNetworkSymbol, - mAmount, - url -> { enableOnRampService(mSardineLayout, mSardineButton, url); }); + mWalletModel = activity.getWalletModel(); + if (mWalletModel != null && mWalletModel.getCryptoModel() != null) { + mBuyModel = mWalletModel.getCryptoModel().getBuyModel(); } + } + if (mWalletModel != null && mBuyModel != null) { + LiveDataUtil.observeOnce( + mWalletModel.getCryptoModel().getNetworkModel().mDefaultNetwork, + selectedNetwork -> { + mBuyModel.isBuySupported(selectedNetwork, mAssetSymbol, mContractAddress, + mChainId, new int[] {OnRampProvider.RAMP}, isBuyEnabled -> { + if (isBuyEnabled) { + setupOnRampService(OnRampProvider.RAMP, mRampNetworkLayout, + mRampButton); + } + }); + + mBuyModel.isBuySupported(selectedNetwork, mAssetSymbol, mContractAddress, + mChainId, new int[] {OnRampProvider.SARDINE}, isBuyEnabled -> { + if (isBuyEnabled) { + setupOnRampService(OnRampProvider.SARDINE, mSardineLayout, + mSardineButton); + } + }); + + mBuyModel.isBuySupported(selectedNetwork, mAssetSymbol, mContractAddress, + mChainId, new int[] {OnRampProvider.TRANSAK}, isBuyEnabled -> { + if (isBuyEnabled) { + setupOnRampService(OnRampProvider.TRANSAK, mTransakLayout, + mTransakButton); + } + }); + }); + } + } - if (mBuyModel.isAvailable(OnRampProvider.TRANSAK, getResources())) { - mTransakLayout.setVisibility(View.VISIBLE); - mBuyModel.getBuyUrl(OnRampProvider.TRANSAK, mChainId, mFrom, mRampNetworkSymbol, - mAmount, - url -> { enableOnRampService(mTransakLayout, mTransakButton, url); }); - } + private void setupOnRampService( + int onRampProvider, ViewGroup onRampLayout, Button onRampButton) { + if (mBuyModel.isAvailable(onRampProvider, getResources())) { + onRampLayout.setVisibility(View.VISIBLE); + mBuyModel.getBuyUrl(onRampProvider, mChainId, mFrom, mAssetSymbol, mAmount, + mContractAddress, + url -> { enableOnRampService(onRampLayout, onRampButton, url); }); } } @@ -113,12 +139,13 @@ private void enableOnRampService( } } - public static Intent getIntent( - Context context, String chainId, String from, String rampNetworkSymbol, String amount) { + public static Intent getIntent(Context context, String chainId, String from, + String rampNetworkSymbol, String contractAddress, String amount) { Intent intent = new Intent(context, SelectPurchaseMethodActivity.class); intent.putExtra(CHAIN_ID, chainId); intent.putExtra(FROM, from); - intent.putExtra(RAMP_NETWORK_SYMBOL, rampNetworkSymbol); + intent.putExtra(ASSET_SYMBOL, rampNetworkSymbol); + intent.putExtra(CONTRACT_ADDRESS, contractAddress); intent.putExtra(AMOUNT, amount); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); return intent; diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/EditVisibleAssetsBottomSheetDialogFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/EditVisibleAssetsBottomSheetDialogFragment.java index 955a3bada4fa..eeacf9f1e9bc 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/EditVisibleAssetsBottomSheetDialogFragment.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/EditVisibleAssetsBottomSheetDialogFragment.java @@ -49,6 +49,7 @@ import org.chromium.brave_wallet.mojom.NetworkInfo; import org.chromium.chrome.R; import org.chromium.chrome.browser.app.BraveActivity; +import org.chromium.chrome.browser.app.domain.BuyModel; import org.chromium.chrome.browser.app.domain.WalletModel; import org.chromium.chrome.browser.crypto_wallet.BlockchainRegistryFactory; import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletBaseActivity; @@ -278,7 +279,7 @@ public void onClick(View clickView) { tokens -> { setUpAssetsList(view, tokens, new BlockchainToken[0]); }); } else if (mType == WalletCoinAdapter.AdapterType.BUY_ASSETS_LIST) { TokenUtils.getBuyTokensFiltered(blockchainRegistry, mSelectedNetwork, - TokenUtils.TokenType.ALL, + TokenUtils.TokenType.ALL, BuyModel.SUPPORTED_RAMP_PROVIDERS, tokens -> { setUpAssetsList(view, tokens, new BlockchainToken[0]); }); } } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/AssetUtils.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/AssetUtils.java index a4561f2c00ea..373d519d6055 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/AssetUtils.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/util/AssetUtils.java @@ -133,21 +133,21 @@ public static String getKeyringForCoinType(int coinType) { return coin; } - public static String mapToRampNetworkSymbol(@NonNull BlockchainToken asset) { - String assetChainId = asset.chainId; - if (asset.symbol.equalsIgnoreCase("bat") + public static String mapToRampNetworkSymbol( + String assetChainId, String assetSymbol, String contractAddress) { + if (assetSymbol.equalsIgnoreCase("bat") && assetChainId.equals(BraveWalletConstants.MAINNET_CHAIN_ID)) { // BAT is the only token on Ethereum Mainnet with a prefix on Ramp.Network return "ETH_BAT"; } else if (assetChainId.equals(BraveWalletConstants.AVALANCHE_MAINNET_CHAIN_ID) - && TextUtils.isEmpty(asset.contractAddress)) { + && TextUtils.isEmpty(contractAddress)) { // AVAX native token has no prefix - return asset.symbol; + return assetSymbol; } else { - String rampNetworkPrefix = getRampNetworkPrefix(asset.chainId); + String rampNetworkPrefix = getRampNetworkPrefix(assetChainId); return TextUtils.isEmpty(rampNetworkPrefix) - ? asset.symbol.toUpperCase(Locale.ENGLISH) - : rampNetworkPrefix + "_" + asset.symbol.toUpperCase(Locale.ENGLISH); + ? assetSymbol.toUpperCase(Locale.ENGLISH) + : rampNetworkPrefix + "_" + assetSymbol.toUpperCase(Locale.ENGLISH); } } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/TokenUtils.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/TokenUtils.java index 383a20854e60..73fd16a14dc7 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/TokenUtils.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/util/TokenUtils.java @@ -120,9 +120,9 @@ public static void getUserOrAllTokensFiltered(BraveWalletService braveWalletServ } public static void getBuyTokensFiltered(BlockchainRegistry blockchainRegistry, - NetworkInfo selectedNetwork, TokenType tokenType, + NetworkInfo selectedNetwork, TokenType tokenType, int[] rampProviders, Callbacks.Callback1 callback) { - blockchainRegistry.getBuyTokens(OnRampProvider.RAMP, selectedNetwork.chainId, tokens -> { + blockchainRegistry.getProvidersBuyTokens(rampProviders, selectedNetwork.chainId, tokens -> { BlockchainToken[] filteredTokens = filterTokens(selectedNetwork, tokens, tokenType, false); Arrays.sort(filteredTokens, blockchainTokenComparatorPerGasOrBatType); From 5a1d52c4c196baab993437807dd9b664644e712e Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Fri, 3 Feb 2023 16:13:38 +0100 Subject: [PATCH 18/36] Improve on-ramp setup --- .../SelectPurchaseMethodActivity.java | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java index eb5beb3c845e..d179e0d1fe81 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java @@ -92,34 +92,28 @@ public void finishNativeInitialization() { selectedNetwork -> { mBuyModel.isBuySupported(selectedNetwork, mAssetSymbol, mContractAddress, mChainId, new int[] {OnRampProvider.RAMP}, isBuyEnabled -> { - if (isBuyEnabled) { - setupOnRampService(OnRampProvider.RAMP, mRampNetworkLayout, - mRampButton); - } + setupOnRampService(isBuyEnabled, OnRampProvider.RAMP, + mRampNetworkLayout, mRampButton); }); mBuyModel.isBuySupported(selectedNetwork, mAssetSymbol, mContractAddress, mChainId, new int[] {OnRampProvider.SARDINE}, isBuyEnabled -> { - if (isBuyEnabled) { - setupOnRampService(OnRampProvider.SARDINE, mSardineLayout, - mSardineButton); - } + setupOnRampService(isBuyEnabled, OnRampProvider.SARDINE, + mSardineLayout, mSardineButton); }); mBuyModel.isBuySupported(selectedNetwork, mAssetSymbol, mContractAddress, mChainId, new int[] {OnRampProvider.TRANSAK}, isBuyEnabled -> { - if (isBuyEnabled) { - setupOnRampService(OnRampProvider.TRANSAK, mTransakLayout, - mTransakButton); - } + setupOnRampService(isBuyEnabled, OnRampProvider.TRANSAK, + mTransakLayout, mTransakButton); }); }); } } private void setupOnRampService( - int onRampProvider, ViewGroup onRampLayout, Button onRampButton) { - if (mBuyModel.isAvailable(onRampProvider, getResources())) { + boolean isBuyEnabled, int onRampProvider, ViewGroup onRampLayout, Button onRampButton) { + if (isBuyEnabled && mBuyModel.isAvailable(onRampProvider, getResources())) { onRampLayout.setVisibility(View.VISIBLE); mBuyModel.getBuyUrl(onRampProvider, mChainId, mFrom, mAssetSymbol, mAmount, mContractAddress, From 024e4cffac7bf10818494559b75011897f17d377 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Fri, 3 Feb 2023 17:41:27 +0100 Subject: [PATCH 19/36] Remove log --- components/brave_wallet/browser/blockchain_registry.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/components/brave_wallet/browser/blockchain_registry.cc b/components/brave_wallet/browser/blockchain_registry.cc index 0237b10dd5db..38776b1e3380 100644 --- a/components/brave_wallet/browser/blockchain_registry.cc +++ b/components/brave_wallet/browser/blockchain_registry.cc @@ -152,7 +152,6 @@ BlockchainRegistry::GetBuyTokens( blockchain_buy_tokens.push_back( brave_wallet::mojom::BlockchainToken::New(token)); } - LOG(ERROR) << "blockchain_buy_tokens size: " << blockchain_buy_tokens.size(); return blockchain_buy_tokens; } From 6eda60f6cdf8dab0d82a55bfa414005a984b16ef Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Mon, 6 Feb 2023 12:42:28 +0100 Subject: [PATCH 20/36] Perform minor refactoring --- .../browser/blockchain_registry.cc | 18 +++++++++--------- .../browser/brave_wallet_constants.cc | 16 ++++++++-------- .../browser/brave_wallet_constants.h | 8 ++++---- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/components/brave_wallet/browser/blockchain_registry.cc b/components/brave_wallet/browser/blockchain_registry.cc index 38776b1e3380..5f0d8af4ae5c 100644 --- a/components/brave_wallet/browser/blockchain_registry.cc +++ b/components/brave_wallet/browser/blockchain_registry.cc @@ -121,26 +121,26 @@ BlockchainRegistry::GetBuyTokens( const std::vector& providers, const std::string& chain_id) { std::vector blockchain_buy_tokens; - std::vector buy_tokens; + std::set buy_tokens; if (std::find(providers.begin(), providers.end(), mojom::OnRampProvider::kWyre) != providers.end()) { - buy_tokens.insert(std::end(buy_tokens), std::begin(GetWyreBuyTokens()), - std::end(GetWyreBuyTokens())); + std::set wyre_buy_tokens = GetWyreBuyTokens(); + buy_tokens.insert(wyre_buy_tokens.begin(), wyre_buy_tokens.end()); } if (std::find(providers.begin(), providers.end(), mojom::OnRampProvider::kRamp) != providers.end()) { - buy_tokens.insert(std::end(buy_tokens), std::begin(GetRampBuyTokens()), - std::end(GetRampBuyTokens())); + std::set ramp_buy_tokens = GetRampBuyTokens(); + buy_tokens.insert(ramp_buy_tokens.begin(), ramp_buy_tokens.end()); } if (std::find(providers.begin(), providers.end(), mojom::OnRampProvider::kSardine) != providers.end()) { - buy_tokens.insert(std::end(buy_tokens), std::begin(GetSardineBuyTokens()), - std::end(GetSardineBuyTokens())); + std::set sardine_buy_tokens = GetSardineBuyTokens(); + buy_tokens.insert(sardine_buy_tokens.begin(), sardine_buy_tokens.end()); } if (std::find(providers.begin(), providers.end(), mojom::OnRampProvider::kTransak) != providers.end()) { - buy_tokens.insert(std::end(buy_tokens), std::begin(GetTransakBuyTokens()), - std::end(GetTransakBuyTokens())); + std::set transak_buy_tokens = GetTransakBuyTokens(); + buy_tokens.insert(transak_buy_tokens.begin(), transak_buy_tokens.end()); } if (buy_tokens.empty()) { return blockchain_buy_tokens; diff --git a/components/brave_wallet/browser/brave_wallet_constants.cc b/components/brave_wallet/browser/brave_wallet_constants.cc index 941a52153521..a4397f9b244d 100644 --- a/components/brave_wallet/browser/brave_wallet_constants.cc +++ b/components/brave_wallet/browser/brave_wallet_constants.cc @@ -12,8 +12,8 @@ namespace brave_wallet { -const std::vector& GetWyreBuyTokens() { - static base::NoDestructor> tokens( +const std::set& GetWyreBuyTokens() { + static base::NoDestructor> tokens( {{"", "Avalanche", "", false, false, false, "AVAX", 18, true, "", "", mojom::kAvalancheMainnetChainId, mojom::CoinType::ETH}, {"0x0D8775F648430679A709E98d2b0Cb6250d2887EF", "Basic Attention Token", @@ -95,8 +95,8 @@ const std::vector& GetWyreBuyTokens() { return *tokens; } -const std::vector& GetRampBuyTokens() { - static base::NoDestructor> tokens( +const std::set& GetRampBuyTokens() { + static base::NoDestructor> tokens( {{"", "Ethereum", "", false, false, false, "ETH", 18, true, "", "", mojom::kMainnetChainId, mojom::CoinType::ETH}, {"", "BNB", "", true, false, false, "BNB", 18, true, "", "", @@ -164,8 +164,8 @@ const std::vector& GetRampBuyTokens() { return *tokens; } -const std::vector& GetSardineBuyTokens() { - static base::NoDestructor> tokens( +const std::set& GetSardineBuyTokens() { + static base::NoDestructor> tokens( {{"", "Ethereum", "", false, false, false, "ETH", 18, true, "", "", mojom::kMainnetChainId, mojom::CoinType::ETH}, {"0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", "AAVE", "aave.png", true, @@ -251,8 +251,8 @@ const std::vector& GetSardineBuyTokens() { return *tokens; } -const std::vector& GetTransakBuyTokens() { - static base::NoDestructor> tokens( +const std::set& GetTransakBuyTokens() { + static base::NoDestructor> tokens( {{"", "Ethereum", "", false, false, false, "ETH", 18, true, "", "", mojom::kMainnetChainId, mojom::CoinType::ETH}, {"", "Ethereum", "", false, false, false, "ETH", 18, true, "", "", diff --git a/components/brave_wallet/browser/brave_wallet_constants.h b/components/brave_wallet/browser/brave_wallet_constants.h index fefbe773940d..716176963878 100644 --- a/components/brave_wallet/browser/brave_wallet_constants.h +++ b/components/brave_wallet/browser/brave_wallet_constants.h @@ -1207,11 +1207,11 @@ constexpr char kSolanaPrefKey[] = "solana"; constexpr char kEthereumBlockTagEarliest[] = "earliest"; constexpr char kEthereumBlockTagLatest[] = "latest"; -const std::vector& GetWyreBuyTokens(); -const std::vector& GetRampBuyTokens(); +const std::set& GetWyreBuyTokens(); +const std::set& GetRampBuyTokens(); const std::vector& GetOnRampCurrenciesList(); -const std::vector& GetSardineBuyTokens(); -const std::vector& GetTransakBuyTokens(); +const std::set& GetSardineBuyTokens(); +const std::set& GetTransakBuyTokens(); const std::string GetSardineNetworkName(const std::string& chain_id); const base::flat_map& GetInfuraChainEndpoints(); bool HasJupiterFeesForTokenMint(const std::string& mint); From 1a9bf3e8b0a0669c275708630ae5f82b18796dc7 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Mon, 6 Feb 2023 12:44:51 +0100 Subject: [PATCH 21/36] Apply code formatting --- components/brave_wallet/browser/blockchain_registry.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/brave_wallet/browser/blockchain_registry.cc b/components/brave_wallet/browser/blockchain_registry.cc index 5f0d8af4ae5c..768c2405e1e0 100644 --- a/components/brave_wallet/browser/blockchain_registry.cc +++ b/components/brave_wallet/browser/blockchain_registry.cc @@ -134,12 +134,12 @@ BlockchainRegistry::GetBuyTokens( } if (std::find(providers.begin(), providers.end(), mojom::OnRampProvider::kSardine) != providers.end()) { - std::set sardine_buy_tokens = GetSardineBuyTokens(); + std::set sardine_buy_tokens = GetSardineBuyTokens(); buy_tokens.insert(sardine_buy_tokens.begin(), sardine_buy_tokens.end()); } if (std::find(providers.begin(), providers.end(), mojom::OnRampProvider::kTransak) != providers.end()) { - std::set transak_buy_tokens = GetTransakBuyTokens(); + std::set transak_buy_tokens = GetTransakBuyTokens(); buy_tokens.insert(transak_buy_tokens.begin(), transak_buy_tokens.end()); } if (buy_tokens.empty()) { From 60a91f7594ed13f7f74ea57c2259c30e622c2052 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Mon, 6 Feb 2023 13:52:52 +0100 Subject: [PATCH 22/36] Add missing include --- components/brave_wallet/browser/blockchain_registry.cc | 1 + components/brave_wallet/browser/brave_wallet_constants.cc | 1 + components/brave_wallet/browser/brave_wallet_constants.h | 1 + 3 files changed, 3 insertions(+) diff --git a/components/brave_wallet/browser/blockchain_registry.cc b/components/brave_wallet/browser/blockchain_registry.cc index 768c2405e1e0..548ac6fc99f2 100644 --- a/components/brave_wallet/browser/blockchain_registry.cc +++ b/components/brave_wallet/browser/blockchain_registry.cc @@ -5,6 +5,7 @@ #include "brave/components/brave_wallet/browser/blockchain_registry.h" +#include #include #include "base/ranges/algorithm.h" diff --git a/components/brave_wallet/browser/brave_wallet_constants.cc b/components/brave_wallet/browser/brave_wallet_constants.cc index a4397f9b244d..5d17dbc0c99a 100644 --- a/components/brave_wallet/browser/brave_wallet_constants.cc +++ b/components/brave_wallet/browser/brave_wallet_constants.cc @@ -4,6 +4,7 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include +#include #include #include "base/containers/contains.h" diff --git a/components/brave_wallet/browser/brave_wallet_constants.h b/components/brave_wallet/browser/brave_wallet_constants.h index 716176963878..6aa843e603ab 100644 --- a/components/brave_wallet/browser/brave_wallet_constants.h +++ b/components/brave_wallet/browser/brave_wallet_constants.h @@ -6,6 +6,7 @@ #ifndef BRAVE_COMPONENTS_BRAVE_WALLET_BROWSER_BRAVE_WALLET_CONSTANTS_H_ #define BRAVE_COMPONENTS_BRAVE_WALLET_BROWSER_BRAVE_WALLET_CONSTANTS_H_ +#include #include #include From 918745c8e9d09c615e4d429a9bec9a0736281ac8 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Mon, 6 Feb 2023 16:24:16 +0100 Subject: [PATCH 23/36] Revert vector to set implementation --- .../browser/blockchain_registry.cc | 18 +++++++++--------- .../browser/brave_wallet_constants.cc | 16 ++++++++-------- .../browser/brave_wallet_constants.h | 8 ++++---- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/components/brave_wallet/browser/blockchain_registry.cc b/components/brave_wallet/browser/blockchain_registry.cc index 548ac6fc99f2..06923d414d7a 100644 --- a/components/brave_wallet/browser/blockchain_registry.cc +++ b/components/brave_wallet/browser/blockchain_registry.cc @@ -122,26 +122,26 @@ BlockchainRegistry::GetBuyTokens( const std::vector& providers, const std::string& chain_id) { std::vector blockchain_buy_tokens; - std::set buy_tokens; + std::vector buy_tokens; if (std::find(providers.begin(), providers.end(), mojom::OnRampProvider::kWyre) != providers.end()) { - std::set wyre_buy_tokens = GetWyreBuyTokens(); - buy_tokens.insert(wyre_buy_tokens.begin(), wyre_buy_tokens.end()); + std::vector wyre_buy_tokens = GetWyreBuyTokens(); + buy_tokens.insert(buy_tokens.begin(), wyre_buy_tokens.begin(), wyre_buy_tokens.end()); } if (std::find(providers.begin(), providers.end(), mojom::OnRampProvider::kRamp) != providers.end()) { - std::set ramp_buy_tokens = GetRampBuyTokens(); - buy_tokens.insert(ramp_buy_tokens.begin(), ramp_buy_tokens.end()); + std::vector ramp_buy_tokens = GetRampBuyTokens(); + buy_tokens.insert(buy_tokens.begin(), ramp_buy_tokens.begin(), ramp_buy_tokens.end()); } if (std::find(providers.begin(), providers.end(), mojom::OnRampProvider::kSardine) != providers.end()) { - std::set sardine_buy_tokens = GetSardineBuyTokens(); - buy_tokens.insert(sardine_buy_tokens.begin(), sardine_buy_tokens.end()); + std::vector sardine_buy_tokens = GetSardineBuyTokens(); + buy_tokens.insert(buy_tokens.begin(), sardine_buy_tokens.begin(), sardine_buy_tokens.end()); } if (std::find(providers.begin(), providers.end(), mojom::OnRampProvider::kTransak) != providers.end()) { - std::set transak_buy_tokens = GetTransakBuyTokens(); - buy_tokens.insert(transak_buy_tokens.begin(), transak_buy_tokens.end()); + std::vector transak_buy_tokens = GetTransakBuyTokens(); + buy_tokens.insert(buy_tokens.begin(), transak_buy_tokens.begin(), transak_buy_tokens.end()); } if (buy_tokens.empty()) { return blockchain_buy_tokens; diff --git a/components/brave_wallet/browser/brave_wallet_constants.cc b/components/brave_wallet/browser/brave_wallet_constants.cc index 5d17dbc0c99a..c04e504cba5e 100644 --- a/components/brave_wallet/browser/brave_wallet_constants.cc +++ b/components/brave_wallet/browser/brave_wallet_constants.cc @@ -13,8 +13,8 @@ namespace brave_wallet { -const std::set& GetWyreBuyTokens() { - static base::NoDestructor> tokens( +const std::vector& GetWyreBuyTokens() { + static base::NoDestructor> tokens( {{"", "Avalanche", "", false, false, false, "AVAX", 18, true, "", "", mojom::kAvalancheMainnetChainId, mojom::CoinType::ETH}, {"0x0D8775F648430679A709E98d2b0Cb6250d2887EF", "Basic Attention Token", @@ -96,8 +96,8 @@ const std::set& GetWyreBuyTokens() { return *tokens; } -const std::set& GetRampBuyTokens() { - static base::NoDestructor> tokens( +const std::vector& GetRampBuyTokens() { + static base::NoDestructor> tokens( {{"", "Ethereum", "", false, false, false, "ETH", 18, true, "", "", mojom::kMainnetChainId, mojom::CoinType::ETH}, {"", "BNB", "", true, false, false, "BNB", 18, true, "", "", @@ -165,8 +165,8 @@ const std::set& GetRampBuyTokens() { return *tokens; } -const std::set& GetSardineBuyTokens() { - static base::NoDestructor> tokens( +const std::vector& GetSardineBuyTokens() { + static base::NoDestructor> tokens( {{"", "Ethereum", "", false, false, false, "ETH", 18, true, "", "", mojom::kMainnetChainId, mojom::CoinType::ETH}, {"0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", "AAVE", "aave.png", true, @@ -252,8 +252,8 @@ const std::set& GetSardineBuyTokens() { return *tokens; } -const std::set& GetTransakBuyTokens() { - static base::NoDestructor> tokens( +const std::vector& GetTransakBuyTokens() { + static base::NoDestructor> tokens( {{"", "Ethereum", "", false, false, false, "ETH", 18, true, "", "", mojom::kMainnetChainId, mojom::CoinType::ETH}, {"", "Ethereum", "", false, false, false, "ETH", 18, true, "", "", diff --git a/components/brave_wallet/browser/brave_wallet_constants.h b/components/brave_wallet/browser/brave_wallet_constants.h index 6aa843e603ab..4482d68a5d81 100644 --- a/components/brave_wallet/browser/brave_wallet_constants.h +++ b/components/brave_wallet/browser/brave_wallet_constants.h @@ -1208,11 +1208,11 @@ constexpr char kSolanaPrefKey[] = "solana"; constexpr char kEthereumBlockTagEarliest[] = "earliest"; constexpr char kEthereumBlockTagLatest[] = "latest"; -const std::set& GetWyreBuyTokens(); -const std::set& GetRampBuyTokens(); +const std::vector& GetWyreBuyTokens(); +const std::vector& GetRampBuyTokens(); const std::vector& GetOnRampCurrenciesList(); -const std::set& GetSardineBuyTokens(); -const std::set& GetTransakBuyTokens(); +const std::vector& GetSardineBuyTokens(); +const std::vector& GetTransakBuyTokens(); const std::string GetSardineNetworkName(const std::string& chain_id); const base::flat_map& GetInfuraChainEndpoints(); bool HasJupiterFeesForTokenMint(const std::string& mint); From 39f68ba27291df27f4b0ccb94a8bd296b54d2dcb Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Mon, 6 Feb 2023 17:30:23 +0100 Subject: [PATCH 24/36] Remove duplicates --- .../adapters/WalletCoinAdapter.java | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java index 87438a7bd539..c416fa1cde84 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java @@ -241,7 +241,7 @@ public void setWalletCoinAdapterType(AdapterType type) { } public void setWalletListItemModelList(List walletListItemModelList) { - this.walletListItemModelList = walletListItemModelList; + this.walletListItemModelList = removeDuplicates(walletListItemModelList); if (mType == AdapterType.EDIT_VISIBLE_ASSETS_LIST || mType == AdapterType.BUY_ASSETS_LIST || mType == AdapterType.SEND_ASSETS_LIST || mType == AdapterType.SWAP_TO_ASSETS_LIST || mType == AdapterType.SWAP_FROM_ASSETS_LIST) { @@ -305,6 +305,43 @@ public void updateSelectedNetwork(String title, String subTitle) { } } + // Removing duplicates will allow the recycler viewer to render a clean list without showing the + // same assets multiple times. Currently, the list of available assets is fetched from Core + // API the returns a merged list containing the available assets per ramp provider. + // It's not unusual to have the same asset multiple times with a contract address all upper case + // from a ramp provider and all lower case from another one. Thus it's important to compare the + // contract addresses ignoring case. + private List removeDuplicates( + List walletListItemModelList) { + List result = new ArrayList<>(); + for (WalletListItemModel item : walletListItemModelList) { + if (item.getBlockchainToken() == null) { + // If blockchain token is null the item can be safely add without any risk + // of duplication. + result.add(item); + continue; + } + String contractAddress = item.getBlockchainToken().contractAddress; + boolean duplicate = false; + for (WalletListItemModel itemResult : result) { + // IMPORTANT: use `equalsIgnoreCase` to detect two contract addresses with different + // capitalization. + if (contractAddress.equalsIgnoreCase( + itemResult.getBlockchainToken().contractAddress)) { + // Duplicated item detected! + duplicate = true; + break; + } + } + // Do not add duplicated item. + if (!duplicate) { + result.add(item); + } + } + + return result; + } + private void updateSelectedNetwork(int selectedAccountPosition) { walletListItemModelList.get(previousSelectedPos).setIsUserSelected(false); notifyItemChanged(previousSelectedPos); From c212874917a5309b4c3a8fa62adbec621efda9c0 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Mon, 6 Feb 2023 17:30:36 +0100 Subject: [PATCH 25/36] Apply code formatting --- .../browser/blockchain_registry.cc | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/components/brave_wallet/browser/blockchain_registry.cc b/components/brave_wallet/browser/blockchain_registry.cc index 06923d414d7a..3ac605718905 100644 --- a/components/brave_wallet/browser/blockchain_registry.cc +++ b/components/brave_wallet/browser/blockchain_registry.cc @@ -126,22 +126,28 @@ BlockchainRegistry::GetBuyTokens( if (std::find(providers.begin(), providers.end(), mojom::OnRampProvider::kWyre) != providers.end()) { std::vector wyre_buy_tokens = GetWyreBuyTokens(); - buy_tokens.insert(buy_tokens.begin(), wyre_buy_tokens.begin(), wyre_buy_tokens.end()); + buy_tokens.insert(buy_tokens.begin(), wyre_buy_tokens.begin(), + wyre_buy_tokens.end()); } if (std::find(providers.begin(), providers.end(), mojom::OnRampProvider::kRamp) != providers.end()) { std::vector ramp_buy_tokens = GetRampBuyTokens(); - buy_tokens.insert(buy_tokens.begin(), ramp_buy_tokens.begin(), ramp_buy_tokens.end()); + buy_tokens.insert(buy_tokens.begin(), ramp_buy_tokens.begin(), + ramp_buy_tokens.end()); } if (std::find(providers.begin(), providers.end(), mojom::OnRampProvider::kSardine) != providers.end()) { - std::vector sardine_buy_tokens = GetSardineBuyTokens(); - buy_tokens.insert(buy_tokens.begin(), sardine_buy_tokens.begin(), sardine_buy_tokens.end()); + std::vector sardine_buy_tokens = + GetSardineBuyTokens(); + buy_tokens.insert(buy_tokens.begin(), sardine_buy_tokens.begin(), + sardine_buy_tokens.end()); } if (std::find(providers.begin(), providers.end(), mojom::OnRampProvider::kTransak) != providers.end()) { - std::vector transak_buy_tokens = GetTransakBuyTokens(); - buy_tokens.insert(buy_tokens.begin(), transak_buy_tokens.begin(), transak_buy_tokens.end()); + std::vector transak_buy_tokens = + GetTransakBuyTokens(); + buy_tokens.insert(buy_tokens.begin(), transak_buy_tokens.begin(), + transak_buy_tokens.end()); } if (buy_tokens.empty()) { return blockchain_buy_tokens; From c7b68913e6dac9364d05b68e529031a37ba93699 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Mon, 6 Feb 2023 18:12:16 +0100 Subject: [PATCH 26/36] Update Sardine logo --- android/java/res/drawable-night/sardine_logo.xml | 2 +- android/java/res/drawable/sardine_logo.xml | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/android/java/res/drawable-night/sardine_logo.xml b/android/java/res/drawable-night/sardine_logo.xml index bce9cd3ab9ed..a1e04837cccc 100644 --- a/android/java/res/drawable-night/sardine_logo.xml +++ b/android/java/res/drawable-night/sardine_logo.xml @@ -5,5 +5,5 @@ --> - + diff --git a/android/java/res/drawable/sardine_logo.xml b/android/java/res/drawable/sardine_logo.xml index e4e59eccc133..d7aba2dec039 100644 --- a/android/java/res/drawable/sardine_logo.xml +++ b/android/java/res/drawable/sardine_logo.xml @@ -3,12 +3,10 @@ License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. --> - + - - - - + + From e3dded47aa085decea847e0e395302142cbd565d Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Tue, 7 Feb 2023 11:14:49 +0100 Subject: [PATCH 27/36] Fix duplication in search --- .../browser/crypto_wallet/adapters/WalletCoinAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java index c416fa1cde84..aea1aed7f2ac 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java @@ -245,7 +245,7 @@ public void setWalletListItemModelList(List walletListItemM if (mType == AdapterType.EDIT_VISIBLE_ASSETS_LIST || mType == AdapterType.BUY_ASSETS_LIST || mType == AdapterType.SEND_ASSETS_LIST || mType == AdapterType.SWAP_TO_ASSETS_LIST || mType == AdapterType.SWAP_FROM_ASSETS_LIST) { - walletListItemModelListCopy.addAll(walletListItemModelList); + walletListItemModelListCopy.addAll(this.walletListItemModelList); mCheckedPositions.clear(); } for (int i = 0; i < walletListItemModelListCopy.size(); i++) { From db6c9e620b62620d2ce6bccea3681e9ba25c2dd0 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Tue, 7 Feb 2023 11:46:16 +0100 Subject: [PATCH 28/36] Move currency code USD to WalletConstants --- .../org/chromium/chrome/browser/app/domain/BuyModel.java | 6 +++--- .../chrome/browser/crypto_wallet/util/WalletConstants.java | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java b/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java index 6aad91e342e4..959b6f87afa8 100644 --- a/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java +++ b/android/java/org/chromium/chrome/browser/app/domain/BuyModel.java @@ -17,6 +17,7 @@ import org.chromium.chrome.browser.crypto_wallet.util.AssetUtils; import org.chromium.chrome.browser.crypto_wallet.util.JavaUtils; import org.chromium.chrome.browser.crypto_wallet.util.TokenUtils; +import org.chromium.chrome.browser.crypto_wallet.util.WalletConstants; import org.chromium.mojo.bindings.Callbacks.Callback1; import java.util.Locale; @@ -25,7 +26,6 @@ public class BuyModel { public static final int[] SUPPORTED_RAMP_PROVIDERS = { OnRampProvider.RAMP, OnRampProvider.SARDINE, OnRampProvider.TRANSAK}; - private static final String CURRENCY_CODE_USD = "USD"; private final Object mLock = new Object(); private AssetRatioService mAssetRatioService; private BlockchainRegistry mBlockchainRegistry; @@ -51,8 +51,8 @@ public void getBuyUrl(int onRampProvider, String chainId, String from, String sy // Ramp.Network is a special case that requires a modified asset symbol. symbol = AssetUtils.mapToRampNetworkSymbol(chainId, symbol, contractAddress); } - mAssetRatioService.getBuyUrlV1( - onRampProvider, chainId, from, symbol, amount, CURRENCY_CODE_USD, (url, error) -> { + mAssetRatioService.getBuyUrlV1(onRampProvider, chainId, from, symbol, amount, + WalletConstants.CURRENCY_CODE_USD, (url, error) -> { if (error != null && !error.isEmpty()) { callback.OnUrlReady(null); return; diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletConstants.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletConstants.java index f0c27dc90a8c..3b91b4865bb0 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletConstants.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/util/WalletConstants.java @@ -10,6 +10,9 @@ public final class WalletConstants { public static final long MILLI_SECOND = 1000; + // USD currency code used by on-ramp providers. + public static final String CURRENCY_CODE_USD = "USD"; + // Android public static final String LINE_SEPARATOR = "line.separator"; From 4a45fc8f6a35e6598d3950df6d9d7159a411c348 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Tue, 7 Feb 2023 11:46:33 +0100 Subject: [PATCH 29/36] Improve code comments --- .../browser/crypto_wallet/adapters/WalletCoinAdapter.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java index aea1aed7f2ac..14dbc734bad3 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java @@ -308,9 +308,9 @@ public void updateSelectedNetwork(String title, String subTitle) { // Removing duplicates will allow the recycler viewer to render a clean list without showing the // same assets multiple times. Currently, the list of available assets is fetched from Core // API the returns a merged list containing the available assets per ramp provider. - // It's not unusual to have the same asset multiple times with a contract address all upper case - // from a ramp provider and all lower case from another one. Thus it's important to compare the - // contract addresses ignoring case. + // It's not unusual to have the same asset multiple times with the same contract address all + // upper case from a ramp provider and all lower case from another one. Thus it's important to + // compare the contract addresses ignoring case. private List removeDuplicates( List walletListItemModelList) { List result = new ArrayList<>(); From 3261b16af842137a6fc5be1a7686f7b7d57f542e Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Tue, 7 Feb 2023 12:35:09 +0100 Subject: [PATCH 30/36] Optimize string resources --- .../activities/SelectPurchaseMethodActivity.java | 9 +++++++++ .../layout/activity_select_purchase_method.xml | 3 --- .../ui/android/strings/android_brave_strings.grd | 15 ++++++--------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java index d179e0d1fe81..a1d52fed2147 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/activities/SelectPurchaseMethodActivity.java @@ -14,6 +14,7 @@ import android.view.ViewGroup; import android.widget.Button; +import androidx.annotation.StringRes; import androidx.appcompat.widget.Toolbar; import org.chromium.brave_wallet.mojom.OnRampProvider; @@ -69,8 +70,11 @@ protected void triggerLayoutInflation() { mTransakLayout = findViewById(R.id.transak_container); mRampButton = findViewById(R.id.purchase_method_btn_ramp); + mRampButton.setText(getRampProviderTextButton(R.string.brave_wallet_ramp_network_short)); mSardineButton = findViewById(R.id.purchase_method_btn_sardine); + mSardineButton.setText(getRampProviderTextButton(R.string.brave_wallet_sardine_title)); mTransakButton = findViewById(R.id.purchase_method_btn_transak); + mTransakButton.setText(getRampProviderTextButton(R.string.brave_wallet_transak_title)); onInitialLayoutInflationComplete(); } @@ -111,6 +115,11 @@ public void finishNativeInitialization() { } } + private String getRampProviderTextButton(@StringRes int providerNameResource) { + return String.format(getString(R.string.brave_wallet_buy_with_ramp_provider), + getString(providerNameResource)); + } + private void setupOnRampService( boolean isBuyEnabled, int onRampProvider, ViewGroup onRampLayout, Button onRampButton) { if (isBuyEnabled && mBuyModel.isAvailable(onRampProvider, getResources())) { diff --git a/android/java/res/layout/activity_select_purchase_method.xml b/android/java/res/layout/activity_select_purchase_method.xml index fa3b7af82602..1b87841bb46d 100644 --- a/android/java/res/layout/activity_select_purchase_method.xml +++ b/android/java/res/layout/activity_select_purchase_method.xml @@ -96,7 +96,6 @@ style="@style/BraveWalletButtonHollow" android:layout_gravity="start" android:layout_marginVertical="8dp" - android:text="@string/brave_wallet_buy_with_ramp_network" android:textSize="18sp" /> @@ -152,7 +151,6 @@ style="@style/BraveWalletButtonHollow" android:layout_gravity="start" android:layout_marginVertical="8dp" - android:text="@string/brave_wallet_buy_with_sardine" android:textSize="18sp" /> @@ -209,7 +207,6 @@ style="@style/BraveWalletButtonHollow" android:layout_gravity="start" android:layout_marginVertical="8dp" - android:text="@string/brave_wallet_buy_with_transak" android:textSize="18sp" /> diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd index b8ed6dcbad33..022f82eb7124 100644 --- a/browser/ui/android/strings/android_brave_strings.grd +++ b/browser/ui/android/strings/android_brave_strings.grd @@ -2103,20 +2103,17 @@ Are you sure you want to do this? Ramp.Network + + Ramp + Sardine - + Transak - - Buy with Ramp - - - Buy with Sardine - - - Buy with Transak + + Buy with %1$s Clear transaction & nonce info From f0cb25a531e6f0386297c3c0110dbfc524c6dbd0 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Tue, 7 Feb 2023 12:36:37 +0100 Subject: [PATCH 31/36] Capitalize string --- browser/ui/android/strings/android_brave_strings.grd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd index 022f82eb7124..f09321608504 100644 --- a/browser/ui/android/strings/android_brave_strings.grd +++ b/browser/ui/android/strings/android_brave_strings.grd @@ -2041,7 +2041,7 @@ Are you sure you want to do this? Balance: - Select purchase method + Select Purchase Method Brave Wallet From 099f330fc5149b8b6e8fcccf0f4c23cd55ba7d32 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Wed, 8 Feb 2023 17:39:18 +0100 Subject: [PATCH 32/36] Address review feedback --- .../adapters/WalletCoinAdapter.java | 2 +- .../browser/blockchain_registry.cc | 82 +++++++------------ .../browser/blockchain_registry.h | 6 +- .../browser/blockchain_registry_unittest.cc | 21 +++++ .../browser/brave_wallet_constants.h | 1 - .../brave_wallet/common/brave_wallet.mojom | 3 +- 6 files changed, 58 insertions(+), 57 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java index 14dbc734bad3..d7f65d7b8047 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/adapters/WalletCoinAdapter.java @@ -316,7 +316,7 @@ private List removeDuplicates( List result = new ArrayList<>(); for (WalletListItemModel item : walletListItemModelList) { if (item.getBlockchainToken() == null) { - // If blockchain token is null the item can be safely add without any risk + // If blockchain token is null the item can be safely added without any risk // of duplication. result.add(item); continue; diff --git a/components/brave_wallet/browser/blockchain_registry.cc b/components/brave_wallet/browser/blockchain_registry.cc index 3ac605718905..55ffd68d1a14 100644 --- a/components/brave_wallet/browser/blockchain_registry.cc +++ b/components/brave_wallet/browser/blockchain_registry.cc @@ -5,9 +5,9 @@ #include "brave/components/brave_wallet/browser/blockchain_registry.h" -#include #include +#include "base/containers/flat_set.h" #include "base/ranges/algorithm.h" #include "base/strings/stringprintf.h" #include "brave/components/brave_wallet/browser/brave_wallet_constants.h" @@ -101,71 +101,51 @@ void BlockchainRegistry::GetAllTokens(const std::string& chain_id, GetAllTokensCallback callback) { const auto key = GetTokenListKey(coin, chain_id); if (!token_list_map_.contains(key)) { - std::move(callback).Run( - std::vector()); + std::move(callback).Run(std::vector()); return; } const auto& tokens = token_list_map_[key]; - std::vector tokens_copy( - tokens.size()); + std::vector tokens_copy(tokens.size()); std::transform( tokens.begin(), tokens.end(), tokens_copy.begin(), - [](const brave_wallet::mojom::BlockchainTokenPtr& current_token) - -> brave_wallet::mojom::BlockchainTokenPtr { - return current_token.Clone(); - }); + [](const mojom::BlockchainTokenPtr& current_token) + -> mojom::BlockchainTokenPtr { return current_token.Clone(); }); std::move(callback).Run(std::move(tokens_copy)); } -std::vector -BlockchainRegistry::GetBuyTokens( +std::vector BlockchainRegistry::GetBuyTokens( const std::vector& providers, const std::string& chain_id) { - std::vector blockchain_buy_tokens; - std::vector buy_tokens; - if (std::find(providers.begin(), providers.end(), - mojom::OnRampProvider::kWyre) != providers.end()) { - std::vector wyre_buy_tokens = GetWyreBuyTokens(); - buy_tokens.insert(buy_tokens.begin(), wyre_buy_tokens.begin(), - wyre_buy_tokens.end()); - } - if (std::find(providers.begin(), providers.end(), - mojom::OnRampProvider::kRamp) != providers.end()) { - std::vector ramp_buy_tokens = GetRampBuyTokens(); - buy_tokens.insert(buy_tokens.begin(), ramp_buy_tokens.begin(), - ramp_buy_tokens.end()); - } - if (std::find(providers.begin(), providers.end(), - mojom::OnRampProvider::kSardine) != providers.end()) { - std::vector sardine_buy_tokens = - GetSardineBuyTokens(); - buy_tokens.insert(buy_tokens.begin(), sardine_buy_tokens.begin(), - sardine_buy_tokens.end()); - } - if (std::find(providers.begin(), providers.end(), - mojom::OnRampProvider::kTransak) != providers.end()) { - std::vector transak_buy_tokens = - GetTransakBuyTokens(); - buy_tokens.insert(buy_tokens.begin(), transak_buy_tokens.begin(), - transak_buy_tokens.end()); - } - if (buy_tokens.empty()) { - return blockchain_buy_tokens; - } - for (const auto& token : buy_tokens) { - if (token.chain_id != chain_id) { - continue; + std::vector blockchain_buy_tokens; + base::flat_set provider_set(providers.begin(), + providers.end()); + + for (const auto& provider : provider_set) { + const std::vector* buy_tokens = nullptr; + if (provider == mojom::OnRampProvider::kWyre) { + buy_tokens = &GetWyreBuyTokens(); + } else if (provider == mojom::OnRampProvider::kRamp) { + buy_tokens = &GetRampBuyTokens(); + } else if (provider == mojom::OnRampProvider::kSardine) { + buy_tokens = &GetSardineBuyTokens(); + } else if (provider == mojom::OnRampProvider::kTransak) { + buy_tokens = &GetTransakBuyTokens(); + } + + for (const auto& token : *buy_tokens) { + if (token.chain_id == chain_id) { + blockchain_buy_tokens.push_back(mojom::BlockchainToken::New(token)); + } } - blockchain_buy_tokens.push_back( - brave_wallet::mojom::BlockchainToken::New(token)); } + return blockchain_buy_tokens; } void BlockchainRegistry::GetBuyTokens(mojom::OnRampProvider provider, const std::string& chain_id, GetBuyTokensCallback callback) { - std::vector blockchain_buy_tokens = + std::vector blockchain_buy_tokens = GetBuyTokens({provider}, chain_id); std::move(callback).Run(std::move(blockchain_buy_tokens)); } @@ -174,7 +154,7 @@ void BlockchainRegistry::GetProvidersBuyTokens( const std::vector& providers, const std::string& chain_id, GetProvidersBuyTokensCallback callback) { - std::vector blockchain_buy_tokens = + std::vector blockchain_buy_tokens = GetBuyTokens(providers, chain_id); std::move(callback).Run(std::move(blockchain_buy_tokens)); } @@ -217,12 +197,12 @@ void BlockchainRegistry::GetBuyUrl(mojom::OnRampProvider provider, void BlockchainRegistry::GetOnRampCurrencies( GetOnRampCurrenciesCallback callback) { - std::vector currencies; + std::vector currencies; const std::vector* onRampCurrencies = &GetOnRampCurrenciesList(); for (const auto& currency : *onRampCurrencies) { - currencies.push_back(brave_wallet::mojom::OnRampCurrency::New(currency)); + currencies.push_back(mojom::OnRampCurrency::New(currency)); } std::move(callback).Run(std::move(currencies)); } diff --git a/components/brave_wallet/browser/blockchain_registry.h b/components/brave_wallet/browser/blockchain_registry.h index 1b15af1a0beb..07f376554f1f 100644 --- a/components/brave_wallet/browser/blockchain_registry.h +++ b/components/brave_wallet/browser/blockchain_registry.h @@ -51,9 +51,6 @@ class BlockchainRegistry : public mojom::BlockchainRegistry { void GetAllTokens(const std::string& chain_id, mojom::CoinType coin, GetAllTokensCallback callback) override; - std::vector GetBuyTokens( - const std::vector& providers, - const std::string& chain_id); void GetBuyTokens(mojom::OnRampProvider provider, const std::string& chain_id, GetBuyTokensCallback callback) override; @@ -83,6 +80,9 @@ class BlockchainRegistry : public mojom::BlockchainRegistry { private: mojo::ReceiverSet receivers_; + std::vector GetBuyTokens( + const std::vector& providers, + const std::string& chain_id); }; } // namespace brave_wallet diff --git a/components/brave_wallet/browser/blockchain_registry_unittest.cc b/components/brave_wallet/browser/blockchain_registry_unittest.cc index d4d4dfeb57ec..8bafc45f0262 100644 --- a/components/brave_wallet/browser/blockchain_registry_unittest.cc +++ b/components/brave_wallet/browser/blockchain_registry_unittest.cc @@ -456,6 +456,27 @@ TEST(BlockchainRegistryUnitTest, GetBuyTokens) { run_loop4.Run(); } +TEST(BlockchainRegistryUnitTest, GetProvidersBuyTokens) { + base::test::TaskEnvironment task_environment; + auto* registry = BlockchainRegistry::GetInstance(); + + // Get Wyre, Ramp, Sardine and Transak buy tokens. + base::RunLoop run_loop; + registry->GetProvidersBuyTokens( + {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, + mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, + mojom::kMainnetChainId, + base::BindLambdaForTesting( + [&](std::vector token_list) { + EXPECT_NE(token_list.size(), 0UL); + EXPECT_EQ(token_list[0]->name, "Basic Attention Token"); + EXPECT_EQ(token_list[1]->name, "Ethereum"); + + run_loop.Quit(); + })); + run_loop.Run(); +} + TEST(BlockchainRegistryUnitTest, GetBuyUrlWyre) { base::test::TaskEnvironment task_environment; auto* registry = BlockchainRegistry::GetInstance(); diff --git a/components/brave_wallet/browser/brave_wallet_constants.h b/components/brave_wallet/browser/brave_wallet_constants.h index 4482d68a5d81..fefbe773940d 100644 --- a/components/brave_wallet/browser/brave_wallet_constants.h +++ b/components/brave_wallet/browser/brave_wallet_constants.h @@ -6,7 +6,6 @@ #ifndef BRAVE_COMPONENTS_BRAVE_WALLET_BROWSER_BRAVE_WALLET_CONSTANTS_H_ #define BRAVE_COMPONENTS_BRAVE_WALLET_BROWSER_BRAVE_WALLET_CONSTANTS_H_ -#include #include #include diff --git a/components/brave_wallet/common/brave_wallet.mojom b/components/brave_wallet/common/brave_wallet.mojom index 07f406407943..bf4665f391b8 100644 --- a/components/brave_wallet/common/brave_wallet.mojom +++ b/components/brave_wallet/common/brave_wallet.mojom @@ -670,8 +670,9 @@ interface BlockchainRegistry { GetAllTokens(string chain_id, CoinType coin) => (array tokens); // Below APIs are Ethereum only for the moment. - // Obtains all tokens for the Buy UI + // Obtains all tokens for a single provider for the Buy UI GetBuyTokens(OnRampProvider provider, string chain_id) => (array tokens); + // Obtains all tokens for multiple providers for the Buy UI GetProvidersBuyTokens(array providers, string chain_id) => (array tokens); // Obtains the URL used for buying assets. From da4de49882a39a27f88b00446c05756c685ce6f2 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Fri, 10 Feb 2023 11:31:41 +0100 Subject: [PATCH 33/36] Address review feedback --- components/brave_wallet/browser/blockchain_registry.cc | 10 ++++------ .../brave_wallet/browser/brave_wallet_constants.cc | 1 - 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/components/brave_wallet/browser/blockchain_registry.cc b/components/brave_wallet/browser/blockchain_registry.cc index 55ffd68d1a14..cd745880f5ba 100644 --- a/components/brave_wallet/browser/blockchain_registry.cc +++ b/components/brave_wallet/browser/blockchain_registry.cc @@ -130,6 +130,8 @@ std::vector BlockchainRegistry::GetBuyTokens( buy_tokens = &GetSardineBuyTokens(); } else if (provider == mojom::OnRampProvider::kTransak) { buy_tokens = &GetTransakBuyTokens(); + } else { + continue; } for (const auto& token : *buy_tokens) { @@ -145,18 +147,14 @@ std::vector BlockchainRegistry::GetBuyTokens( void BlockchainRegistry::GetBuyTokens(mojom::OnRampProvider provider, const std::string& chain_id, GetBuyTokensCallback callback) { - std::vector blockchain_buy_tokens = - GetBuyTokens({provider}, chain_id); - std::move(callback).Run(std::move(blockchain_buy_tokens)); + std::move(callback).Run(GetBuyTokens({provider}, chain_id)); } void BlockchainRegistry::GetProvidersBuyTokens( const std::vector& providers, const std::string& chain_id, GetProvidersBuyTokensCallback callback) { - std::vector blockchain_buy_tokens = - GetBuyTokens(providers, chain_id); - std::move(callback).Run(std::move(blockchain_buy_tokens)); + std::move(callback).Run(GetBuyTokens(providers, chain_id)); } // TODO(muliswilliam) - Remove this function when iOS and Android no longer diff --git a/components/brave_wallet/browser/brave_wallet_constants.cc b/components/brave_wallet/browser/brave_wallet_constants.cc index c04e504cba5e..941a52153521 100644 --- a/components/brave_wallet/browser/brave_wallet_constants.cc +++ b/components/brave_wallet/browser/brave_wallet_constants.cc @@ -4,7 +4,6 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include -#include #include #include "base/containers/contains.h" From cfebf2ecc18fd4a72f5d9708e60d8bfaa7175293 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Fri, 10 Feb 2023 17:41:51 +0100 Subject: [PATCH 34/36] Improve C++ test for GetProvidersBuyTokens --- .../browser/blockchain_registry_unittest.cc | 204 +++++++++++++++++- 1 file changed, 198 insertions(+), 6 deletions(-) diff --git a/components/brave_wallet/browser/blockchain_registry_unittest.cc b/components/brave_wallet/browser/blockchain_registry_unittest.cc index 8bafc45f0262..e5068a7fe37c 100644 --- a/components/brave_wallet/browser/blockchain_registry_unittest.cc +++ b/components/brave_wallet/browser/blockchain_registry_unittest.cc @@ -14,6 +14,8 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "brave/components/brave_wallet/browser/brave_wallet_constants.h" + using testing::ElementsAreArray; namespace brave_wallet { @@ -460,8 +462,70 @@ TEST(BlockchainRegistryUnitTest, GetProvidersBuyTokens) { base::test::TaskEnvironment task_environment; auto* registry = BlockchainRegistry::GetInstance(); - // Get Wyre, Ramp, Sardine and Transak buy tokens. - base::RunLoop run_loop; + std::vector buy_tokens; + for (const auto& v : {GetWyreBuyTokens(), GetRampBuyTokens(), + GetSardineBuyTokens(), GetTransakBuyTokens()}) { + buy_tokens.insert(buy_tokens.end(), v.begin(), v.end()); + } + + std::vector mainnet_buy_tokens; + for (auto token : buy_tokens) { + if (token.chain_id == mojom::kMainnetChainId) { + mainnet_buy_tokens.push_back(mojom::BlockchainToken::New(token)); + } + } + + std::vector polygon_buy_tokens; + for (auto token : buy_tokens) { + if (token.chain_id == mojom::kPolygonMainnetChainId) { + polygon_buy_tokens.push_back(mojom::BlockchainToken::New(token)); + } + } + + std::vector avalanche_buy_tokens; + for (auto token : buy_tokens) { + if (token.chain_id == mojom::kAvalancheMainnetChainId) { + avalanche_buy_tokens.push_back(mojom::BlockchainToken::New(token)); + } + } + + std::vector binance_buy_tokens; + for (auto token : buy_tokens) { + if (token.chain_id == mojom::kBinanceSmartChainMainnetChainId) { + binance_buy_tokens.push_back(mojom::BlockchainToken::New(token)); + } + } + + std::vector solana_buy_tokens; + for (auto token : buy_tokens) { + if (token.chain_id == mojom::kSolanaMainnet) { + solana_buy_tokens.push_back(mojom::BlockchainToken::New(token)); + } + } + + std::vector celo_buy_tokens; + for (auto token : buy_tokens) { + if (token.chain_id == mojom::kCeloMainnetChainId) { + celo_buy_tokens.push_back(mojom::BlockchainToken::New(token)); + } + } + + std::vector optimism_buy_tokens; + for (auto token : buy_tokens) { + if (token.chain_id == mojom::kOptimismMainnetChainId) { + optimism_buy_tokens.push_back(mojom::BlockchainToken::New(token)); + } + } + + std::vector arbitrum_buy_tokens; + for (auto token : buy_tokens) { + if (token.chain_id == mojom::kArbitrumMainnetChainId) { + arbitrum_buy_tokens.push_back(mojom::BlockchainToken::New(token)); + } + } + + // Get Wyre, Ramp, Sardine and Transak buy tokens for Mainnet. + base::RunLoop run_loop1; registry->GetProvidersBuyTokens( {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, @@ -469,12 +533,140 @@ TEST(BlockchainRegistryUnitTest, GetProvidersBuyTokens) { base::BindLambdaForTesting( [&](std::vector token_list) { EXPECT_NE(token_list.size(), 0UL); - EXPECT_EQ(token_list[0]->name, "Basic Attention Token"); - EXPECT_EQ(token_list[1]->name, "Ethereum"); + EXPECT_NE(mainnet_buy_tokens.size(), 0UL); + EXPECT_TRUE(std::equal(mainnet_buy_tokens.begin(), + mainnet_buy_tokens.end(), token_list.begin(), + token_list.end())); - run_loop.Quit(); + run_loop1.Quit(); })); - run_loop.Run(); + run_loop1.Run(); + + // Get Wyre, Ramp, Sardine and Transak buy tokens for Polygon. + base::RunLoop run_loop2; + registry->GetProvidersBuyTokens( + {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, + mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, + mojom::kPolygonMainnetChainId, + base::BindLambdaForTesting( + [&](std::vector token_list) { + EXPECT_NE(token_list.size(), 0UL); + EXPECT_NE(polygon_buy_tokens.size(), 0UL); + EXPECT_TRUE(std::equal(polygon_buy_tokens.begin(), + polygon_buy_tokens.end(), token_list.begin(), + token_list.end())); + + run_loop2.Quit(); + })); + run_loop2.Run(); + + // Get Wyre, Ramp, Sardine and Transak buy tokens for Avalanche. + base::RunLoop run_loop3; + registry->GetProvidersBuyTokens( + {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, + mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, + mojom::kAvalancheMainnetChainId, + base::BindLambdaForTesting( + [&](std::vector token_list) { + EXPECT_NE(token_list.size(), 0UL); + EXPECT_NE(avalanche_buy_tokens.size(), 0UL); + EXPECT_TRUE(std::equal(avalanche_buy_tokens.begin(), + avalanche_buy_tokens.end(), + token_list.begin(), token_list.end())); + + run_loop3.Quit(); + })); + run_loop3.Run(); + + // Get Wyre, Ramp, Sardine and Transak buy tokens for Binance. + base::RunLoop run_loop4; + registry->GetProvidersBuyTokens( + {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, + mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, + mojom::kBinanceSmartChainMainnetChainId, + base::BindLambdaForTesting( + [&](std::vector token_list) { + EXPECT_NE(token_list.size(), 0UL); + EXPECT_NE(binance_buy_tokens.size(), 0UL); + EXPECT_TRUE(std::equal(binance_buy_tokens.begin(), + binance_buy_tokens.end(), token_list.begin(), + token_list.end())); + + run_loop4.Quit(); + })); + run_loop4.Run(); + + // Get Wyre, Ramp, Sardine and Transak buy tokens for Solana. + base::RunLoop run_loop5; + registry->GetProvidersBuyTokens( + {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, + mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, + mojom::kSolanaMainnet, + base::BindLambdaForTesting( + [&](std::vector token_list) { + EXPECT_NE(token_list.size(), 0UL); + EXPECT_NE(solana_buy_tokens.size(), 0UL); + EXPECT_TRUE(std::equal(solana_buy_tokens.begin(), + solana_buy_tokens.end(), token_list.begin(), + token_list.end())); + + run_loop5.Quit(); + })); + run_loop5.Run(); + + // Get Wyre, Ramp, Sardine and Transak buy tokens for Celo. + base::RunLoop run_loop6; + registry->GetProvidersBuyTokens( + {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, + mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, + mojom::kCeloMainnetChainId, + base::BindLambdaForTesting( + [&](std::vector token_list) { + EXPECT_NE(token_list.size(), 0UL); + EXPECT_NE(celo_buy_tokens.size(), 0UL); + EXPECT_TRUE(std::equal(celo_buy_tokens.begin(), + celo_buy_tokens.end(), token_list.begin(), + token_list.end())); + + run_loop6.Quit(); + })); + run_loop6.Run(); + + // Get Wyre, Ramp, Sardine and Transak buy tokens for Optimism. + base::RunLoop run_loop7; + registry->GetProvidersBuyTokens( + {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, + mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, + mojom::kOptimismMainnetChainId, + base::BindLambdaForTesting( + [&](std::vector token_list) { + EXPECT_NE(token_list.size(), 0UL); + EXPECT_NE(optimism_buy_tokens.size(), 0UL); + EXPECT_TRUE(std::equal(optimism_buy_tokens.begin(), + optimism_buy_tokens.end(), + token_list.begin(), token_list.end())); + + run_loop7.Quit(); + })); + run_loop7.Run(); + + // Get Wyre, Ramp, Sardine and Transak buy tokens for Arbitrum. + base::RunLoop run_loop8; + registry->GetProvidersBuyTokens( + {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, + mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, + mojom::kArbitrumMainnetChainId, + base::BindLambdaForTesting( + [&](std::vector token_list) { + EXPECT_NE(token_list.size(), 0UL); + EXPECT_NE(arbitrum_buy_tokens.size(), 0UL); + EXPECT_TRUE(std::equal(arbitrum_buy_tokens.begin(), + arbitrum_buy_tokens.end(), + token_list.begin(), token_list.end())); + + run_loop8.Quit(); + })); + run_loop8.Run(); } TEST(BlockchainRegistryUnitTest, GetBuyUrlWyre) { From 83ae78f907527c64299896b5f7919b1cf7a31094 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Fri, 10 Feb 2023 19:17:52 +0100 Subject: [PATCH 35/36] Shrink test --- .../browser/blockchain_registry_unittest.cc | 224 +++--------------- 1 file changed, 29 insertions(+), 195 deletions(-) diff --git a/components/brave_wallet/browser/blockchain_registry_unittest.cc b/components/brave_wallet/browser/blockchain_registry_unittest.cc index e5068a7fe37c..8f23cf4b1643 100644 --- a/components/brave_wallet/browser/blockchain_registry_unittest.cc +++ b/components/brave_wallet/browser/blockchain_registry_unittest.cc @@ -468,205 +468,39 @@ TEST(BlockchainRegistryUnitTest, GetProvidersBuyTokens) { buy_tokens.insert(buy_tokens.end(), v.begin(), v.end()); } - std::vector mainnet_buy_tokens; - for (auto token : buy_tokens) { - if (token.chain_id == mojom::kMainnetChainId) { - mainnet_buy_tokens.push_back(mojom::BlockchainToken::New(token)); + const char* chains[] = { + mojom::kMainnetChainId, mojom::kPolygonMainnetChainId, + mojom::kAvalancheMainnetChainId, mojom::kBinanceSmartChainMainnetChainId, + mojom::kSolanaMainnet, mojom::kCeloMainnetChainId, + mojom::kArbitrumMainnetChainId}; + + for (auto* chain : chains) { + std::vector expected_tokens; + for (const auto& token : buy_tokens) { + if (token.chain_id == chain) { + expected_tokens.push_back(mojom::BlockchainToken::New(token)); + } } - } - - std::vector polygon_buy_tokens; - for (auto token : buy_tokens) { - if (token.chain_id == mojom::kPolygonMainnetChainId) { - polygon_buy_tokens.push_back(mojom::BlockchainToken::New(token)); - } - } - - std::vector avalanche_buy_tokens; - for (auto token : buy_tokens) { - if (token.chain_id == mojom::kAvalancheMainnetChainId) { - avalanche_buy_tokens.push_back(mojom::BlockchainToken::New(token)); - } - } - - std::vector binance_buy_tokens; - for (auto token : buy_tokens) { - if (token.chain_id == mojom::kBinanceSmartChainMainnetChainId) { - binance_buy_tokens.push_back(mojom::BlockchainToken::New(token)); - } - } - - std::vector solana_buy_tokens; - for (auto token : buy_tokens) { - if (token.chain_id == mojom::kSolanaMainnet) { - solana_buy_tokens.push_back(mojom::BlockchainToken::New(token)); - } - } - - std::vector celo_buy_tokens; - for (auto token : buy_tokens) { - if (token.chain_id == mojom::kCeloMainnetChainId) { - celo_buy_tokens.push_back(mojom::BlockchainToken::New(token)); - } - } - std::vector optimism_buy_tokens; - for (auto token : buy_tokens) { - if (token.chain_id == mojom::kOptimismMainnetChainId) { - optimism_buy_tokens.push_back(mojom::BlockchainToken::New(token)); - } - } + base::RunLoop run_loop; + registry->GetProvidersBuyTokens( + {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, + mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak, + mojom::OnRampProvider::kTransak /* test duplicate provider */}, + chain, + base::BindLambdaForTesting( + [&](std::vector token_list) { + EXPECT_NE(token_list.size(), 0UL); + EXPECT_NE(expected_tokens.size(), 0UL); + EXPECT_TRUE(std::equal(expected_tokens.begin(), + expected_tokens.end(), token_list.begin(), + token_list.end())) + << chain; - std::vector arbitrum_buy_tokens; - for (auto token : buy_tokens) { - if (token.chain_id == mojom::kArbitrumMainnetChainId) { - arbitrum_buy_tokens.push_back(mojom::BlockchainToken::New(token)); - } + run_loop.Quit(); + })); + run_loop.Run(); } - - // Get Wyre, Ramp, Sardine and Transak buy tokens for Mainnet. - base::RunLoop run_loop1; - registry->GetProvidersBuyTokens( - {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, - mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, - mojom::kMainnetChainId, - base::BindLambdaForTesting( - [&](std::vector token_list) { - EXPECT_NE(token_list.size(), 0UL); - EXPECT_NE(mainnet_buy_tokens.size(), 0UL); - EXPECT_TRUE(std::equal(mainnet_buy_tokens.begin(), - mainnet_buy_tokens.end(), token_list.begin(), - token_list.end())); - - run_loop1.Quit(); - })); - run_loop1.Run(); - - // Get Wyre, Ramp, Sardine and Transak buy tokens for Polygon. - base::RunLoop run_loop2; - registry->GetProvidersBuyTokens( - {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, - mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, - mojom::kPolygonMainnetChainId, - base::BindLambdaForTesting( - [&](std::vector token_list) { - EXPECT_NE(token_list.size(), 0UL); - EXPECT_NE(polygon_buy_tokens.size(), 0UL); - EXPECT_TRUE(std::equal(polygon_buy_tokens.begin(), - polygon_buy_tokens.end(), token_list.begin(), - token_list.end())); - - run_loop2.Quit(); - })); - run_loop2.Run(); - - // Get Wyre, Ramp, Sardine and Transak buy tokens for Avalanche. - base::RunLoop run_loop3; - registry->GetProvidersBuyTokens( - {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, - mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, - mojom::kAvalancheMainnetChainId, - base::BindLambdaForTesting( - [&](std::vector token_list) { - EXPECT_NE(token_list.size(), 0UL); - EXPECT_NE(avalanche_buy_tokens.size(), 0UL); - EXPECT_TRUE(std::equal(avalanche_buy_tokens.begin(), - avalanche_buy_tokens.end(), - token_list.begin(), token_list.end())); - - run_loop3.Quit(); - })); - run_loop3.Run(); - - // Get Wyre, Ramp, Sardine and Transak buy tokens for Binance. - base::RunLoop run_loop4; - registry->GetProvidersBuyTokens( - {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, - mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, - mojom::kBinanceSmartChainMainnetChainId, - base::BindLambdaForTesting( - [&](std::vector token_list) { - EXPECT_NE(token_list.size(), 0UL); - EXPECT_NE(binance_buy_tokens.size(), 0UL); - EXPECT_TRUE(std::equal(binance_buy_tokens.begin(), - binance_buy_tokens.end(), token_list.begin(), - token_list.end())); - - run_loop4.Quit(); - })); - run_loop4.Run(); - - // Get Wyre, Ramp, Sardine and Transak buy tokens for Solana. - base::RunLoop run_loop5; - registry->GetProvidersBuyTokens( - {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, - mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, - mojom::kSolanaMainnet, - base::BindLambdaForTesting( - [&](std::vector token_list) { - EXPECT_NE(token_list.size(), 0UL); - EXPECT_NE(solana_buy_tokens.size(), 0UL); - EXPECT_TRUE(std::equal(solana_buy_tokens.begin(), - solana_buy_tokens.end(), token_list.begin(), - token_list.end())); - - run_loop5.Quit(); - })); - run_loop5.Run(); - - // Get Wyre, Ramp, Sardine and Transak buy tokens for Celo. - base::RunLoop run_loop6; - registry->GetProvidersBuyTokens( - {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, - mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, - mojom::kCeloMainnetChainId, - base::BindLambdaForTesting( - [&](std::vector token_list) { - EXPECT_NE(token_list.size(), 0UL); - EXPECT_NE(celo_buy_tokens.size(), 0UL); - EXPECT_TRUE(std::equal(celo_buy_tokens.begin(), - celo_buy_tokens.end(), token_list.begin(), - token_list.end())); - - run_loop6.Quit(); - })); - run_loop6.Run(); - - // Get Wyre, Ramp, Sardine and Transak buy tokens for Optimism. - base::RunLoop run_loop7; - registry->GetProvidersBuyTokens( - {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, - mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, - mojom::kOptimismMainnetChainId, - base::BindLambdaForTesting( - [&](std::vector token_list) { - EXPECT_NE(token_list.size(), 0UL); - EXPECT_NE(optimism_buy_tokens.size(), 0UL); - EXPECT_TRUE(std::equal(optimism_buy_tokens.begin(), - optimism_buy_tokens.end(), - token_list.begin(), token_list.end())); - - run_loop7.Quit(); - })); - run_loop7.Run(); - - // Get Wyre, Ramp, Sardine and Transak buy tokens for Arbitrum. - base::RunLoop run_loop8; - registry->GetProvidersBuyTokens( - {mojom::OnRampProvider::kWyre, mojom::OnRampProvider::kRamp, - mojom::OnRampProvider::kSardine, mojom::OnRampProvider::kTransak}, - mojom::kArbitrumMainnetChainId, - base::BindLambdaForTesting( - [&](std::vector token_list) { - EXPECT_NE(token_list.size(), 0UL); - EXPECT_NE(arbitrum_buy_tokens.size(), 0UL); - EXPECT_TRUE(std::equal(arbitrum_buy_tokens.begin(), - arbitrum_buy_tokens.end(), - token_list.begin(), token_list.end())); - - run_loop8.Quit(); - })); - run_loop8.Run(); } TEST(BlockchainRegistryUnitTest, GetBuyUrlWyre) { From 9de5f775d502bffede928134de4cf4031b7babb8 Mon Sep 17 00:00:00 2001 From: Simone Arpe Date: Fri, 10 Feb 2023 20:24:36 +0100 Subject: [PATCH 36/36] Small improvements --- .../brave_wallet/browser/blockchain_registry_unittest.cc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/components/brave_wallet/browser/blockchain_registry_unittest.cc b/components/brave_wallet/browser/blockchain_registry_unittest.cc index 8f23cf4b1643..167d3cfad101 100644 --- a/components/brave_wallet/browser/blockchain_registry_unittest.cc +++ b/components/brave_wallet/browser/blockchain_registry_unittest.cc @@ -490,12 +490,7 @@ TEST(BlockchainRegistryUnitTest, GetProvidersBuyTokens) { chain, base::BindLambdaForTesting( [&](std::vector token_list) { - EXPECT_NE(token_list.size(), 0UL); - EXPECT_NE(expected_tokens.size(), 0UL); - EXPECT_TRUE(std::equal(expected_tokens.begin(), - expected_tokens.end(), token_list.begin(), - token_list.end())) - << chain; + EXPECT_EQ(expected_tokens, token_list) << chain; run_loop.Quit(); }));