From 2e3ab870109dabbd8a02e476c2ba6c0a101a5bb4 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 26 Jun 2025 13:34:32 +0100 Subject: [PATCH 01/10] chore: passing the event --- app/scripts/metamask-controller.js | 18 ++++++++- ui/pages/multi-srp/import-srp/import-srp.tsx | 38 +++++++++++++----- ui/store/actions.test.js | 23 +++++++++++ ui/store/actions.ts | 42 +++++++++++++------- 4 files changed, 95 insertions(+), 26 deletions(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 7520917f8a7..d121ec2f9e0 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -4672,9 +4672,12 @@ export default class MetamaskController extends EventEmitter { this.accountsController.getAccountByAddress(newAccountAddress); this.accountsController.setSelectedAccount(account.id); - await this._addAccountsWithBalance(id); + const discoveredAccounts = await this._addAccountsWithBalance(id); - return newAccountAddress; + return { + newAccountAddress, + discoveredAccounts, + }; } finally { releaseLock(); } @@ -4855,6 +4858,11 @@ export default class MetamaskController extends EventEmitter { ); } + let discoveredAccounts = { + bitcoin: 0, + solana: 0, + }; + ///: BEGIN:ONLY_INCLUDE_IF(bitcoin) const btcClient = await this._getMultichainWalletSnapClient( BITCOIN_WALLET_SNAP_ID, @@ -4865,6 +4873,8 @@ export default class MetamaskController extends EventEmitter { btcScope, ); + discoveredAccounts.bitcoin = btcAccounts.length; + // If none accounts got discovered, we still create the first (default) one. if (btcAccounts.length === 0) { await this._addSnapAccount(entropySource, btcClient, { @@ -4884,6 +4894,8 @@ export default class MetamaskController extends EventEmitter { solScope, ); + discoveredAccounts.solana = solanaAccounts.length; + // If none accounts got discovered, we still create the first (default) one. if (solanaAccounts.length === 0) { await this._addSnapAccount(entropySource, solanaClient, { @@ -4891,6 +4903,8 @@ export default class MetamaskController extends EventEmitter { }); } ///: END:ONLY_INCLUDE_IF + + return discoveredAccounts; } catch (e) { log.warn(`Failed to add accounts with balance. Error: ${e}`); } finally { diff --git a/ui/pages/multi-srp/import-srp/import-srp.tsx b/ui/pages/multi-srp/import-srp/import-srp.tsx index a19edd469c7..a0543369345 100644 --- a/ui/pages/multi-srp/import-srp/import-srp.tsx +++ b/ui/pages/multi-srp/import-srp/import-srp.tsx @@ -83,9 +83,19 @@ export const ImportSrp = () => { async function importWallet() { const joinedSrp = secretRecoveryPhrase.join(' '); if (joinedSrp) { - await dispatch(actions.importMnemonicToVault(joinedSrp)); + const result = (await dispatch( + actions.importMnemonicToVault(joinedSrp), + )) as unknown as { + newAccountAddress: string; + discoveredAccounts: { bitcoin: number; solana: number }; + }; + + const { discoveredAccounts } = result; + // Clear the secret recovery phrase after importing setSecretRecoveryPhrase(Array(defaultNumberOfWords).fill('')); + + return { discoveredAccounts }; } } @@ -416,16 +426,26 @@ export const ImportSrp = () => { try { setLoading(true); await dispatch(actions.lockAccountSyncing()); - await importWallet(); + const result = await importWallet(); + history.push(DEFAULT_ROUTE); dispatch(setShowNewSrpAddedToast(true)); - trackEvent({ - event: - MetaMetricsEventName.ImportSecretRecoveryPhraseCompleted, - properties: { - hd_entropy_index: newHdEntropyIndex, - }, - }); + + // If the SRP was imported successfully, we can track the number of accounts discovered + if (result) { + const { discoveredAccounts } = result; + trackEvent({ + event: + MetaMetricsEventName.ImportSecretRecoveryPhraseCompleted, + properties: { + hd_entropy_index: newHdEntropyIndex, + number_of_solana_accounts_discovered: + discoveredAccounts?.solana, + number_of_bitcoin_accounts_discovered: + discoveredAccounts?.bitcoin, + }, + }); + } } catch (e) { setSrpError( e instanceof Error diff --git a/ui/store/actions.test.js b/ui/store/actions.test.js index 8a1899f0f7b..ea671209018 100644 --- a/ui/store/actions.test.js +++ b/ui/store/actions.test.js @@ -3052,6 +3052,29 @@ describe('Actions', () => { true, ); }); + + it('returns discovered accounts from background', async () => { + const store = mockStore(); + const mockResult = { + newAccountAddress: '9fE6zKgca6K2EEa3yjbcq7zGMusUNqSQeWQNL2YDZ2Yi', + discoveredAccounts: { bitcoin: 2, solana: 1 }, + }; + + const importMnemonicToVaultStub = sinon + .stub() + .callsFake((_, cb) => cb(null, mockResult)); + + background.getApi.returns({ + importMnemonicToVault: importMnemonicToVaultStub, + }); + setBackgroundConnection(background.getApi()); + + const result = await store.dispatch( + actions.importMnemonicToVault('mnemonic'), + ); + + expect(result).toEqual(mockResult); + }); }); describe('getTokenStandardAndDetailsByChain', () => { diff --git a/ui/store/actions.ts b/ui/store/actions.ts index c3aa878c62f..6264cbefde4 100644 --- a/ui/store/actions.ts +++ b/ui/store/actions.ts @@ -251,27 +251,39 @@ export function createNewVaultAndRestore( }; } -export function importMnemonicToVault( - mnemonic: string, -): ThunkAction { - // TODO: Fix in https://github.com/MetaMask/metamask-extension/issues/31879 - // eslint-disable-next-line @typescript-eslint/no-misused-promises - return (dispatch: MetaMaskReduxDispatch) => { +export function importMnemonicToVault(mnemonic: string): ThunkAction< + Promise<{ + newAccountAddress: string; + discoveredAccounts: { bitcoin: number; solana: number }; + }>, + MetaMaskReduxState, + unknown, + AnyAction +> { + return async (dispatch: MetaMaskReduxDispatch) => { dispatch(showLoadingIndication()); log.debug(`background.importMnemonicToVault`); - return new Promise((resolve, reject) => { - callBackgroundMethod('importMnemonicToVault', [mnemonic], (err) => { - if (err) { - reject(err); - return; - } - resolve(); - }); + return new Promise<{ + newAccountAddress: string; + discoveredAccounts: { bitcoin: number; solana: number }; + }>((resolve, reject) => { + callBackgroundMethod( + 'importMnemonicToVault', + [mnemonic], + (err, result) => { + if (err) { + reject(err); + return; + } + resolve(result); + }, + ); }) - .then(async () => { + .then(async (result) => { dispatch(hideLoadingIndication()); dispatch(setShowNewSrpAddedToast(true)); + return result; }) .catch((err) => { dispatch(displayWarning(err)); From b9e50edda0dda43fe5e3804cc8b7953c3fa7f2f5 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 26 Jun 2025 14:05:44 +0100 Subject: [PATCH 02/10] chore: lint fix --- ui/store/actions.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/store/actions.test.js b/ui/store/actions.test.js index ea671209018..eaebb872bef 100644 --- a/ui/store/actions.test.js +++ b/ui/store/actions.test.js @@ -3073,7 +3073,7 @@ describe('Actions', () => { actions.importMnemonicToVault('mnemonic'), ); - expect(result).toEqual(mockResult); + expect(result).toStrictEqual(mockResult); }); }); From 5442ddcca77c114d761aef5c7a212e129df4e688 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 26 Jun 2025 14:09:54 +0100 Subject: [PATCH 03/10] chore: lint consistent return rule --- app/scripts/metamask-controller.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index d121ec2f9e0..fcd47500921 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -4907,6 +4907,10 @@ export default class MetamaskController extends EventEmitter { return discoveredAccounts; } catch (e) { log.warn(`Failed to add accounts with balance. Error: ${e}`); + return { + bitcoin: 0, + solana: 0, + }; } finally { await this.userStorageController.setHasAccountSyncingSyncedAtLeastOnce( true, From b8d444ecdba5812796cc3c50173b5adfb76ca392 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 26 Jun 2025 14:28:57 +0100 Subject: [PATCH 04/10] chore: lint --- ui/pages/multi-srp/import-srp/import-srp.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/pages/multi-srp/import-srp/import-srp.tsx b/ui/pages/multi-srp/import-srp/import-srp.tsx index a0543369345..dbffb4bd891 100644 --- a/ui/pages/multi-srp/import-srp/import-srp.tsx +++ b/ui/pages/multi-srp/import-srp/import-srp.tsx @@ -97,6 +97,8 @@ export const ImportSrp = () => { return { discoveredAccounts }; } + + return null; } const isValidSrp = useMemo(() => { From ffc642a88ef6a2f97fb9fe827fcb9ed00d5f50b0 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 26 Jun 2025 14:45:00 +0100 Subject: [PATCH 05/10] chore: clean up --- app/scripts/metamask-controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index fcd47500921..d5c645335ff 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -4858,7 +4858,7 @@ export default class MetamaskController extends EventEmitter { ); } - let discoveredAccounts = { + const discoveredAccounts = { bitcoin: 0, solana: 0, }; From 7428205cd2743f0ada94e34cd953229337c4b990 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Mon, 30 Jun 2025 11:25:53 +0100 Subject: [PATCH 06/10] chore: test update --- ui/store/actions.test.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ui/store/actions.test.js b/ui/store/actions.test.js index 3bb6c93baee..85a931c1cf7 100644 --- a/ui/store/actions.test.js +++ b/ui/store/actions.test.js @@ -2922,9 +2922,7 @@ describe('Actions', () => { discoveredAccounts: { bitcoin: 2, solana: 1 }, }; - const importMnemonicToVaultStub = sinon - .stub() - .callsFake((_, cb) => cb(null, mockResult)); + const importMnemonicToVaultStub = sinon.stub().resolves(mockResult); background.getApi.returns({ importMnemonicToVault: importMnemonicToVaultStub, From c59e153174123993eda4b1a2d7c5ad64a167c02e Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Wed, 9 Jul 2025 16:38:01 +0100 Subject: [PATCH 07/10] chore: lint --- app/scripts/metamask-controller.js | 16 ++++++++-------- ui/pages/multi-srp/import-srp/import-srp.tsx | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index fce5183b981..4410c0f9ab8 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -5311,16 +5311,16 @@ export default class MetamaskController extends EventEmitter { solScope, ); - discoveredAccounts.solana = solanaAccounts.length; + discoveredAccounts.solana = solanaAccounts.length; - // If none accounts got discovered, we still create the first (default) one. - if (solanaAccounts.length === 0) { - await this._addSnapAccount(entropySource, solanaClient, { - scope: solScope, - }); + // If none accounts got discovered, we still create the first (default) one. + if (solanaAccounts.length === 0) { + await this._addSnapAccount(entropySource, solanaClient, { + scope: solScope, + }); + } + ///: END:ONLY_INCLUDE_IF } - ///: END:ONLY_INCLUDE_IF - return discoveredAccounts; } catch (e) { log.warn(`Failed to add accounts with balance. Error: ${e}`); diff --git a/ui/pages/multi-srp/import-srp/import-srp.tsx b/ui/pages/multi-srp/import-srp/import-srp.tsx index 60ab536b2e6..ccbff293cb1 100644 --- a/ui/pages/multi-srp/import-srp/import-srp.tsx +++ b/ui/pages/multi-srp/import-srp/import-srp.tsx @@ -111,7 +111,7 @@ export const ImportSrp = () => { // Clear the secret recovery phrase after importing setSecretRecoveryPhrase(Array(defaultNumberOfWords).fill('')); - + // Track the event with the discovered accounts trackEvent({ event: From e01a45cce9a34b72baf84df2693a9e71522e46db Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 10 Jul 2025 10:20:11 +0100 Subject: [PATCH 08/10] chore: lint --- app/scripts/metamask-controller.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 4410c0f9ab8..31023ce7732 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -5023,7 +5023,10 @@ export default class MetamaskController extends EventEmitter { this.accountsController.setSelectedAccount(account.id); } - const discoveredAccounts = await this._addAccountsWithBalance(id, shouldImportSolanaAccount); + const discoveredAccounts = await this._addAccountsWithBalance( + id, + shouldImportSolanaAccount, + ); return { newAccountAddress, From c1827d814a94b416f7edfcb5f3c45f933d499590 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 10 Jul 2025 11:27:46 +0100 Subject: [PATCH 09/10] chore: eslint/naming-convention --- ui/pages/multi-srp/import-srp/import-srp.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ui/pages/multi-srp/import-srp/import-srp.tsx b/ui/pages/multi-srp/import-srp/import-srp.tsx index ccbff293cb1..dc2365dcecd 100644 --- a/ui/pages/multi-srp/import-srp/import-srp.tsx +++ b/ui/pages/multi-srp/import-srp/import-srp.tsx @@ -113,15 +113,16 @@ export const ImportSrp = () => { setSecretRecoveryPhrase(Array(defaultNumberOfWords).fill('')); // Track the event with the discovered accounts + // TODO: Fix in https://github.com/MetaMask/metamask-extension/issues/31860 trackEvent({ - event: - MetaMetricsEventName.ImportSecretRecoveryPhraseCompleted, + event: MetaMetricsEventName.ImportSecretRecoveryPhraseCompleted, properties: { + // eslint-disable-next-line @typescript-eslint/naming-convention hd_entropy_index: newHdEntropyIndex, - number_of_solana_accounts_discovered: - discoveredAccounts?.solana, - number_of_bitcoin_accounts_discovered: - discoveredAccounts?.bitcoin, + // eslint-disable-next-line @typescript-eslint/naming-convention + number_of_solana_accounts_discovered: discoveredAccounts?.solana, + // eslint-disable-next-line @typescript-eslint/naming-convention + number_of_bitcoin_accounts_discovered: discoveredAccounts?.bitcoin, }, }); } From 06b72fa4c66056a3ef85b6c43137854555358d52 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Thu, 10 Jul 2025 13:59:46 +0100 Subject: [PATCH 10/10] chore: adjusts code fence --- app/scripts/metamask-controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 31023ce7732..df663b31ea4 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -5322,8 +5322,8 @@ export default class MetamaskController extends EventEmitter { scope: solScope, }); } - ///: END:ONLY_INCLUDE_IF } + ///: END:ONLY_INCLUDE_IF return discoveredAccounts; } catch (e) { log.warn(`Failed to add accounts with balance. Error: ${e}`);