From e87218b708fa6425479cbeb568acc6d65a8a5d06 Mon Sep 17 00:00:00 2001 From: Anton Paymyshev Date: Tue, 12 May 2026 19:12:50 +0700 Subject: [PATCH] [Wallet] Drop balance and tx related P3A metrics (#36303) [Wallet] Remove some wallet p3a metrics --- .../ApproveTxBottomSheetDialogFragment.java | 41 +- .../crypto_wallet/util/AsyncUtils.java | 16 - .../crypto_wallet/util/BalanceHelper.java | 194 ----- .../browser/crypto_wallet/util/Utils.java | 80 --- .../wallet_page/wallet_page_ui.cc | 3 - .../ui/webui/brave_wallet/wallet_panel_ui.cc | 3 - .../chrome/browser/prefs/browser_prefs.cc | 4 +- .../brave_wallet/browser/brave_wallet_p3a.cc | 206 ------ .../brave_wallet/browser/brave_wallet_p3a.h | 43 +- .../browser/brave_wallet_p3a_private.cc | 4 - .../browser/brave_wallet_p3a_private.h | 1 - .../browser/brave_wallet_p3a_unittest.cc | 672 ------------------ .../browser/brave_wallet_service.cc | 2 +- components/brave_wallet/browser/pref_names.cc | 27 +- components/brave_wallet/browser/pref_names.h | 26 +- .../brave_wallet/common/brave_wallet.mojom | 8 - .../brave_wallet/common/common_utils.cc | 33 - components/brave_wallet/common/common_utils.h | 3 - .../common/async/__mocks__/bridge.ts | 4 - .../endpoints/token_balances.endpoints.ts | 4 - .../utils/balance-utils.test.ts | 279 +------- .../brave_wallet_ui/utils/balance-utils.ts | 51 +- components/brave_wallet_ui/utils/p3a_utils.ts | 38 - components/p3a/metric_names.h | 10 - .../Debug/BraveCoreDebugSwitchesView.swift | 7 - .../Crypto/Stores/CryptoStore.swift | 49 -- .../shared/prefs/browser_prefs_impl.mm | 3 + .../ui/webui/brave_wallet/wallet_page_ui.mm | 3 - 28 files changed, 65 insertions(+), 1749 deletions(-) delete mode 100644 components/brave_wallet_ui/utils/p3a_utils.ts diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/ApproveTxBottomSheetDialogFragment.java b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/ApproveTxBottomSheetDialogFragment.java index 0075cc29c67..ab6f8ed40cd 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/ApproveTxBottomSheetDialogFragment.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/fragments/ApproveTxBottomSheetDialogFragment.java @@ -56,7 +56,6 @@ import org.chromium.chrome.browser.crypto_wallet.util.SolanaTransactionsGasHelpe import org.chromium.chrome.browser.crypto_wallet.util.TokenUtils; import org.chromium.chrome.browser.crypto_wallet.util.TransactionUtils; import org.chromium.chrome.browser.crypto_wallet.util.Utils; -import org.chromium.chrome.browser.util.LiveDataUtil; import org.chromium.chrome.browser.util.TabUtils; import java.lang.ref.WeakReference; @@ -302,32 +301,24 @@ public class ApproveTxBottomSheetDialogFragment extends WalletBottomSheetDialogF AccountInfo txAccountInfo, AccountInfo[] accounts, BlockchainToken[] filterByTokens) { - LiveDataUtil.observeOnce( - getWalletModel().getCryptoModel().getNetworkModel().mCryptoNetworks, - allNetworks -> { - Utils.getTxExtraInfo( - new WeakReference<>((BraveWalletBaseActivity) getActivity()), - TokenUtils.TokenType.ALL, - allNetworks, + Utils.getTxExtraInfo( + new WeakReference<>((BraveWalletBaseActivity) getActivity()), + TokenUtils.TokenType.ALL, + txNetwork, + accounts, + filterByTokens, + false, + (assetPrices, fullTokenList, nativeAssetsBalances, blockchainTokensBalances) -> { + if (!canUpdateUi() || mTxInfo == null) return; + fillAssetDependentControls( + mTxInfo, + view, txNetwork, + txAccountInfo, accounts, - filterByTokens, - false, - (assetPrices, - fullTokenList, - nativeAssetsBalances, - blockchainTokensBalances) -> { - if (!canUpdateUi() || mTxInfo == null) return; - fillAssetDependentControls( - mTxInfo, - view, - txNetwork, - txAccountInfo, - accounts, - assetPrices, - fullTokenList, - mSolanaEstimatedTxFee); - }); + assetPrices, + fullTokenList, + mSolanaEstimatedTxFee); }); } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/AsyncUtils.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/AsyncUtils.java index 50aa17be61a..a5148312c2a 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/AsyncUtils.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/util/AsyncUtils.java @@ -21,7 +21,6 @@ import org.chromium.brave_wallet.mojom.TransactionInfo; import org.chromium.brave_wallet.mojom.TxService; import java.util.HashMap; -import java.util.HashSet; import java.util.List; public class AsyncUtils { @@ -363,21 +362,6 @@ public class AsyncUtils { } } - public static class GetP3ABalancesContext extends SingleResponseBaseContext - implements Callback1>> { - public HashMap> activeAddresses; - - public GetP3ABalancesContext(Runnable responseCompleteCallback) { - super(responseCompleteCallback); - } - - @Override - public void call(HashMap> activeAddresses) { - this.activeAddresses = activeAddresses; - super.fireResponseCompleteCallback(); - } - } - public abstract static class BaseGetNftMetadataContext extends SingleResponseBaseContext { public BlockchainToken asset; public String tokenMetadata; diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/BalanceHelper.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/BalanceHelper.java index 0a4d0d470b6..f48d6cee3e0 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/BalanceHelper.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/util/BalanceHelper.java @@ -8,34 +8,23 @@ package org.chromium.chrome.browser.crypto_wallet.util; import androidx.annotation.NonNull; import org.chromium.brave_wallet.mojom.AccountInfo; -import org.chromium.brave_wallet.mojom.BlockchainRegistry; import org.chromium.brave_wallet.mojom.BlockchainToken; -import org.chromium.brave_wallet.mojom.BraveWalletService; import org.chromium.brave_wallet.mojom.CoinType; import org.chromium.brave_wallet.mojom.JsonRpcService; -import org.chromium.brave_wallet.mojom.KeyringService; import org.chromium.brave_wallet.mojom.NetworkInfo; import org.chromium.brave_wallet.mojom.ProviderError; -import org.chromium.chrome.browser.BraveLocalState; -import org.chromium.chrome.browser.crypto_wallet.activities.BraveWalletBaseActivity; import org.chromium.chrome.browser.crypto_wallet.util.AsyncUtils.GetBalanceResponseBaseContext; import org.chromium.chrome.browser.crypto_wallet.util.AsyncUtils.GetBalanceResponseContext; -import org.chromium.chrome.browser.crypto_wallet.util.AsyncUtils.GetBlockchainTokensBalancesResponseContext; import org.chromium.chrome.browser.crypto_wallet.util.AsyncUtils.GetErc20TokenBalanceResponseContext; import org.chromium.chrome.browser.crypto_wallet.util.AsyncUtils.GetErc721TokenBalanceResponseContext; -import org.chromium.chrome.browser.crypto_wallet.util.AsyncUtils.GetNativeAssetsBalancesResponseContext; import org.chromium.chrome.browser.crypto_wallet.util.AsyncUtils.GetSolanaBalanceResponseContext; import org.chromium.chrome.browser.crypto_wallet.util.AsyncUtils.GetSplTokenAccountBalanceResponseContext; import org.chromium.chrome.browser.crypto_wallet.util.AsyncUtils.MultiResponseHandler; -import org.chromium.chrome.browser.preferences.BravePref; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Locale; -import java.util.Map; public class BalanceHelper { /** Get assets balances for all accounts on selected network. */ @@ -217,142 +206,6 @@ public class BalanceHelper { }); } - public static void getP3ABalances( - WeakReference activityRef, - List allNetworks, - NetworkInfo selectedNetwork, - AsyncUtils.Callback1>> callback) { - BraveWalletBaseActivity activity = activityRef.get(); - if (activity == null || activity.isFinishing()) return; - KeyringService keyringService = activity.getKeyringService(); - BraveWalletService braveWalletService = activity.getBraveWalletService(); - BlockchainRegistry blockchainRegistry = activity.getBlockchainRegistry(); - JsonRpcService jsonRpcService = activity.getJsonRpcService(); - assert braveWalletService != null - && blockchainRegistry != null - && keyringService != null - && jsonRpcService != null; - if (JavaUtils.anyNull( - braveWalletService, blockchainRegistry, keyringService, jsonRpcService)) { - return; - } - - boolean P3AEnabled = BraveLocalState.get().getBoolean(BravePref.P3A_ENABLED); - - HashMap> activeAddresses = new HashMap>(); - for (int coinType : Utils.P3ACoinTypes) { - activeAddresses.put(coinType, new HashSet()); - } - - if (!P3AEnabled) { - callback.call(activeAddresses); - return; - } else { - Utils.getP3ANetworks( - allNetworks, - relevantNetworks -> { - // Exclude selectedNetwork if in relevantNetworks, also sort by CoinType - HashMap> sortedNetworks = - filterAndSortNetworksP3A(relevantNetworks, selectedNetwork); - int numNetworks = 0; - for (int coinType : Utils.P3ACoinTypes) { - numNetworks += sortedNetworks.get(coinType).size(); - } - - MultiResponseHandler multiResponse = - new MultiResponseHandler(numNetworks * 2); - ArrayList - nativeAssetsBalancesResponses = - new ArrayList(); - ArrayList - blockchainTokensBalancesResponses = - new ArrayList(); - - for (int coinType : Utils.P3ACoinTypes) { - processP3ACoinNetworks( - coinType, - sortedNetworks.get(coinType), - keyringService, - jsonRpcService, - braveWalletService, - blockchainRegistry, - multiResponse, - nativeAssetsBalancesResponses, - blockchainTokensBalancesResponses); - } - - multiResponse.setWhenAllCompletedAction( - () -> { - updateActiveAddresses( - nativeAssetsBalancesResponses.toArray( - new GetNativeAssetsBalancesResponseContext[0]), - blockchainTokensBalancesResponses.toArray( - new GetBlockchainTokensBalancesResponseContext - [0]), - activeAddresses); - callback.call(activeAddresses); - }); - }); - } - } - - private static void processP3ACoinNetworks( - @CoinType.EnumType int coinType, - List networks, - KeyringService keyringService, - JsonRpcService jsonRpcService, - BraveWalletService braveWalletService, - BlockchainRegistry blockchainRegistry, - MultiResponseHandler multiResponse, - ArrayList nativeAssetsBalancesResponses, - ArrayList - blockchainTokensBalancesResponses) { - if (JavaUtils.anyNull(braveWalletService, blockchainRegistry, jsonRpcService)) return; - - keyringService.getAllAccounts( - allAccounts -> { - for (NetworkInfo network : networks) { - AccountInfo[] accountInfoArray = - AssetUtils.filterAccountsByNetwork( - allAccounts.accounts, network.coin, network.chainId); - - TokenUtils.getVisibleUserAssetsFiltered( - braveWalletService, - network, - coinType, - TokenUtils.TokenType.ALL, - tokens -> { - // Assets balances. - GetNativeAssetsBalancesResponseContext - getNativeAssetsBalancesContext = - new GetNativeAssetsBalancesResponseContext( - multiResponse.singleResponseComplete); - getNativeAssetsBalances( - jsonRpcService, - network, - accountInfoArray, - getNativeAssetsBalancesContext); - nativeAssetsBalancesResponses.add( - getNativeAssetsBalancesContext); - - // Tokens balances. - GetBlockchainTokensBalancesResponseContext - getBlockchainTokensBalancesContext = - new GetBlockchainTokensBalancesResponseContext( - multiResponse.singleResponseComplete); - getBlockchainTokensBalances( - jsonRpcService, - network, - accountInfoArray, - tokens, - getBlockchainTokensBalancesContext); - blockchainTokensBalancesResponses.add( - getBlockchainTokensBalancesContext); - }); - } - }); - } - private static T addBalanceResponseContext( ArrayList contexts, T context, @@ -363,51 +216,4 @@ public class BalanceHelper { contexts.add(context); return context; } - - private static HashMap> filterAndSortNetworksP3A( - List relevantNetworks, NetworkInfo selectedNetwork) { - HashMap> networksPerCoin = - new HashMap>(); - networksPerCoin.put(CoinType.ETH, new ArrayList()); - networksPerCoin.put(CoinType.SOL, new ArrayList()); - networksPerCoin.put(CoinType.FIL, new ArrayList()); - for (NetworkInfo network : relevantNetworks) { - if (network.chainId.equals(selectedNetwork.chainId)) continue; - switch (network.coin) { - case CoinType.ETH: - networksPerCoin.get(CoinType.ETH).add(network); - break; - case CoinType.SOL: - networksPerCoin.get(CoinType.SOL).add(network); - break; - case CoinType.FIL: - networksPerCoin.get(CoinType.FIL).add(network); - break; - } - } - return networksPerCoin; - } - - public static void updateActiveAddresses( - GetNativeAssetsBalancesResponseContext[] nativeAssetsBalancesResponses, - GetBlockchainTokensBalancesResponseContext[] blockchainTokensBalancesResponses, - HashMap> activeAddresses) { - for (GetNativeAssetsBalancesResponseContext ctx : nativeAssetsBalancesResponses) { - for (Map.Entry nativeEntry : ctx.nativeAssetsBalances.entrySet()) { - if (nativeEntry.getValue() > 0.0d) { - activeAddresses.get(ctx.coinType).add(nativeEntry.getKey()); - } - } - } - for (GetBlockchainTokensBalancesResponseContext ctx : blockchainTokensBalancesResponses) { - for (Map.Entry> accEntry : - ctx.blockchainTokensBalances.entrySet()) { - for (Map.Entry tokenEntry : accEntry.getValue().entrySet()) { - if (tokenEntry.getValue() > 0.0d) { - activeAddresses.get(ctx.coinType).add(accEntry.getKey()); - } - } - } - } - } } diff --git a/android/java/org/chromium/chrome/browser/crypto_wallet/util/Utils.java b/android/java/org/chromium/chrome/browser/crypto_wallet/util/Utils.java index 08a0c3b0fce..96388bcc80a 100644 --- a/android/java/org/chromium/chrome/browser/crypto_wallet/util/Utils.java +++ b/android/java/org/chromium/chrome/browser/crypto_wallet/util/Utils.java @@ -41,7 +41,6 @@ import org.json.JSONException; import org.json.JSONObject; import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.base.CommandLine; import org.chromium.base.Log; import org.chromium.base.shared_preferences.SharedPreferencesManager; import org.chromium.base.supplier.MonotonicObservableSupplier; @@ -53,7 +52,6 @@ import org.chromium.brave_wallet.mojom.AssetRatioService; import org.chromium.brave_wallet.mojom.BlockchainRegistry; import org.chromium.brave_wallet.mojom.BlockchainToken; import org.chromium.brave_wallet.mojom.BraveWalletConstants; -import org.chromium.brave_wallet.mojom.BraveWalletP3a; import org.chromium.brave_wallet.mojom.BraveWalletService; import org.chromium.brave_wallet.mojom.CoinType; import org.chromium.brave_wallet.mojom.JsonRpcService; @@ -85,7 +83,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.concurrent.ExecutorService; @@ -114,8 +111,6 @@ public class Utils { public static final BigInteger MAX_UINT256 = BigInteger.ONE.shiftLeft(256).subtract(BigInteger.ONE); - public static int[] P3ACoinTypes = {CoinType.ETH, CoinType.SOL, CoinType.FIL}; - public static List getRecoveryPhraseAsList(final String recoveryPhrase) { final String[] recoveryPhraseArray = recoveryPhrase.split(" "); return new ArrayList<>(Arrays.asList(recoveryPhraseArray)); @@ -1103,7 +1098,6 @@ public class Utils { * * @param activityRef Weak reference to Brave Wallet base activity. * @param tokenType Token type used for filtering (e.g. {@code TokenType.NON_NFTS}). - * @param allNetworks List of all networks, used to log P3A records. * @param selectedNetwork Currently selected network. * @param accountInfos Array of account info. * @param filterByTokens Tokens used for fetching prices and balances. It may be {@code null} @@ -1119,7 +1113,6 @@ public class Utils { public static void getTxExtraInfo( WeakReference activityRef, TokenUtils.TokenType tokenType, - List allNetworks, NetworkInfo selectedNetwork, AccountInfo[] accountInfos, BlockchainToken[] filterByTokens, @@ -1219,43 +1212,10 @@ public class Utils { getNativeAssetsBalancesContext.nativeAssetsBalances, getBlockchainTokensBalancesContext .blockchainTokensBalances); - logP3ARecords( - JavaUtils.asArray(getNativeAssetsBalancesContext), - JavaUtils.asArray(getBlockchainTokensBalancesContext), - activityRef, - allNetworks, - selectedNetwork); }); }); } - /** - * Gets P3A networks (i.e. networks with chain Id contained in {@code - * WalletConstants.KNOWN_TEST_CHAIN_IDS)} excluding testnet chains by default. Testnet chain - * counting can be enabled using the switch `--p3a-count-wallet-test-networks`. - * - * @param allNetworks Given network list that will be filtered. - * @param callback Callback containing a filtered list of P3A networks. - */ - public static void getP3ANetworks( - List allNetworks, AsyncUtils.Callback1> callback) { - ArrayList relevantNetworks = new ArrayList(); - boolean countTestNetworks = - CommandLine.getInstance() - .hasSwitch(BraveWalletConstants.P3A_COUNT_TEST_NETWORKS_SWITCH); - for (NetworkInfo network : allNetworks) { - // Exclude testnet chain data by default. - // Testnet chain counting can be enabled via the - // --p3a-count-wallet-test-networks switch - if (countTestNetworks - || !WalletConstants.KNOWN_TEST_CHAIN_IDS.contains(network.chainId)) { - relevantNetworks.add(network); - } - } - - callback.call(relevantNetworks); - } - public static boolean isNativeToken(NetworkInfo selectedNetwork, BlockchainToken token) { return token.symbol.equals(selectedNetwork.symbol); } @@ -1312,46 +1272,6 @@ public class Utils { return num.doubleValue(); } - private static void logP3ARecords( - AsyncUtils.GetNativeAssetsBalancesResponseContext[] nativeAssetsBalancesResponses, - AsyncUtils.GetBlockchainTokensBalancesResponseContext[] - blockchainTokensBalancesResponses, - WeakReference activityRef, - List allNetworks, - NetworkInfo selectedNetwork) { - BraveWalletBaseActivity activity = activityRef.get(); - if (activity == null - || activity.isFinishing() - || JavaUtils.anyNull(activity.getBraveWalletP3A())) { - return; - } - BraveWalletP3a braveWalletP3A = activity.getBraveWalletP3A(); - - AsyncUtils.MultiResponseHandler multiResponse = new AsyncUtils.MultiResponseHandler(1); - - AsyncUtils.GetP3ABalancesContext getP3ABalancesContext = - new AsyncUtils.GetP3ABalancesContext(multiResponse.singleResponseComplete); - BalanceHelper.getP3ABalances( - activityRef, allNetworks, selectedNetwork, getP3ABalancesContext); - - multiResponse.setWhenAllCompletedAction( - () -> { - HashMap> activeAddresses = - getP3ABalancesContext.activeAddresses; - // P3A active accounts - BalanceHelper.updateActiveAddresses( - nativeAssetsBalancesResponses, - blockchainTokensBalancesResponses, - activeAddresses); - for (int coinType : P3ACoinTypes) { - HashSet active = activeAddresses.get(coinType); - if (active != null) { - braveWalletP3A.recordActiveWalletCount(active.size(), coinType); - } - } - }); - } - /** * Gets truncated address from a valid full contract address. * diff --git a/browser/ui/webui/brave_wallet/wallet_page/wallet_page_ui.cc b/browser/ui/webui/brave_wallet/wallet_page/wallet_page_ui.cc index 0eee86577a6..80be76d4139 100644 --- a/browser/ui/webui/brave_wallet/wallet_page/wallet_page_ui.cc +++ b/browser/ui/webui/brave_wallet/wallet_page/wallet_page_ui.cc @@ -119,9 +119,6 @@ WalletPageUI::WalletPageUI(content::WebUI* web_ui) source->AddString("braveWalletMarketUiBridgeUrl", kUntrustedMarketURL); source->AddBoolean("isMobile", IsMobile()); source->AddBoolean("isIOS", false); - source->AddBoolean(mojom::kP3ACountTestNetworksLoadTimeKey, - base::CommandLine::ForCurrentProcess()->HasSwitch( - mojom::kP3ACountTestNetworksSwitch)); source->AddBoolean("rewardsFeatureEnabled", IsRewardsFeatureEnabled(profile)); source->AddBoolean("walletDebug", IsWalletDebugEnabled()); diff --git a/browser/ui/webui/brave_wallet/wallet_panel_ui.cc b/browser/ui/webui/brave_wallet/wallet_panel_ui.cc index 6882e848751..c23bac5f8f7 100644 --- a/browser/ui/webui/brave_wallet/wallet_panel_ui.cc +++ b/browser/ui/webui/brave_wallet/wallet_panel_ui.cc @@ -101,9 +101,6 @@ WalletPanelUI::WalletPanelUI(content::WebUI* web_ui) source->AddString("braveWalletMarketUiBridgeUrl", kUntrustedMarketURL); source->AddBoolean("isMobile", false); source->AddBoolean("isIOS", false); - source->AddBoolean(brave_wallet::mojom::kP3ACountTestNetworksLoadTimeKey, - base::CommandLine::ForCurrentProcess()->HasSwitch( - brave_wallet::mojom::kP3ACountTestNetworksSwitch)); #if BUILDFLAG(ENABLE_BRAVE_REWARDS) source->AddBoolean("rewardsFeatureEnabled", brave_rewards::IsSupportedForProfile(profile)); diff --git a/chromium_src/chrome/browser/prefs/browser_prefs.cc b/chromium_src/chrome/browser/prefs/browser_prefs.cc index 113d543e78c..ebf1303a096 100644 --- a/chromium_src/chrome/browser/prefs/browser_prefs.cc +++ b/chromium_src/chrome/browser/prefs/browser_prefs.cc @@ -298,7 +298,9 @@ void MigrateObsoleteLocalStatePrefs(PrefService* local_state) { #endif ntp_background_images::NTPBackgroundImagesService:: MigrateObsoleteLocalStatePrefs(local_state); - +#if BUILDFLAG(ENABLE_BRAVE_WALLET) + brave_wallet::MigrateObsoleteLocalStatePrefs(local_state); +#endif // END_MIGRATE_OBSOLETE_LOCAL_STATE_PREFS } diff --git a/components/brave_wallet/browser/brave_wallet_p3a.cc b/components/brave_wallet/browser/brave_wallet_p3a.cc index 45257be7d81..6865cfa9009 100644 --- a/components/brave_wallet/browser/brave_wallet_p3a.cc +++ b/components/brave_wallet/browser/brave_wallet_p3a.cc @@ -5,24 +5,16 @@ #include "brave/components/brave_wallet/browser/brave_wallet_p3a.h" -#include #include -#include #include #include "base/check.h" -#include "base/check_op.h" -#include "base/command_line.h" -#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" -#include "base/notreached.h" -#include "base/strings/string_number_conversions.h" #include "base/time/time.h" #include "brave/components/brave_wallet/browser/brave_wallet_service.h" #include "brave/components/brave_wallet/browser/keyring_service.h" #include "brave/components/brave_wallet/browser/pref_names.h" #include "brave/components/brave_wallet/browser/tx_service.h" -#include "brave/components/brave_wallet/common/common_utils.h" #include "brave/components/p3a_utils/bucket.h" #include "brave/components/p3a_utils/feature_usage.h" #include "components/prefs/pref_service.h" @@ -33,7 +25,6 @@ namespace brave_wallet { namespace { const int kRefreshP3AFrequencyHours = 24; -const int kActiveAccountBuckets[] = {0, 1, 2, 3, 7}; const int kNFTCountBuckets[] = {0, 4, 20}; constexpr base::TimeDelta kOnboardingRecordDelay = base::Seconds(120); @@ -48,12 +39,10 @@ void RecordKeyringCreated(bool created) { BraveWalletP3A::BraveWalletP3A(BraveWalletService* wallet_service, KeyringService* keyring_service, - TxService* tx_service, PrefService* profile_prefs, PrefService* local_state) : wallet_service_(wallet_service), keyring_service_(keyring_service), - tx_service_(tx_service), profile_prefs_(profile_prefs), local_state_(local_state) { DCHECK(profile_prefs); @@ -89,8 +78,6 @@ BraveWalletP3A::~BraveWalletP3A() = default; void BraveWalletP3A::AddObservers() { keyring_service_->AddObserver( keyring_service_observer_receiver_.BindNewPipeAndPassRemote()); - tx_service_->AddObserver( - tx_service_observer_receiver_.BindNewPipeAndPassRemote()); update_timer_.Start(FROM_HERE, base::Hours(kRefreshP3AFrequencyHours), this, &BraveWalletP3A::OnUpdateTimerFired); OnUpdateTimerFired(); // Also call on startup @@ -177,112 +164,6 @@ void BraveWalletP3A::RecordOnboardingHistogram() { UMA_HISTOGRAM_ENUMERATION(kOnboardingConversionHistogramName, *last_step); } -void BraveWalletP3A::ReportTransactionSent(mojom::CoinType coin, - bool new_send) { - const char* histogram_name = nullptr; - switch (coin) { - case mojom::CoinType::ETH: - histogram_name = kEthTransactionSentHistogramName; - break; - case mojom::CoinType::SOL: - histogram_name = kSolTransactionSentHistogramName; - break; - case mojom::CoinType::FIL: - histogram_name = kFilTransactionSentHistogramName; - break; - case mojom::CoinType::BTC: - histogram_name = kBtcTransactionSentHistogramName; - break; - case mojom::CoinType::ZEC: - histogram_name = kZecTransactionSentHistogramName; - break; - case mojom::CoinType::ADA: - histogram_name = kAdaTransactionSentHistogramName; - break; - case mojom::CoinType::DOT: - // TODO(https://github.com/brave/brave-browser/issues/49536): Polkadot P3A - return; - } - - CHECK(histogram_name); - - ScopedDictPrefUpdate last_sent_time_update( - profile_prefs_, kBraveWalletLastTransactionSentTimeDict); - base::DictValue& last_sent_time_dict = last_sent_time_update.Get(); - - std::string coin_key = base::NumberToString(static_cast(coin)); - - base::Time now = base::Time::Now(); - base::Time last_sent_time = base::Time::FromSecondsSinceUnixEpoch( - last_sent_time_dict.FindDouble(coin_key).value_or(0.0)); - - if (!new_send && last_sent_time.is_null()) { - // Don't report if a transaction was never sent. - return; - } - int answer = 0; - if (new_send || (now - last_sent_time) < base::Days(7)) { - answer = 1; - } - if (new_send) { - last_sent_time_dict.Set(coin_key, now.InSecondsFSinceUnixEpoch()); - } - - base::UmaHistogramExactLinear(histogram_name, answer, 2); -} - -void BraveWalletP3A::RecordActiveWalletCount(int count, - mojom::CoinType coin_type) { - DCHECK_GE(count, 0); - const char* histogram_name = nullptr; - - switch (coin_type) { - case mojom::CoinType::ETH: - histogram_name = kEthActiveAccountHistogramName; - break; - case mojom::CoinType::SOL: - histogram_name = kSolActiveAccountHistogramName; - break; - case mojom::CoinType::FIL: - histogram_name = kFilActiveAccountHistogramName; - break; - case mojom::CoinType::BTC: - histogram_name = kBtcActiveAccountHistogramName; - break; - case mojom::CoinType::ZEC: - histogram_name = kZecActiveAccountHistogramName; - break; - case mojom::CoinType::ADA: - histogram_name = kAdaActiveAccountHistogramName; - break; - case mojom::CoinType::DOT: - // TODO(https://github.com/brave/brave-browser/issues/49536): Polkadot P3A - return; - } - - CHECK(histogram_name); - - const base::DictValue& active_wallet_dict = - profile_prefs_->GetDict(kBraveWalletP3AActiveWalletDict); - std::string coin_type_str = base::NumberToString(static_cast(coin_type)); - if (!active_wallet_dict.FindBool(coin_type_str).has_value()) { - if (count == 0) { - // Should not record zero to histogram if user never had an active - // account, to avoid sending unnecessary data. - return; - } - ScopedDictPrefUpdate active_wallet_dict_update( - profile_prefs_, kBraveWalletP3AActiveWalletDict); - active_wallet_dict_update->Set(coin_type_str, true); - } - p3a_utils::RecordToHistogramBucket(histogram_name, kActiveAccountBuckets, - count); - - if (count > 0) { - MaybeRecordNewUserBalance(); - } -} - void BraveWalletP3A::RecordNFTGalleryView(int nft_count) { if (!local_state_->GetBoolean(kBraveWalletP3ANFTGalleryUsed)) { local_state_->SetBoolean(kBraveWalletP3ANFTGalleryUsed, true); @@ -292,15 +173,6 @@ void BraveWalletP3A::RecordNFTGalleryView(int nft_count) { kNFTCountBuckets, nft_count); } -void BraveWalletP3A::MaybeRecordNewUserBalance() { - base::Time deadline = base::Time::Now() - base::Days(7); - if (local_state_->GetTime(kBraveWalletP3AFirstUnlockTime) >= deadline && - !local_state_->GetBoolean(kBraveWalletP3ANewUserBalanceReported)) { - UMA_HISTOGRAM_BOOLEAN(kNewUserBalanceHistogramName, true); - local_state_->SetBoolean(kBraveWalletP3ANewUserBalanceReported, true); - } -} - void BraveWalletP3A::ReportNftDiscoverySetting() { if (!local_state_->GetTime(kBraveWalletLastUnlockTime).is_null()) { UMA_HISTOGRAM_BOOLEAN( @@ -311,9 +183,6 @@ void BraveWalletP3A::ReportNftDiscoverySetting() { void BraveWalletP3A::OnUpdateTimerFired() { ReportUsage(false); - for (const auto& coin : GetEnabledCoins()) { - ReportTransactionSent(coin, false); - } } void BraveWalletP3A::WriteUsageStatsToHistogram() { @@ -331,79 +200,4 @@ void BraveWalletP3A::WalletCreated() { RecordKeyringCreated(keyring_service_->IsWalletCreatedSync()); } -void BraveWalletP3A::OnTransactionStatusChanged( - mojom::TransactionInfoPtr tx_info) { - if (tx_info->tx_status != mojom::TransactionStatus::Approved) { - return; - } - - auto tx_coin = GetCoinTypeFromTxDataUnion(*tx_info->tx_data_union); - auto tx_type = tx_info->tx_type; - auto count_test_networks = base::CommandLine::ForCurrentProcess()->HasSwitch( - brave_wallet::mojom::kP3ACountTestNetworksSwitch); - auto chain_id = tx_info->chain_id; - - if (tx_coin == mojom::CoinType::ETH) { - if (tx_type != mojom::TransactionType::ETHSend && - tx_type != mojom::TransactionType::ERC20Transfer) { - return; - } - if (!count_test_networks && - (chain_id == mojom::kSepoliaChainId || - chain_id == mojom::kLocalhostChainId || - chain_id == mojom::kFilecoinEthereumTestnetChainId)) { - return; - } - } else if (tx_coin == mojom::CoinType::FIL) { - if (tx_type != mojom::TransactionType::Other) { - return; - } - if (!count_test_networks && (chain_id == mojom::kFilecoinTestnet || - chain_id == mojom::kLocalhostChainId)) { - return; - } - } else if (tx_coin == mojom::CoinType::SOL) { - if (tx_type != mojom::TransactionType::SolanaSystemTransfer && - tx_type != mojom::TransactionType::SolanaSPLTokenTransfer && - tx_type != - mojom::TransactionType:: - SolanaSPLTokenTransferWithAssociatedTokenAccountCreation) { - return; - } - if (!count_test_networks && (chain_id == mojom::kSolanaTestnet || - chain_id == mojom::kSolanaDevnet || - chain_id == mojom::kLocalhostChainId)) { - return; - } - } else if (tx_coin == mojom::CoinType::BTC) { - if (tx_type != mojom::TransactionType::Other) { - return; - } - if (!count_test_networks && chain_id == mojom::kBitcoinTestnet) { - return; - } - } else if (tx_coin == mojom::CoinType::ZEC) { - if (tx_type != mojom::TransactionType::Other) { - return; - } - if (!count_test_networks && chain_id == mojom::kZCashTestnet) { - return; - } - } else if (tx_coin == mojom::CoinType::ADA) { - if (!count_test_networks && chain_id == mojom::kCardanoTestnet) { - return; - } - } else if (tx_coin == mojom::CoinType::DOT) { - if (tx_type != mojom::TransactionType::Other) { - return; - } - if (!count_test_networks && chain_id == mojom::kPolkadotTestnet) { - return; - } - } else { - NOTREACHED() << tx_coin; - } - ReportTransactionSent(tx_coin, true); -} - } // namespace brave_wallet diff --git a/components/brave_wallet/browser/brave_wallet_p3a.h b/components/brave_wallet/browser/brave_wallet_p3a.h index 543c73e620d..17171f7385b 100644 --- a/components/brave_wallet/browser/brave_wallet_p3a.h +++ b/components/brave_wallet/browser/brave_wallet_p3a.h @@ -24,32 +24,6 @@ inline constexpr char kKeyringCreatedHistogramName[] = "Brave.Wallet.KeyringCreated"; inline constexpr char kOnboardingConversionHistogramName[] = "Brave.Wallet.OnboardingConversion.3"; -inline constexpr char kNewUserBalanceHistogramName[] = - "Brave.Wallet.NewUserBalance"; -inline constexpr char kEthTransactionSentHistogramName[] = - "Brave.Wallet.EthTransactionSent"; -inline constexpr char kSolTransactionSentHistogramName[] = - "Brave.Wallet.SolTransactionSent"; -inline constexpr char kFilTransactionSentHistogramName[] = - "Brave.Wallet.FilTransactionSent"; -inline constexpr char kBtcTransactionSentHistogramName[] = - "Brave.Wallet.BtcTransactionSent"; -inline constexpr char kZecTransactionSentHistogramName[] = - "Brave.Wallet.ZecTransactionSent"; -inline constexpr char kAdaTransactionSentHistogramName[] = - "Brave.Wallet.AdaTransactionSent"; -inline constexpr char kEthActiveAccountHistogramName[] = - "Brave.Wallet.ActiveEthAccounts"; -inline constexpr char kSolActiveAccountHistogramName[] = - "Brave.Wallet.ActiveSolAccounts"; -inline constexpr char kFilActiveAccountHistogramName[] = - "Brave.Wallet.ActiveFilAccounts"; -inline constexpr char kBtcActiveAccountHistogramName[] = - "Brave.Wallet.ActiveBtcAccounts"; -inline constexpr char kZecActiveAccountHistogramName[] = - "Brave.Wallet.ActiveZecAccounts"; -inline constexpr char kAdaActiveAccountHistogramName[] = - "Brave.Wallet.ActiveAdaAccounts"; inline constexpr char kBraveWalletDailyHistogramName[] = "Brave.Wallet.UsageDaily"; inline constexpr char kBraveWalletWeeklyHistogramName[] = @@ -69,16 +43,13 @@ inline constexpr char kBraveWalletNFTDiscoveryEnabledHistogramName[] = class BraveWalletService; class KeyringService; -class TxService; // Reports BraveWallet related P3A data class BraveWalletP3A : public KeyringServiceObserverBase, - public mojom::BraveWalletP3A, - public mojom::TxServiceObserver { + public mojom::BraveWalletP3A { public: BraveWalletP3A(BraveWalletService* wallet_service, KeyringService* keyring_service, - TxService* tx_service, PrefService* profile_prefs, PrefService* local_state); @@ -95,18 +66,11 @@ class BraveWalletP3A : public KeyringServiceObserverBase, void ReportUsage(bool unlocked); void ReportOnboardingAction(mojom::OnboardingAction action) override; - void RecordActiveWalletCount(int count, mojom::CoinType coin_type) override; void RecordNFTGalleryView(int nft_count) override; // KeyringServiceObserverBase: void WalletCreated() override; - // mojom::TxServiceObserver: - void OnNewUnapprovedTx(mojom::TransactionInfoPtr tx_info) override {} - void OnUnapprovedTxUpdated(mojom::TransactionInfoPtr tx_info) override {} - void OnTransactionStatusChanged(mojom::TransactionInfoPtr tx_info) override; - void OnTxServiceReset() override {} - private: FRIEND_TEST_ALL_PREFIXES(BraveWalletP3AUnitTest, ReportTransactionSent); friend class BraveWalletP3AUnitTest; @@ -116,20 +80,15 @@ class BraveWalletP3A : public KeyringServiceObserverBase, void RecordInitialBraveWalletP3AState(); std::optional GetLastOnboardingAction(); void RecordOnboardingHistogram(); - void MaybeRecordNewUserBalance(); void ReportNftDiscoverySetting(); - void ReportTransactionSent(mojom::CoinType coin, bool new_send); raw_ptr wallet_service_; raw_ptr keyring_service_; - raw_ptr tx_service_; raw_ptr profile_prefs_; raw_ptr local_state_; mojo::Receiver keyring_service_observer_receiver_{this}; - mojo::Receiver tx_service_observer_receiver_{this}; - base::OneShotTimer onboarding_report_timer_; mojo::ReceiverSet receivers_; diff --git a/components/brave_wallet/browser/brave_wallet_p3a_private.cc b/components/brave_wallet/browser/brave_wallet_p3a_private.cc index cb386192d2d..2d2d614274b 100644 --- a/components/brave_wallet/browser/brave_wallet_p3a_private.cc +++ b/components/brave_wallet/browser/brave_wallet_p3a_private.cc @@ -10,10 +10,6 @@ namespace brave_wallet { void BraveWalletP3APrivate::ReportOnboardingAction( mojom::OnboardingAction onboarding_action) {} -void BraveWalletP3APrivate::RecordActiveWalletCount(int count, - mojom::CoinType coin_type) { -} - void BraveWalletP3APrivate::RecordNFTGalleryView(int nft_count) {} } // namespace brave_wallet diff --git a/components/brave_wallet/browser/brave_wallet_p3a_private.h b/components/brave_wallet/browser/brave_wallet_p3a_private.h index 8e685ff9662..d1d46222a8f 100644 --- a/components/brave_wallet/browser/brave_wallet_p3a_private.h +++ b/components/brave_wallet/browser/brave_wallet_p3a_private.h @@ -19,7 +19,6 @@ class BraveWalletP3APrivate : public mojom::BraveWalletP3A { void ReportOnboardingAction( mojom::OnboardingAction onboarding_action) override; - void RecordActiveWalletCount(int count, mojom::CoinType coin_type) override; void RecordNFTGalleryView(int nft_count) override; }; diff --git a/components/brave_wallet/browser/brave_wallet_p3a_unittest.cc b/components/brave_wallet/browser/brave_wallet_p3a_unittest.cc index df7e801c73e..d6ffed98ecf 100644 --- a/components/brave_wallet/browser/brave_wallet_p3a_unittest.cc +++ b/components/brave_wallet/browser/brave_wallet_p3a_unittest.cc @@ -6,25 +6,13 @@ #include "brave/components/brave_wallet/browser/brave_wallet_p3a.h" #include -#include #include -#include -#include -#include "base/command_line.h" #include "base/functional/callback_helpers.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_util.h" -#include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" -#include "base/test/values_test_util.h" -#include "brave/components/brave_wallet/browser/bitcoin/bitcoin_test_utils.h" #include "brave/components/brave_wallet/browser/brave_wallet_service.h" -#include "brave/components/brave_wallet/browser/brave_wallet_utils.h" -#include "brave/components/brave_wallet/browser/cardano/cardano_test_utils.h" -#include "brave/components/brave_wallet/browser/json_rpc_service.h" #include "brave/components/brave_wallet/browser/keyring_service.h" #include "brave/components/brave_wallet/browser/pref_names.h" #include "brave/components/brave_wallet/browser/test_utils.h" @@ -32,7 +20,6 @@ #include "brave/components/brave_wallet/browser/zcash/zcash_tx_manager.h" #include "brave/components/brave_wallet/common/brave_wallet.mojom.h" #include "brave/components/brave_wallet/common/features.h" -#include "brave/components/brave_wallet/common/zcash_utils.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #include "services/network/test/test_url_loader_factory.h" @@ -57,239 +44,19 @@ class BraveWalletP3AUnitTest : public testing::Test { brave_wallet::RegisterLocalStatePrefs(local_state_.registry()); brave_wallet::RegisterLocalStatePrefsForMigration(local_state_.registry()); - bitcoin_test_rpc_server_ = std::make_unique(); - brave_wallet_service_ = std::make_unique( url_loader_factory_.GetSafeWeakWrapper(), TestBraveWalletServiceDelegate::Create(), &prefs_, &local_state_); - brave_wallet_service_->json_rpc_service()->SetAPIRequestHelperForTesting( - url_loader_factory_.GetSafeWeakWrapper()); - brave_wallet_service_->GetBitcoinWalletService() - ->SetUrlLoaderFactoryForTesting( - bitcoin_test_rpc_server_->GetURLLoaderFactory()); - cardano_test_rpc_server_ = std::make_unique( - *brave_wallet_service_->GetCardanoWalletService()); - WaitForTxStorageInitialized(tx_service()->GetTxStorageForTesting()); } void WaitForResponse() { task_environment_.RunUntilIdle(); } KeyringService* keyring_service() { return brave_wallet_service_->keyring_service(); } - TxService* tx_service() { return brave_wallet_service_->tx_service(); } BraveWalletP3A* wallet_p3a() { return brave_wallet_service_->GetBraveWalletP3A(); } - AccountUtils GetAccountUtils() { return AccountUtils(keyring_service()); } - - mojom::AccountIdPtr eth_from() { return EthAccount(0); } - - mojom::AccountIdPtr EthAccount(size_t index) { - return GetAccountUtils().EnsureEthAccount(index)->account_id->Clone(); - } - - mojom::AccountIdPtr sol_from() { return SolAccount(0); } - - mojom::AccountIdPtr SolAccount(size_t index) { - return GetAccountUtils().EnsureSolAccount(index)->account_id->Clone(); - } - - mojom::AccountIdPtr fil_from() { return FilAccount(0); } - - mojom::AccountIdPtr FilAccount(size_t index) { - return GetAccountUtils().EnsureFilAccount(index)->account_id->Clone(); - } - - mojom::AccountIdPtr btc_from() { return BtcAccount(0); } - - mojom::AccountIdPtr BtcAccount(size_t index) { - return GetAccountUtils().EnsureBtcAccount(index)->account_id->Clone(); - } - - mojom::AccountIdPtr zec_from() { return ZecAccount(0); } - - mojom::AccountIdPtr ZecAccount(size_t index) { - return GetAccountUtils().EnsureZecAccount(index)->account_id->Clone(); - } - - mojom::AccountIdPtr ada_from() { return AdaAccount(0); } - - mojom::AccountIdPtr AdaAccount(size_t index) { - return GetAccountUtils().EnsureAdaAccount(index)->account_id->Clone(); - } - - void ContinueAddUnapprovedZecTransaction( - const std::string& chain_id, - const mojom::AccountIdPtr& from, - const std::optional& origin, - TxService::AddUnapprovedZCashTransactionCallback callback, - base::expected zcash_transaction) { - tx_service()->GetZCashTxManager()->ContinueAddUnapprovedTransaction( - from, origin, nullptr, std::move(callback), - std::move(zcash_transaction)); - } - - void SetInterceptor(const std::string& content) { - url_loader_factory_.SetInterceptor(base::BindLambdaForTesting( - [&, content](const network::ResourceRequest& request) { - url_loader_factory_.ClearResponses(); - url_loader_factory_.AddResponse(request.url.spec(), content); - })); - } - - void SetSolInterceptor(const std::string& latest_blockhash, - uint64_t last_valid_block_height, - const std::string& tx_hash, - uint64_t block_height = 0, - bool get_null_signature_statuses = false) { - url_loader_factory_.SetInterceptor(base::BindLambdaForTesting( - [&, latest_blockhash, tx_hash, last_valid_block_height, - block_height](const network::ResourceRequest& request) { - url_loader_factory_.ClearResponses(); - std::string_view request_string(request.request_body->elements() - ->at(0) - .As() - .AsStringPiece()); - base::DictValue request_root = - base::test::ParseJsonDict(request_string); - - std::string* method = request_root.FindString("method"); - ASSERT_TRUE(method); - - if (*method == "getLatestBlockhash") { - url_loader_factory_.AddResponse( - request.url.spec(), - "{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":" - "{\"context\":{\"slot\":1069},\"value\":{\"blockhash\":\"" + - latest_blockhash + "\", \"lastValidBlockHeight\":" + - base::NumberToString(last_valid_block_height) + "}}}"); - } else if (*method == "getBlockHeight") { - url_loader_factory_.AddResponse( - request.url.spec(), R"({"jsonrpc":"2.0", "id":1, "result":)" + - base::NumberToString(block_height) + - "}"); - } else if (*method == "sendTransaction") { - url_loader_factory_.AddResponse( - request.url.spec(), - "{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":\"" + tx_hash + - "\"}"); - } else if (*method == "simulateTransaction") { - url_loader_factory_.AddResponse(request.url.spec(), R"({ - "jsonrpc": "2.0", - "result": { - "context": { - "apiVersion": "1.17.25", - "slot": 259225005 - }, - "value": { - "accounts": null, - "err": null, - "logs": [ - "Program BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY invoke [1]", - "Program log: Instruction: Transfer", - "Program BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY success" - ], - "returnData": null, - "unitsConsumed": 69017 - } - }, - "id": 1 - })"); - } else if (*method == "getRecentPrioritizationFees") { - url_loader_factory_.AddResponse(request.url.spec(), R"({ - "jsonrpc": "2.0", - "result": [ - { - "prioritizationFee": 100, - "slot": 293251906 - }, - { - "prioritizationFee": 200, - "slot": 293251906 - }, - { - "prioritizationFee": 0, - "slot": 293251805 - } - ], - "id": 1 - })"); - } else if (*method == "getFeeForMessage") { - url_loader_factory_.AddResponse(request.url.spec(), R"({ - "jsonrpc":"2.0","id":1, - "result": { - "context":{"slot":123065869}, - "value": 5000 - } - })"); - } - })); - } - - void SetFilInterceptor(const std::string& from_account, - const std::string& to_account) { - url_loader_factory_.SetInterceptor(base::BindLambdaForTesting( - [&, from_account, to_account](const network::ResourceRequest& request) { - url_loader_factory_.ClearResponses(); - std::string_view request_string(request.request_body->elements() - ->at(0) - .As() - .AsStringPiece()); - base::DictValue request_root = - base::test::ParseJsonDict(request_string); - - std::string* method = request_root.FindString("method"); - ASSERT_TRUE(method); - - if (*method == "Filecoin.GasEstimateMessageGas") { - std::string gas_response = R"({ - "jsonrpc": "2.0", - "result": { - "Version": 0, - "To": "{to}", - "From": "{from}", - "Nonce": 5, - "Value": "42", - "GasLimit": 598585, - "GasFeeCap": "100820", - "GasPremium": "99766", - "Method": 0, - "Params": "", - "CID": { - "/": - "bafy2bzacedkdoldmztwjwi3jvxhxo4qqp7haufuifpqzregfqkthlyhhf2lfu" - } - }, - "id": 1 - })"; - base::ReplaceSubstringsAfterOffset(&gas_response, 0, "{to}", - to_account); - base::ReplaceSubstringsAfterOffset(&gas_response, 0, "{from}", - from_account); - url_loader_factory_.AddResponse(request.url.spec(), gas_response); - } else if (*method == "Filecoin.MpoolGetNonce") { - url_loader_factory_.AddResponse( - request.url.spec(), - R"({ "jsonrpc": "2.0", "id": 1, "result": 1 })"); - } else if (*method == "Filecoin.StateSearchMsgLimited") { - url_loader_factory_.AddResponse( - request.url.spec(), - R"({ "jsonrpc": "2.0", "id": 1, "result": {}})"); - } else if (*method == "Filecoin.ChainHead") { - url_loader_factory_.AddResponse( - request.url.spec(), - R"({ "jsonrpc": "2.0", "id": 1, "result": {}})"); - } else if (*method == "Filecoin.MpoolPush") { - url_loader_factory_.AddResponse( - request.url.spec(), - R"({ "id": 1, "jsonrpc": "2.0", "result": { "/": - "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } - })"); - } - })); - } - protected: base::test::ScopedFeatureList feature_cardano_feature_{ features::kBraveWalletCardanoFeature}; @@ -298,9 +65,7 @@ class BraveWalletP3AUnitTest : public testing::Test { sync_preferences::TestingPrefServiceSyncable local_state_; network::TestURLLoaderFactory url_loader_factory_; std::unique_ptr histogram_tester_; - std::unique_ptr bitcoin_test_rpc_server_; std::unique_ptr brave_wallet_service_; - std::unique_ptr cardano_test_rpc_server_; }; TEST_F(BraveWalletP3AUnitTest, KeyringCreated) { @@ -348,125 +113,6 @@ TEST_F(BraveWalletP3AUnitTest, ReportOnboardingActionRestore) { histogram_tester_->ExpectTotalCount(kOnboardingConversionHistogramName, 0); } -TEST_F(BraveWalletP3AUnitTest, ReportTransactionSent) { - histogram_tester_->ExpectTotalCount(kEthTransactionSentHistogramName, 0); - histogram_tester_->ExpectTotalCount(kSolTransactionSentHistogramName, 0); - histogram_tester_->ExpectTotalCount(kFilTransactionSentHistogramName, 0); - histogram_tester_->ExpectTotalCount(kBtcTransactionSentHistogramName, 0); - histogram_tester_->ExpectTotalCount(kZecTransactionSentHistogramName, 0); - histogram_tester_->ExpectTotalCount(kAdaTransactionSentHistogramName, 0); - - wallet_p3a()->ReportTransactionSent(mojom::CoinType::ETH, true); - histogram_tester_->ExpectUniqueSample(kEthTransactionSentHistogramName, 1, 1); - - wallet_p3a()->ReportTransactionSent(mojom::CoinType::SOL, true); - histogram_tester_->ExpectUniqueSample(kSolTransactionSentHistogramName, 1, 1); - - wallet_p3a()->ReportTransactionSent(mojom::CoinType::FIL, true); - histogram_tester_->ExpectUniqueSample(kFilTransactionSentHistogramName, 1, 1); - - wallet_p3a()->ReportTransactionSent(mojom::CoinType::BTC, true); - histogram_tester_->ExpectUniqueSample(kBtcTransactionSentHistogramName, 1, 1); - - wallet_p3a()->ReportTransactionSent(mojom::CoinType::ZEC, true); - histogram_tester_->ExpectUniqueSample(kZecTransactionSentHistogramName, 1, 1); - - wallet_p3a()->ReportTransactionSent(mojom::CoinType::ADA, true); - histogram_tester_->ExpectUniqueSample(kAdaTransactionSentHistogramName, 1, 1); - - task_environment_.FastForwardBy(base::Days(4)); - histogram_tester_->ExpectUniqueSample(kEthTransactionSentHistogramName, 1, 5); - histogram_tester_->ExpectUniqueSample(kSolTransactionSentHistogramName, 1, 5); - histogram_tester_->ExpectUniqueSample(kFilTransactionSentHistogramName, 1, 5); - histogram_tester_->ExpectUniqueSample(kBtcTransactionSentHistogramName, 1, 5); - histogram_tester_->ExpectUniqueSample(kZecTransactionSentHistogramName, 1, 5); - histogram_tester_->ExpectUniqueSample(kAdaTransactionSentHistogramName, 1, 5); - - task_environment_.FastForwardBy(base::Days(3)); - histogram_tester_->ExpectBucketCount(kEthTransactionSentHistogramName, 0, 1); - histogram_tester_->ExpectBucketCount(kSolTransactionSentHistogramName, 0, 1); - histogram_tester_->ExpectBucketCount(kFilTransactionSentHistogramName, 0, 1); - histogram_tester_->ExpectBucketCount(kBtcTransactionSentHistogramName, 0, 1); - histogram_tester_->ExpectBucketCount(kZecTransactionSentHistogramName, 0, 1); - histogram_tester_->ExpectBucketCount(kAdaTransactionSentHistogramName, 0, 1); -} - -TEST_F(BraveWalletP3AUnitTest, ActiveAccounts) { - wallet_p3a()->RecordActiveWalletCount(0, mojom::CoinType::ETH); - wallet_p3a()->RecordActiveWalletCount(0, mojom::CoinType::FIL); - wallet_p3a()->RecordActiveWalletCount(0, mojom::CoinType::SOL); - wallet_p3a()->RecordActiveWalletCount(0, mojom::CoinType::BTC); - wallet_p3a()->RecordActiveWalletCount(0, mojom::CoinType::ZEC); - wallet_p3a()->RecordActiveWalletCount(0, mojom::CoinType::ADA); - - // Should not record zero to histogram if user never had an active account - histogram_tester_->ExpectTotalCount(kEthActiveAccountHistogramName, 0); - histogram_tester_->ExpectTotalCount(kFilActiveAccountHistogramName, 0); - histogram_tester_->ExpectTotalCount(kSolActiveAccountHistogramName, 0); - histogram_tester_->ExpectTotalCount(kBtcActiveAccountHistogramName, 0); - histogram_tester_->ExpectTotalCount(kZecActiveAccountHistogramName, 0); - histogram_tester_->ExpectTotalCount(kAdaActiveAccountHistogramName, 0); - - wallet_p3a()->RecordActiveWalletCount(3, mojom::CoinType::ETH); - wallet_p3a()->RecordActiveWalletCount(9, mojom::CoinType::FIL); - wallet_p3a()->RecordActiveWalletCount(7, mojom::CoinType::SOL); - wallet_p3a()->RecordActiveWalletCount(4, mojom::CoinType::BTC); - wallet_p3a()->RecordActiveWalletCount(2, mojom::CoinType::ZEC); - wallet_p3a()->RecordActiveWalletCount(1, mojom::CoinType::ADA); - - histogram_tester_->ExpectBucketCount(kEthActiveAccountHistogramName, 3, 1); - histogram_tester_->ExpectBucketCount(kFilActiveAccountHistogramName, 5, 1); - histogram_tester_->ExpectBucketCount(kSolActiveAccountHistogramName, 4, 1); - histogram_tester_->ExpectBucketCount(kBtcActiveAccountHistogramName, 4, 1); - histogram_tester_->ExpectBucketCount(kZecActiveAccountHistogramName, 2, 1); - histogram_tester_->ExpectBucketCount(kAdaActiveAccountHistogramName, 1, 1); - - wallet_p3a()->RecordActiveWalletCount(0, mojom::CoinType::ETH); - wallet_p3a()->RecordActiveWalletCount(1, mojom::CoinType::FIL); - wallet_p3a()->RecordActiveWalletCount(2, mojom::CoinType::SOL); - wallet_p3a()->RecordActiveWalletCount(3, mojom::CoinType::BTC); - wallet_p3a()->RecordActiveWalletCount(4, mojom::CoinType::ZEC); - wallet_p3a()->RecordActiveWalletCount(5, mojom::CoinType::ADA); - - histogram_tester_->ExpectBucketCount(kEthActiveAccountHistogramName, 0, 1); - histogram_tester_->ExpectBucketCount(kFilActiveAccountHistogramName, 1, 1); - histogram_tester_->ExpectBucketCount(kSolActiveAccountHistogramName, 2, 1); - histogram_tester_->ExpectBucketCount(kBtcActiveAccountHistogramName, 3, 1); - histogram_tester_->ExpectBucketCount(kZecActiveAccountHistogramName, 4, 1); - histogram_tester_->ExpectBucketCount(kAdaActiveAccountHistogramName, 4, 1); -} - -TEST_F(BraveWalletP3AUnitTest, NewUserBalance) { - // record first usage - wallet_p3a()->ReportUsage(true); - - task_environment_.FastForwardBy(base::Days(3)); - wallet_p3a()->ReportUsage(true); - - histogram_tester_->ExpectTotalCount(kNewUserBalanceHistogramName, 0); - wallet_p3a()->RecordActiveWalletCount(1, mojom::CoinType::ETH); - histogram_tester_->ExpectUniqueSample(kNewUserBalanceHistogramName, 1, 1); - - task_environment_.FastForwardBy(base::Days(2)); - wallet_p3a()->RecordActiveWalletCount(1, mojom::CoinType::ETH); - // Should not record because we already recorded - histogram_tester_->ExpectUniqueSample(kNewUserBalanceHistogramName, 1, 1); -} - -TEST_F(BraveWalletP3AUnitTest, NewUserBalancePastDeadline) { - // record first usage - wallet_p3a()->ReportUsage(true); - - task_environment_.FastForwardBy(base::Days(8)); - wallet_p3a()->ReportUsage(true); - - histogram_tester_->ExpectTotalCount(kNewUserBalanceHistogramName, 0); - wallet_p3a()->RecordActiveWalletCount(1, mojom::CoinType::ETH); - - // Should not record new value since we are past the deadline - histogram_tester_->ExpectTotalCount(kNewUserBalanceHistogramName, 0); -} - TEST_F(BraveWalletP3AUnitTest, NFTGalleryViews) { histogram_tester_->ExpectTotalCount(kBraveWalletNFTCountHistogramName, 0); histogram_tester_->ExpectTotalCount(kBraveWalletNFTNewUserHistogramName, 0); @@ -501,322 +147,4 @@ TEST_F(BraveWalletP3AUnitTest, NFTDiscoveryEnabled) { kBraveWalletNFTDiscoveryEnabledHistogramName, 0, 2); } -TEST_F(BraveWalletP3AUnitTest, EthTransactionSentObservation) { - histogram_tester_->ExpectTotalCount(kEthTransactionSentHistogramName, 0); - - keyring_service()->CreateWallet("testing123", base::DoNothing()); - - // Set an interceptor and just fake a common response for - // eth_getTransactionCount and eth_sendRawTransaction - SetInterceptor("{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":\"0x0\"}"); - - // Create & add unapproved ETH transaction - TestFuture tx_add_future; - tx_service()->AddUnapprovedEvmTransaction( - mojom::NewEvmTransactionParams::New( - mojom::kBnbSmartChainMainnetChainId, eth_from(), - "0xbe862ad9abfe6f22bcb087716c7d89a26051f74c", "0x016345785d8a0000", - "0x0974", std::vector(), nullptr), - tx_add_future.GetCallback()); - auto [success, tx_meta_id, error_message] = tx_add_future.Take(); - EXPECT_TRUE(success); - EXPECT_NE(tx_meta_id, ""); - EXPECT_EQ(error_message, ""); - - // Approve the ETH transaction - TestFuture - approve_tx_future; - tx_service()->ApproveTransaction(mojom::CoinType::ETH, - mojom::kBnbSmartChainMainnetChainId, - tx_meta_id, approve_tx_future.GetCallback()); - auto [approve_success, approve_error, approve_error_message] = - approve_tx_future.Take(); - EXPECT_TRUE(approve_success); - EXPECT_EQ(approve_error_message, ""); - - // Verify EthTransactionSent - histogram_tester_->ExpectUniqueSample(kEthTransactionSentHistogramName, 1, 1); -} - -TEST_F(BraveWalletP3AUnitTest, TestnetEthTransactionSentObservation) { - histogram_tester_->ExpectTotalCount(kEthTransactionSentHistogramName, 0); - - keyring_service()->CreateWallet("testing123", base::DoNothing()); - - // Set an interceptor and just fake a common response for - // eth_getTransactionCount and eth_sendRawTransaction - SetInterceptor("{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":\"0x0\"}"); - - // Create & add unapproved ETH transaction on testnet - TestFuture tx_add_future; - tx_service()->AddUnapprovedEvmTransaction( - mojom::NewEvmTransactionParams::New( - mojom::kLocalhostChainId, eth_from(), - "0xbe862ad9abfe6f22bcb087716c7d89a26051f74c", "0x016345785d8a0000", - "0x0974", std::vector(), nullptr), - tx_add_future.GetCallback()); - auto [success, tx_meta_id, error_message] = tx_add_future.Take(); - EXPECT_TRUE(success); - EXPECT_NE(tx_meta_id, ""); - EXPECT_EQ(error_message, ""); - - // Approve the ETH transaction on testnet - TestFuture - approve_tx_future; - tx_service()->ApproveTransaction(mojom::CoinType::ETH, - mojom::kLocalhostChainId, tx_meta_id, - approve_tx_future.GetCallback()); - auto [approve_success, approve_error, approve_error_message] = - approve_tx_future.Take(); - EXPECT_TRUE(approve_success); - EXPECT_EQ(approve_error_message, ""); - - // Verify EthTransactionSent not updated (testnet switch disabled) - histogram_tester_->ExpectTotalCount(kEthTransactionSentHistogramName, 0); - - base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess(); - cmdline->AppendSwitch(mojom::kP3ACountTestNetworksSwitch); - - // Create & add unapproved ETH transaction on testnet - tx_service()->AddUnapprovedEvmTransaction( - mojom::NewEvmTransactionParams::New( - mojom::kLocalhostChainId, eth_from(), - "0xbe862ad9abfe6f22bcb087716c7d89a26051f74c", "0x016345785d8a0000", - "0x0974", std::vector(), nullptr), - tx_add_future.GetCallback()); - std::tie(success, tx_meta_id, error_message) = tx_add_future.Take(); - EXPECT_TRUE(success); - EXPECT_NE(tx_meta_id, ""); - EXPECT_EQ(error_message, ""); - - // Approve the ETH transaction on testnet - tx_service()->ApproveTransaction(mojom::CoinType::ETH, - mojom::kLocalhostChainId, tx_meta_id, - approve_tx_future.GetCallback()); - std::tie(approve_success, approve_error, approve_error_message) = - approve_tx_future.Take(); - EXPECT_TRUE(approve_success); - EXPECT_EQ(approve_error_message, ""); - - // Verify EthTransactionSent - histogram_tester_->ExpectUniqueSample(kEthTransactionSentHistogramName, 1, 1); - - cmdline->RemoveSwitch(mojom::kP3ACountTestNetworksSwitch); -} - -TEST_F(BraveWalletP3AUnitTest, SolTransactionSentObservation) { - histogram_tester_->ExpectTotalCount(kSolTransactionSentHistogramName, 0); - - keyring_service()->CreateWallet("testing123", base::DoNothing()); - - // Create & add unapproved SOL transaction - const auto& from_account = sol_from(); - std::string from_account_address = from_account->address; - - std::string to_account = "JDqrvDz8d8tFCADashbUKQDKfJZFobNy13ugN65t1wvV"; - const std::vector data = {2, 0, 0, 0, 128, 150, 152, 0, 0, 0, 0, 0}; - - std::vector account_metas; - auto account_meta1 = - mojom::SolanaAccountMeta::New(from_account_address, nullptr, true, true); - auto account_meta2 = - mojom::SolanaAccountMeta::New(to_account, nullptr, false, true); - account_metas.push_back(std::move(account_meta1)); - account_metas.push_back(std::move(account_meta2)); - - auto instruction = mojom::SolanaInstruction::New( - mojom::kSolanaSystemProgramId, std::move(account_metas), data, nullptr); - std::vector instructions; - instructions.push_back(std::move(instruction)); - - auto solana_tx_data = mojom::SolanaTxData::New( - "", 0, from_account_address, to_account, "", 10000000, 0, - mojom::TransactionType::SolanaSystemTransfer, std::move(instructions), - mojom::SolanaMessageVersion::kLegacy, - mojom::SolanaMessageHeader::New(1, 0, 1), - std::vector( - {from_account_address, to_account, mojom::kSolanaSystemProgramId}), - std::vector(), nullptr, - nullptr, nullptr); - - std::string tx_hash1 = - "5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpR" - "zrFmBV6UjKdiSZkQUW"; - auto* latest_blockhash1 = "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N"; - auto last_valid_block_height1 = 3090; - - SetSolInterceptor(latest_blockhash1, last_valid_block_height1, tx_hash1, - last_valid_block_height1); - - TestFuture tx_add_future; - tx_service()->AddUnapprovedSolanaTransaction( - std::move(solana_tx_data), mojom::kSolanaMainnet, sol_from(), nullptr, - tx_add_future.GetCallback()); - auto [success, tx_meta_id, error_message] = tx_add_future.Take(); - EXPECT_TRUE(success); - EXPECT_NE(tx_meta_id, ""); - EXPECT_EQ(error_message, ""); - - // Approve the SOL transaction - TestFuture - approve_tx_future; - tx_service()->ApproveTransaction(mojom::CoinType::SOL, mojom::kSolanaMainnet, - tx_meta_id, approve_tx_future.GetCallback()); - auto [approve_success, approve_error, approve_error_message] = - approve_tx_future.Take(); - EXPECT_TRUE(approve_success); - EXPECT_EQ(approve_error_message, ""); - - // Verify SolTransactionSent - histogram_tester_->ExpectUniqueSample(kSolTransactionSentHistogramName, 1, 1); -} - -TEST_F(BraveWalletP3AUnitTest, FilTransactionSentObservation) { - histogram_tester_->ExpectTotalCount(kFilTransactionSentHistogramName, 0); - - keyring_service()->CreateWallet("testing123", base::DoNothing()); - - // Create & add unapproved FIL transaction - std::string to_account = "f1h4n7rphclbmwyjcp6jrdiwlfcuwbroxy3jvg33q"; - SetFilInterceptor(fil_from()->address, to_account); - auto tx_data = mojom::FilTxData::New("" /* nonce */, "" /* gas_premium */, - "" /* gas_fee_cap */, "" /* gas_limit */, - "" /* max_fee */, to_account, "11"); - TestFuture tx_add_future; - tx_service()->AddUnapprovedFilecoinTransaction( - std::move(tx_data), mojom::kFilecoinMainnet, fil_from(), nullptr, - tx_add_future.GetCallback()); - auto [success, tx_meta_id, error_message] = tx_add_future.Take(); - EXPECT_TRUE(success); - EXPECT_NE(tx_meta_id, ""); - EXPECT_EQ(error_message, ""); - - // Approve the FIL transaction - TestFuture - approve_tx_future; - tx_service()->ApproveTransaction(mojom::CoinType::FIL, - mojom::kFilecoinMainnet, tx_meta_id, - approve_tx_future.GetCallback()); - auto [approve_success, approve_error, approve_error_message] = - approve_tx_future.Take(); - EXPECT_TRUE(approve_success); - EXPECT_EQ(approve_error_message, ""); - - // Verify FilTransactionSent - histogram_tester_->ExpectUniqueSample(kFilTransactionSentHistogramName, 1, 1); -} - -TEST_F(BraveWalletP3AUnitTest, BtcTransactionSentObservation) { - histogram_tester_->ExpectTotalCount(kBtcTransactionSentHistogramName, 0); - AccountUtils(keyring_service()) - .CreateWallet(kMnemonicDivideCruise, kTestWalletPassword); - - bitcoin_test_rpc_server_->SetUpBitcoinRpc(kMnemonicDivideCruise, 0); - - auto params = mojom::NewBitcoinTransactionParams::New( - mojom::kBitcoinMainnet, btc_from(), kMockBtcAddress, 5000, false, - nullptr); - - TestFuture tx_add_future; - tx_service()->AddUnapprovedBitcoinTransaction(std::move(params), - tx_add_future.GetCallback()); - auto [success, tx_meta_id, error_message] = tx_add_future.Take(); - EXPECT_TRUE(success); - EXPECT_NE(tx_meta_id, ""); - EXPECT_EQ(error_message, ""); - - // Approve the BTC transaction - TestFuture - approve_tx_future; - tx_service()->ApproveTransaction(mojom::CoinType::BTC, mojom::kBitcoinMainnet, - tx_meta_id, approve_tx_future.GetCallback()); - auto [approve_success, approve_error, approve_error_message] = - approve_tx_future.Take(); - EXPECT_TRUE(approve_success); - EXPECT_EQ(approve_error_message, ""); - - // Verify BtcTransactionSent - histogram_tester_->ExpectUniqueSample(kBtcTransactionSentHistogramName, 1, 1); -} - -TEST_F(BraveWalletP3AUnitTest, ZecTransactionSentObservation) { - histogram_tester_->ExpectTotalCount(kZecTransactionSentHistogramName, 0); - - keyring_service()->CreateWallet("testing123", base::DoNothing()); - - auto tx_data = mojom::BtcTxData::New(kMockBtcAddress, 5000, false, 0, - std::vector(), - std::vector()); - - ZCashTransaction zcash_transaction; - zcash_transaction.set_locktime(2286687); - { - ZCashTransaction::TxInput input; - input.utxo_outpoint.index = 0; - input.utxo_address = "t1c61yifRMgyhMsBYsFDBa5aEQkgU65CGau"; - input.utxo_value = 537000; - input.script_pub_key = - ZCashAddressToScriptPubkey(input.utxo_address, false).value(); - zcash_transaction.transparent_part().inputs.push_back(std::move(input)); - } - - { - ZCashTransaction::TxOutput output; - output.address = "t1KrG29yWzoi7Bs2pvsgXozZYPvGG4D3sGi"; - output.amount = 500000; - output.script_pubkey = - ZCashAddressToScriptPubkey(output.address, false).value(); - zcash_transaction.transparent_part().outputs.push_back(std::move(output)); - } - - TestFuture tx_add_future; - ContinueAddUnapprovedZecTransaction(mojom::kZCashMainnet, zec_from(), - std::nullopt, tx_add_future.GetCallback(), - std::move(zcash_transaction)); - auto [success, tx_meta_id, error_message] = tx_add_future.Take(); - EXPECT_TRUE(success); - EXPECT_NE(tx_meta_id, ""); - EXPECT_EQ(error_message, ""); - - // Approve the ZEC transaction - tx_service()->ApproveTransaction(mojom::CoinType::ZEC, mojom::kZCashMainnet, - tx_meta_id, base::DoNothing()); - WaitForResponse(); - - // Verify ZecTransactionSent - histogram_tester_->ExpectUniqueSample(kZecTransactionSentHistogramName, 1, 1); -} - -TEST_F(BraveWalletP3AUnitTest, AdaTransactionSentObservation) { - histogram_tester_->ExpectTotalCount(kAdaTransactionSentHistogramName, 0); - AccountUtils(keyring_service()) - .CreateWallet(kMnemonicDivideCruise, kTestWalletPassword); - - cardano_test_rpc_server_->SetUpCardanoRpc(kMnemonicDivideCruise, 0); - - auto params = mojom::NewCardanoTransactionParams::New( - mojom::kCardanoMainnet, ada_from(), kMockCardanoAddress1, 5000000, false, - std::nullopt, nullptr); - - TestFuture tx_add_future; - tx_service()->AddUnapprovedCardanoTransaction(std::move(params), - tx_add_future.GetCallback()); - auto [success, tx_meta_id, error_message] = tx_add_future.Take(); - EXPECT_TRUE(success); - EXPECT_NE(tx_meta_id, ""); - EXPECT_EQ(error_message, ""); - - TestFuture - approve_tx_future; - tx_service()->ApproveTransaction(mojom::CoinType::ADA, mojom::kCardanoMainnet, - tx_meta_id, approve_tx_future.GetCallback()); - auto [approve_success, approve_error, approve_error_message] = - approve_tx_future.Take(); - EXPECT_TRUE(approve_success); - EXPECT_EQ(approve_error_message, ""); - - // Verify AdaTransactionSent - histogram_tester_->ExpectUniqueSample(kAdaTransactionSentHistogramName, 1, 1); -} - } // namespace brave_wallet diff --git a/components/brave_wallet/browser/brave_wallet_service.cc b/components/brave_wallet/browser/brave_wallet_service.cc index 4b5a79c1b38..7c1c40a7494 100644 --- a/components/brave_wallet/browser/brave_wallet_service.cc +++ b/components/brave_wallet/browser/brave_wallet_service.cc @@ -275,7 +275,7 @@ BraveWalletService::BraveWalletService( profile_prefs, CreateTxStorage(*delegate_)); brave_wallet_p3a_ = std::make_unique( - this, keyring_service(), tx_service(), profile_prefs, local_state), + this, keyring_service(), profile_prefs, local_state), simple_hash_client_ = std::make_unique(url_loader_factory); asset_discovery_manager_ = std::make_unique( diff --git a/components/brave_wallet/browser/pref_names.cc b/components/brave_wallet/browser/pref_names.cc index c741015693a..de8a1d26d17 100644 --- a/components/brave_wallet/browser/pref_names.cc +++ b/components/brave_wallet/browser/pref_names.cc @@ -196,7 +196,6 @@ void RegisterLocalStatePrefs(PrefRegistrySimple* registry) { p3a_utils::RegisterFeatureUsagePrefs( registry, kBraveWalletP3AFirstUnlockTime, kBraveWalletP3ALastUnlockTime, kBraveWalletP3AUsedSecondDay, nullptr, nullptr); - registry->RegisterBooleanPref(kBraveWalletP3ANewUserBalanceReported, false); registry->RegisterIntegerPref(kBraveWalletP3AOnboardingLastStep, 0); registry->RegisterBooleanPref(kBraveWalletP3ANFTGalleryUsed, false); } @@ -217,7 +216,6 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { registry->RegisterStringPref(kDefaultBaseCurrency, "USD"); registry->RegisterStringPref(kDefaultBaseCryptocurrency, "BTC"); registry->RegisterBooleanPref(kShowWalletIconOnToolbar, true); - registry->RegisterDictionaryPref(kBraveWalletP3AActiveWalletDict); registry->RegisterDictionaryPref(kBraveWalletKeyrings); registry->RegisterBooleanPref(kBraveWalletKeyringEncryptionKeysMigrated, false); @@ -234,7 +232,6 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { registry->RegisterIntegerPref(kBraveWalletAutoLockMinutes, kDefaultWalletAutoLockMinutes); registry->RegisterDictionaryPref(kBraveWalletEthAllowancesCache); - registry->RegisterDictionaryPref(kBraveWalletLastTransactionSentTimeDict); registry->RegisterDictionaryPref(kBraveWalletPolkadotChainMetadata); registry->RegisterTimePref(kBraveWalletLastDiscoveredAssetsAt, base::Time()); @@ -263,7 +260,16 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { registry->RegisterBooleanPref(kERCOptedIntoCryptoWalletsDeprecated, false); } -void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) {} +void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) { + // Deprecated 05/2026 + registry->RegisterBooleanPref(kBraveWalletP3ANewUserBalanceReportedDeprecated, + false); +} + +void MigrateObsoleteLocalStatePrefs(PrefService* local_state) { + // Deprecated 05/2026 + local_state->ClearPref(kBraveWalletP3ANewUserBalanceReportedDeprecated); +} void RegisterProfilePrefsForMigration( user_prefs::PrefRegistrySyncable* registry) { @@ -290,6 +296,13 @@ void RegisterProfilePrefsForMigration( // Added 02/2025 registry->RegisterDictionaryPref(kBraveWalletTransactions); + + // Added 05/2026 + registry->RegisterDictionaryPref(kBraveWalletP3AActiveWalletDictDeprecated); + + // Added 05/2026 + registry->RegisterDictionaryPref( + kBraveWalletLastTransactionSentTimeDictDeprecated); } void ClearJsonRpcServiceProfilePrefs(PrefService* prefs) { @@ -359,6 +372,12 @@ void MigrateObsoleteProfilePrefs(PrefService* prefs) { // CryptoWallets Removed 05/2025 MigrateCryptoWalletsPrefToBraveWallet(prefs); + + // Added 05/2026 + prefs->ClearPref(kBraveWalletP3AActiveWalletDictDeprecated); + + // Added 05/2026 + prefs->ClearPref(kBraveWalletLastTransactionSentTimeDictDeprecated); } } // namespace brave_wallet diff --git a/components/brave_wallet/browser/pref_names.h b/components/brave_wallet/browser/pref_names.h index 5ec5dc3ac42..cd8a536eb9d 100644 --- a/components/brave_wallet/browser/pref_names.h +++ b/components/brave_wallet/browser/pref_names.h @@ -34,15 +34,8 @@ inline constexpr char kShowWalletIconOnToolbar[] = "brave.wallet.show_wallet_icon_on_toolbar"; inline constexpr char kBraveWalletLastUnlockTime[] = "brave.wallet.wallet_last_unlock_time_v2"; -// Deprecated 12/2025 -inline constexpr char kBraveWalletPingReportedUnlockTimeDeprecated[] = - "brave.wallet.wallet_report_unlock_time_ping"; inline constexpr char kBraveWalletP3ANFTGalleryUsed[] = "brave.wallet.wallet_p3a_nft_gallery_used"; -inline constexpr char kBraveWalletP3ANewUserBalanceReported[] = - "brave.wallet.p3a_new_user_balance_reported"; -inline constexpr char kBraveWalletP3AActiveWalletDict[] = - "brave.wallet.wallet_p3a_active_wallets"; inline constexpr char kBraveWalletCustomNetworks[] = "brave.wallet.custom_networks"; inline constexpr char kBraveWalletEip1559CustomChains[] = @@ -78,8 +71,6 @@ inline constexpr char kBraveWalletP3AOnboardingLastStep[] = "brave.wallet.p3a_last_onboarding_step"; inline constexpr char kBraveWalletKeyringEncryptionKeysMigrated[] = "brave.wallet.keyring_encryption_keys_migrated"; -inline constexpr char kBraveWalletLastTransactionSentTimeDict[] = - "brave.wallet.last_transaction_sent_time_dict"; inline constexpr char kBraveWalletNftDiscoveryEnabled[] = "brave.wallet.nft_discovery_enabled"; inline constexpr char kBraveWalletLastDiscoveredAssetsAt[] = @@ -143,10 +134,25 @@ inline constexpr char kERCPrefVersionDeprecated[] = "brave.wallet.pref_version"; inline constexpr char kERCOptedIntoCryptoWalletsDeprecated[] = "brave.wallet.opted_in"; +// Deprecated 12/2025 +inline constexpr char kBraveWalletPingReportedUnlockTimeDeprecated[] = + "brave.wallet.wallet_report_unlock_time_ping"; +// Deprecated 05/2026 +inline constexpr char kBraveWalletP3ANewUserBalanceReportedDeprecated[] = + "brave.wallet.p3a_new_user_balance_reported"; +// Deprecated 05/2026 +inline constexpr char kBraveWalletP3AActiveWalletDictDeprecated[] = + "brave.wallet.wallet_p3a_active_wallets"; +// Deprecated 05/2026 +inline constexpr char kBraveWalletLastTransactionSentTimeDictDeprecated[] = + "brave.wallet.last_transaction_sent_time_dict"; + // Pref registration and migration functions. void RegisterLocalStatePrefs(PrefRegistrySimple* registry); -void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry); +void MigrateObsoleteLocalStatePrefs(PrefService* local_state); + +void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); void RegisterProfilePrefsForMigration( user_prefs::PrefRegistrySyncable* registry); void ClearJsonRpcServiceProfilePrefs(PrefService* prefs); diff --git a/components/brave_wallet/common/brave_wallet.mojom b/components/brave_wallet/common/brave_wallet.mojom index 5f47c10a8e1..54cc4b58a79 100644 --- a/components/brave_wallet/common/brave_wallet.mojom +++ b/components/brave_wallet/common/brave_wallet.mojom @@ -938,11 +938,6 @@ enum KeyringId { kPolkadotImportTestnet = 17, }; -const string kP3ACountTestNetworksSwitch = "p3a-count-wallet-test-networks"; - -const string kP3ACountTestNetworksLoadTimeKey = - "braveWalletP3ACountTestNetworks"; - enum FilecoinAddressProtocol { SECP256K1 = 1, // Represents the address SECP256K1 protocol BLS = 3, // Represents the address BLS protocol @@ -3185,9 +3180,6 @@ interface BraveWalletP3A { // Called when a Wallet onboarding action is performed. ReportOnboardingAction(OnboardingAction onboarding_action); - // Called to report an active wallet count for P3A - RecordActiveWalletCount(int32 count, CoinType coin_type); - // Called to report displayed NFT count upon viewing the NFT gallery RecordNFTGalleryView(int32 nft_count); }; diff --git a/components/brave_wallet/common/common_utils.cc b/components/brave_wallet/common/common_utils.cc index 03d4a40b131..974f8ae7f6a 100644 --- a/components/brave_wallet/common/common_utils.cc +++ b/components/brave_wallet/common/common_utils.cc @@ -356,39 +356,6 @@ bool IsAccountBasedCoin(mojom::CoinType coin) { (coin == mojom::CoinType::FIL) || (coin == mojom::CoinType::DOT); } -mojom::CoinType GetCoinTypeFromTxDataUnion( - const mojom::TxDataUnion& tx_data_union) { - if (tx_data_union.is_eth_tx_data_1559() || tx_data_union.is_eth_tx_data()) { - return mojom::CoinType::ETH; - } - - if (tx_data_union.is_solana_tx_data()) { - return mojom::CoinType::SOL; - } - - if (tx_data_union.is_fil_tx_data()) { - return mojom::CoinType::FIL; - } - - if (tx_data_union.is_btc_tx_data()) { - return mojom::CoinType::BTC; - } - - if (tx_data_union.is_zec_tx_data()) { - return mojom::CoinType::ZEC; - } - - if (tx_data_union.is_cardano_tx_data()) { - return mojom::CoinType::ADA; - } - - if (tx_data_union.is_polkadot_tx_data()) { - return mojom::CoinType::DOT; - } - - NOTREACHED(); -} - GURL GetActiveEndpointUrl(const mojom::NetworkInfo& chain) { if (chain.active_rpc_endpoint_index >= 0 && static_cast(chain.active_rpc_endpoint_index) < diff --git a/components/brave_wallet/common/common_utils.h b/components/brave_wallet/common/common_utils.h index 1992cd5e213..8104ba58612 100644 --- a/components/brave_wallet/common/common_utils.h +++ b/components/brave_wallet/common/common_utils.h @@ -83,9 +83,6 @@ std::string GetNetworkForPolkadotAccount(const mojom::AccountIdPtr& account_id); mojom::CoinType GetCoinForKeyring(mojom::KeyringId keyring_id); bool IsAccountBasedCoin(mojom::CoinType coin); -mojom::CoinType GetCoinTypeFromTxDataUnion( - const mojom::TxDataUnion& tx_data_union); - GURL GetActiveEndpointUrl(const mojom::NetworkInfo& chain); std::vector GetEnabledCoins(); diff --git a/components/brave_wallet_ui/common/async/__mocks__/bridge.ts b/components/brave_wallet_ui/common/async/__mocks__/bridge.ts index 3244664ef60..7c6e4a8737b 100644 --- a/components/brave_wallet_ui/common/async/__mocks__/bridge.ts +++ b/components/brave_wallet_ui/common/async/__mocks__/bridge.ts @@ -688,10 +688,6 @@ export class MockedWalletApiProxy { reportOnboardingAction: (action) => { console.log(`reporting onboarding action: ${action}`) }, - recordActiveWalletCount(count, coinType) { - // Follow up issue to fix test via https://github.com/brave/brave-browser/issues/43583 - // console.log(`active wallet count: ${count} for ${coinType}`) - }, recordNFTGalleryView(nftCount) { console.log(`viewing nft gallery with ${nftCount} nfts`) }, diff --git a/components/brave_wallet_ui/common/slices/endpoints/token_balances.endpoints.ts b/components/brave_wallet_ui/common/slices/endpoints/token_balances.endpoints.ts index c583f0220d8..7aae96cace8 100644 --- a/components/brave_wallet_ui/common/slices/endpoints/token_balances.endpoints.ts +++ b/components/brave_wallet_ui/common/slices/endpoints/token_balances.endpoints.ts @@ -51,7 +51,6 @@ import { getIsRewardsNetwork } from '../../../utils/rewards_utils' import { blockchainTokenEntityAdaptorInitialState, // } from '../entities/blockchain-token.entity' -import { reportActiveWalletsToP3A } from '../../../utils/p3a_utils' type BalanceNetwork = Pick< BraveWallet.NetworkInfo, @@ -519,9 +518,6 @@ export const tokenBalancesEndpoints = ({ // update combined registry in local storage setPersistedPortfolioTokenBalances(mergedRegistry, arg.isSpamRegistry) - // report to P3A - reportActiveWalletsToP3A(arg.accountIds, mergedRegistry) - return { data: tokenBalancesRegistry, } diff --git a/components/brave_wallet_ui/utils/balance-utils.test.ts b/components/brave_wallet_ui/utils/balance-utils.test.ts index d20759eb83a..5e8964e7b66 100644 --- a/components/brave_wallet_ui/utils/balance-utils.test.ts +++ b/components/brave_wallet_ui/utils/balance-utils.test.ts @@ -3,26 +3,15 @@ // 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/. -import { BraveWallet } from '../constants/types' - import { createEmptyTokenBalancesRegistry, - getActiveWalletCount, getBalance, getPercentAmount, setBalance, } from './balance-utils' // mocks -import { - mockAccount, - mockBitcoinAccount, - mockBitcoinTestnetAccount, - mockEthAccount, - mockFilecoinAccount, - mockSolanaAccount, - mockZecAccount, -} from '../common/constants/mocks' +import { mockAccount } from '../common/constants/mocks' import { mockBasicAttentionToken, mockBinanceCoinErc20Token, @@ -165,269 +154,3 @@ describe('getPercentAmount', () => { }, ) }) - -const mockAccounts = [ - mockEthAccount, - mockSolanaAccount, - mockFilecoinAccount, - mockBitcoinAccount, - mockBitcoinTestnetAccount, - mockZecAccount, -] - -const createMockRegistry = (balance: string) => { - const tokenBalancesRegistry = createEmptyTokenBalancesRegistry() - - // Native ETH - setBalance({ - accountId: mockEthAccount.accountId, - chainId: BraveWallet.MAINNET_CHAIN_ID, - contractAddress: '', - balance, - tokenBalancesRegistry, - coinType: BraveWallet.CoinType.ETH, - tokenId: '', - isShielded: false, - }) - - // Native MATIC - setBalance({ - accountId: mockEthAccount.accountId, - chainId: BraveWallet.POLYGON_MAINNET_CHAIN_ID, - contractAddress: '', - balance, - tokenBalancesRegistry, - coinType: BraveWallet.CoinType.ETH, - tokenId: '', - isShielded: false, - }) - - // Native SOL - setBalance({ - accountId: mockSolanaAccount.accountId, - chainId: BraveWallet.SOLANA_MAINNET, - contractAddress: '', - balance, - tokenBalancesRegistry, - coinType: BraveWallet.CoinType.SOL, - tokenId: '', - isShielded: false, - }) - - // NATIVE FIL - setBalance({ - accountId: mockFilecoinAccount.accountId, - chainId: BraveWallet.FILECOIN_MAINNET, - contractAddress: '', - balance, - tokenBalancesRegistry, - coinType: BraveWallet.CoinType.FIL, - tokenId: '', - isShielded: false, - }) - - // NATIVE BTC - setBalance({ - accountId: mockBitcoinAccount.accountId, - chainId: BraveWallet.BITCOIN_MAINNET, - contractAddress: '', - balance, - tokenBalancesRegistry, - coinType: BraveWallet.CoinType.BTC, - tokenId: '', - isShielded: false, - }) - - // NATIVE TESTNET BTC - setBalance({ - accountId: mockBitcoinTestnetAccount.accountId, - chainId: BraveWallet.BITCOIN_TESTNET, - contractAddress: '', - balance, - tokenBalancesRegistry, - coinType: BraveWallet.CoinType.BTC, - tokenId: '', - isShielded: false, - }) - - // NATIVE ZEC - setBalance({ - accountId: mockZecAccount.accountId, - chainId: BraveWallet.Z_CASH_MAINNET, - contractAddress: '', - balance, - tokenBalancesRegistry, - coinType: BraveWallet.CoinType.ZEC, - tokenId: '', - isShielded: false, - }) - - return tokenBalancesRegistry -} - -const mockAccountIds = mockAccounts.map((account) => account.accountId) - -describe('getActiveWalletCount', () => { - it('should return nothing with empty input', () => { - const registry = createEmptyTokenBalancesRegistry() - expect(getActiveWalletCount([], registry, false)).toStrictEqual({}) - }) - - it('should return no active accounts when zero balance', () => { - const registry = createMockRegistry('0') - - expect( - getActiveWalletCount( - mockAccountIds, - registry, - false, // - ), - ).toStrictEqual({ - [BraveWallet.CoinType.BTC]: 0, - [BraveWallet.CoinType.ETH]: 0, - [BraveWallet.CoinType.FIL]: 0, - [BraveWallet.CoinType.ZEC]: 0, - [BraveWallet.CoinType.SOL]: 0, - }) - }) - - it('should skip testnets with balance by default', () => { - const tokenBalancesRegistry = createMockRegistry('0') - - // SEPOLIA ETH - setBalance({ - accountId: mockEthAccount.accountId, - chainId: BraveWallet.SEPOLIA_CHAIN_ID, - contractAddress: '', - balance: '1', - tokenBalancesRegistry, - coinType: BraveWallet.CoinType.ETH, - tokenId: '', - isShielded: false, - }) - - // TESTNET BTC - setBalance({ - accountId: mockBitcoinTestnetAccount.accountId, - chainId: BraveWallet.BITCOIN_TESTNET, - contractAddress: '', - balance: '1', - tokenBalancesRegistry, - coinType: BraveWallet.CoinType.BTC, - tokenId: '', - isShielded: false, - }) - - expect( - getActiveWalletCount(mockAccountIds, tokenBalancesRegistry, false), - ).toStrictEqual({ - [BraveWallet.CoinType.ETH]: 0, - [BraveWallet.CoinType.SOL]: 0, - [BraveWallet.CoinType.FIL]: 0, - [BraveWallet.CoinType.ZEC]: 0, - [BraveWallet.CoinType.BTC]: 0, - }) - }) - - it('should include testnets with flag', () => { - const tokenBalancesRegistry = createMockRegistry('0') - - // SEPOLIA ETH - setBalance({ - accountId: mockEthAccount.accountId, - chainId: BraveWallet.SEPOLIA_CHAIN_ID, - contractAddress: '', - balance: '1', - tokenBalancesRegistry, - coinType: BraveWallet.CoinType.ETH, - tokenId: '', - isShielded: false, - }) - - // TESTNET BTC - setBalance({ - accountId: mockBitcoinTestnetAccount.accountId, - chainId: BraveWallet.BITCOIN_TESTNET, - contractAddress: '', - balance: '1', - tokenBalancesRegistry, - coinType: BraveWallet.CoinType.BTC, - tokenId: '', - isShielded: false, - }) - - expect( - getActiveWalletCount(mockAccountIds, tokenBalancesRegistry, true), - ).toStrictEqual({ - [BraveWallet.CoinType.ETH]: 1, - [BraveWallet.CoinType.SOL]: 0, - [BraveWallet.CoinType.FIL]: 0, - [BraveWallet.CoinType.ZEC]: 0, - [BraveWallet.CoinType.BTC]: 1, - }) - }) - - it('should report active accounts', () => { - const registry = createMockRegistry('1') - - expect(getActiveWalletCount(mockAccountIds, registry, true)).toStrictEqual({ - [BraveWallet.CoinType.ETH]: 1, - [BraveWallet.CoinType.SOL]: 1, - [BraveWallet.CoinType.FIL]: 1, - [BraveWallet.CoinType.ZEC]: 1, - [BraveWallet.CoinType.BTC]: 2, // mainnet and testnet accounts - }) - }) - - it('should report many active accounts', () => { - const tokenBalancesRegistry = createMockRegistry('1') - - const mockEthAccountInfo2 = { ...mockEthAccount } - mockEthAccountInfo2.accountId.uniqueKey = 'mockEthAccountInfo2' - - // MOCK ETH ERC TOKEN - setBalance({ - accountId: mockEthAccountInfo2.accountId, - chainId: BraveWallet.MAINNET_CHAIN_ID, - contractAddress: '0x1234contract', - balance: '1', - tokenBalancesRegistry, - coinType: BraveWallet.CoinType.ETH, - tokenId: '', - isShielded: false, - }) - - const mockZecAccount2 = { ...mockZecAccount } - mockZecAccount2.accountId.uniqueKey = 'mockZecAccount2' - - // NATIVE ZEC - setBalance({ - accountId: mockZecAccount2.accountId, - chainId: BraveWallet.Z_CASH_MAINNET, - contractAddress: '', - balance: '1', - tokenBalancesRegistry, - coinType: BraveWallet.CoinType.ZEC, - tokenId: '', - isShielded: false, - }) - - expect( - getActiveWalletCount( - [ - ...mockAccountIds, - mockEthAccountInfo2.accountId, - mockZecAccount2.accountId, - ], - tokenBalancesRegistry, - true, - ), - ).toStrictEqual({ - [BraveWallet.CoinType.ETH]: 2, - [BraveWallet.CoinType.SOL]: 1, - [BraveWallet.CoinType.FIL]: 1, - [BraveWallet.CoinType.ZEC]: 2, - [BraveWallet.CoinType.BTC]: 2, - }) - }) -}) diff --git a/components/brave_wallet_ui/utils/balance-utils.ts b/components/brave_wallet_ui/utils/balance-utils.ts index b15c0be49b7..0934c62b620 100644 --- a/components/brave_wallet_ui/utils/balance-utils.ts +++ b/components/brave_wallet_ui/utils/balance-utils.ts @@ -5,7 +5,7 @@ // types import { TokenBalancesRegistry } from '../common/slices/entities/token-balance.entity' -import { BraveWallet, SupportedTestNetworks } from '../constants/types' +import { BraveWallet } from '../constants/types' // utils import Amount from './amount' @@ -181,52 +181,3 @@ export function createEmptyTokenBalancesRegistry(): TokenBalancesRegistry { accounts: {}, } } - -export const getActiveWalletCount = ( - accountIds: BraveWallet.AccountId[], - tokenBalancesRegistry: TokenBalancesRegistry, - countTestNetworks: boolean, -) => { - const activeWalletCount: Record = {} - - accountIds.map((accountId) => { - const accountBalances = - tokenBalancesRegistry.accounts[getAccountBalancesKey(accountId)] - if (!accountBalances) { - return - } - - const { coin } = accountId - - if (activeWalletCount[coin] === undefined) { - activeWalletCount[coin] = 0 - } - - let chainsWithBalance: string[] = [] - - for (const [chainId, chainBalances] of Object.entries( - accountBalances.chains, - )) { - for (const tokenBalance of Object.values(chainBalances.tokenBalances)) { - const amount = new Amount(tokenBalance) - if (amount && amount.gt('0')) { - chainsWithBalance = [...chainsWithBalance, chainId] - break - } - } - } - - const hasMainnetBalance = chainsWithBalance.some( - (chainId) => !SupportedTestNetworks.includes(chainId), - ) - const hasTestnetBalance = chainsWithBalance.some((chainId) => - SupportedTestNetworks.includes(chainId), - ) - - if (hasMainnetBalance || (countTestNetworks && hasTestnetBalance)) { - activeWalletCount[coin] += 1 - } - }) - - return activeWalletCount -} diff --git a/components/brave_wallet_ui/utils/p3a_utils.ts b/components/brave_wallet_ui/utils/p3a_utils.ts deleted file mode 100644 index bc0f4df1a1c..00000000000 --- a/components/brave_wallet_ui/utils/p3a_utils.ts +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2024 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/. - -// types -import type { - TokenBalancesRegistry, // -} from '../common/slices/entities/token-balance.entity' - -// constants -import { BraveWallet } from '../constants/types' - -// utils -import { loadTimeData } from '../../common/loadTimeData' -import { getActiveWalletCount } from './balance-utils' -import getAPIProxy from '../common/async/bridge' - -export async function reportActiveWalletsToP3A( - accountIds: BraveWallet.AccountId[], - tokenBalancesRegistry: TokenBalancesRegistry, -) { - const countTestNetworks = loadTimeData.getBoolean( - BraveWallet.P3A_COUNT_TEST_NETWORKS_LOAD_TIME_KEY, - ) - - const activeWalletCount = getActiveWalletCount( - accountIds, - tokenBalancesRegistry, - countTestNetworks, - ) - - const { braveWalletP3A } = getAPIProxy() - - for (const [coin, count] of Object.entries(activeWalletCount)) { - braveWalletP3A.recordActiveWalletCount(count, parseInt(coin)) - } -} diff --git a/components/p3a/metric_names.h b/components/p3a/metric_names.h index 4b3473c2706..3e10d2e192a 100644 --- a/components/p3a/metric_names.h +++ b/components/p3a/metric_names.h @@ -173,19 +173,9 @@ inline constexpr auto kCollectedTypicalHistograms = {"Brave.VerticalTabs.GroupTabs", MetricConfig{.ephemeral = true}}, {"Brave.VerticalTabs.OpenTabs", MetricConfig{.ephemeral = true}}, {"Brave.VerticalTabs.PinnedTabs", MetricConfig{.ephemeral = true}}, - {"Brave.Wallet.ActiveBtcAccounts", {}}, - {"Brave.Wallet.ActiveEthAccounts", {}}, - {"Brave.Wallet.ActiveSolAccounts", {}}, - {"Brave.Wallet.ActiveZecAccounts", {}}, - {"Brave.Wallet.ActiveAdaAccounts", {}}, - {"Brave.Wallet.BtcTransactionSent", {}}, - {"Brave.Wallet.EthTransactionSent", {}}, {"Brave.Wallet.NFTCount", MetricConfig{.ephemeral = true}}, {"Brave.Wallet.NewUserReturning", {}}, {"Brave.Wallet.OnboardingConversion.3", MetricConfig{.ephemeral = true}}, - {"Brave.Wallet.SolTransactionSent", {}}, - {"Brave.Wallet.ZecTransactionSent", {}}, - {"Brave.Wallet.AdaTransactionSent", {}}, {"Brave.Wallet.UsageWeekly", MetricConfig{.ephemeral = true}}, {"Brave.WebTorrent.UsageWeekly", MetricConfig{.ephemeral = true}}, }); diff --git a/ios/brave-ios/Sources/Brave/Frontend/Settings/Debug/BraveCoreDebugSwitchesView.swift b/ios/brave-ios/Sources/Brave/Frontend/Settings/Debug/BraveCoreDebugSwitchesView.swift index baa4e1d590b..808879ad107 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/Settings/Debug/BraveCoreDebugSwitchesView.swift +++ b/ios/brave-ios/Sources/Brave/Frontend/Settings/Debug/BraveCoreDebugSwitchesView.swift @@ -35,8 +35,6 @@ extension BraveCoreSwitchKey { return "Json Upload Server URL" case .enableFeatures: return "Enable Features" - case .p3aWalletCountTestNetworks: - return "Brave Wallet Count Test Networks" case .useDevGoUpdater: return "Use staging CRX components" case .servicesEnvironment: @@ -50,7 +48,6 @@ extension BraveCoreSwitchKey { switch self { case .p3aDoNotRandomizeUploadInterval, .p3aIgnoreServerErrors, - .p3aWalletCountTestNetworks, .useDevGoUpdater: return true default: @@ -59,9 +56,6 @@ extension BraveCoreSwitchKey { } static let enableFeatures: Self = .init(rawValue: "enable-features") - static let p3aWalletCountTestNetworks: Self = .init( - rawValue: BraveWallet.P3aCountTestNetworksSwitch - ) } private enum BraveServicesEnvironment: String, CaseIterable { @@ -419,7 +413,6 @@ struct BraveCoreDebugSwitchesView: View { } label: { SwitchContainer(.p3aExpressRotationIntervalSeconds) } - SwitchContainer(.p3aWalletCountTestNetworks) } .listRowBackground(Color(.secondaryBraveGroupedBackground)) } header: { diff --git a/ios/brave-ios/Sources/BraveWallet/Crypto/Stores/CryptoStore.swift b/ios/brave-ios/Sources/BraveWallet/Crypto/Stores/CryptoStore.swift index 9a6f5e72bec..b4a7b9f6795 100644 --- a/ios/brave-ios/Sources/BraveWallet/Crypto/Stores/CryptoStore.swift +++ b/ios/brave-ios/Sources/BraveWallet/Crypto/Stores/CryptoStore.swift @@ -252,7 +252,6 @@ public class CryptoStore: ObservableObject, WalletObserverStore { public func setupObservers() { guard !isObserving else { return } - self.userAssetManager.addUserAssetDataObserver(self) self.keyringServiceObserver = KeyringServiceObserver( keyringService: keyringService, _walletReset: { [weak self] in @@ -917,45 +916,6 @@ public class CryptoStore: ObservableObject, WalletObserverStore { } } } - - private func recordP3AActiveWallets() { - Task { @MainActor in - let shouldCountTestNetworks = Preferences.BraveCore.activeSwitches.value.contains( - BraveWallet.P3aCountTestNetworksSwitch - ) - let allAccounts = await keyringService.allAccounts().accounts - let supportedCoinTypes = WalletConstants.supportedCoinTypes() - let accountsForCoin = Dictionary(grouping: allAccounts, by: \.coin) - for coin in supportedCoinTypes { - var activeAccountsForCoin = Int32(0) - let accounts = accountsForCoin[coin] ?? [] - for account in accounts { - if let balancesForAccount = userAssetManager.getAssetBalances( - for: nil, - account: account.id - ) { - let balancesScopedForP3A = balancesForAccount.optionallyFilter( - shouldFilter: !shouldCountTestNetworks, - isIncluded: { assetBalance in - !WalletConstants.supportedTestNetworkChainIds.contains(where: { - $0 == assetBalance.chainId - }) - } - ) - if balancesScopedForP3A.contains(where: { assetBalance in - guard let balance = Double(assetBalance.balance) else { return false } - return balance > 0 // account has some balance - }) { - activeAccountsForCoin += 1 - // move to next account - continue - } - } - } - walletP3A.recordActiveWalletCount(activeAccountsForCoin, coinType: coin) - } - } - } } extension CryptoStore: PreferencesObserver { @@ -974,12 +934,3 @@ extension CryptoStore: PreferencesObserver { } } } - -extension CryptoStore: WalletUserAssetDataObserver { - public func cachedBalanceRefreshed() { - recordP3AActiveWallets() - } - - public func userAssetUpdated() { - } -} diff --git a/ios/browser/shared/prefs/browser_prefs_impl.mm b/ios/browser/shared/prefs/browser_prefs_impl.mm index 7fbee2762e5..0a1aab76b59 100644 --- a/ios/browser/shared/prefs/browser_prefs_impl.mm +++ b/ios/browser/shared/prefs/browser_prefs_impl.mm @@ -144,6 +144,9 @@ void MigrateObsoleteLocalStatePrefs(PrefService* prefs) { ntp_background_images::NTPBackgroundImagesService:: MigrateObsoleteLocalStatePrefs(prefs); brave_stats::MigrateObsoleteLocalStatePrefs(prefs); +#if BUILDFLAG(ENABLE_BRAVE_WALLET) + brave_wallet::MigrateObsoleteLocalStatePrefs(prefs); +#endif } } // namespace brave diff --git a/ios/browser/ui/webui/brave_wallet/wallet_page_ui.mm b/ios/browser/ui/webui/brave_wallet/wallet_page_ui.mm index 28e8a8b44e1..eca19f8facd 100644 --- a/ios/browser/ui/webui/brave_wallet/wallet_page_ui.mm +++ b/ios/browser/ui/webui/brave_wallet/wallet_page_ui.mm @@ -58,9 +58,6 @@ WalletPageUI::WalletPageUI(web::WebUIIOS* web_ui, const GURL& url) source->AddString("braveWalletNftBridgeUrl", kUntrustedNftURL); source->AddString("braveWalletLineChartBridgeUrl", kUntrustedLineChartURL); source->AddString("braveWalletMarketUiBridgeUrl", kUntrustedMarketURL); - source->AddBoolean(brave_wallet::mojom::kP3ACountTestNetworksLoadTimeKey, - base::CommandLine::ForCurrentProcess()->HasSwitch( - brave_wallet::mojom::kP3ACountTestNetworksSwitch)); source->OverrideContentSecurityPolicy( network::mojom::CSPDirectiveName::FrameSrc,