Skip to content

Commit 8cb8a9e

Browse files
committed
fix: also re-sync account with the service during init
1 parent c222de5 commit 8cb8a9e

File tree

4 files changed

+59
-5
lines changed

4 files changed

+59
-5
lines changed

packages/account-tree-controller/src/AccountTreeController.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import {
4646
getAccountTreeControllerMessenger,
4747
getRootMessenger,
4848
} from '../tests/mockMessenger';
49+
import { MultichainAccountService } from '@metamask/multichain-account-service';
4950

5051
// Local mock of EMPTY_ACCOUNT to avoid circular dependency
5152
const EMPTY_ACCOUNT_MOCK: InternalAccount = {
@@ -332,6 +333,9 @@ function setup({
332333
getAccount: jest.fn(),
333334
getSelectedMultichainAccount: jest.fn(),
334335
},
336+
MultichainAccountService: {
337+
getMultichainAccountWallets: jest.fn(),
338+
},
335339
UserStorageController: {
336340
getState: jest.fn(),
337341
performGetStorage: jest.fn(),
@@ -428,6 +432,17 @@ function setup({
428432
);
429433
}
430434

435+
// Using an empty list of wallets will make sure that no multichain accounts got
436+
// removed automatically removed from the tree upon calling `init`. That's what
437+
// we want for almost all tests.
438+
mocks.MultichainAccountService.getMultichainAccountWallets.mockReturnValue(
439+
[],
440+
);
441+
messenger.registerActionHandler(
442+
'MultichainAccountService:getMultichainAccountWallets',
443+
mocks.MultichainAccountService.getMultichainAccountWallets,
444+
);
445+
431446
const accountTreeControllerMessenger =
432447
getAccountTreeControllerMessenger(messenger);
433448
const controller = new AccountTreeController({

packages/account-tree-controller/src/AccountTreeController.ts

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,17 @@ export class AccountTreeController extends BaseController<
250250
},
251251
);
252252

253+
this.messenger.subscribe(
254+
'MultichainAccountService:multichainAccountGroupCreated',
255+
(group) => {
256+
this.#handleMultichainAccountWalletGroupCreatedOrUpdated(group);
257+
},
258+
);
259+
253260
this.messenger.subscribe(
254261
'MultichainAccountService:multichainAccountGroupUpdated',
255262
(group) => {
256-
this.#handleMultichainAccountWalletGroupUpdated(group);
263+
this.#handleMultichainAccountWalletGroupCreatedOrUpdated(group);
257264
},
258265
);
259266

@@ -307,6 +314,17 @@ export class AccountTreeController extends BaseController<
307314
this.#insert(wallets, account);
308315
}
309316

317+
// Since we're building the tree out of of the account list, we don't know if those
318+
// accounts got disabled at the service level. To make sure both states are "in-sync"
319+
// we check each multichain account groups and remove extra accounts if there's any!
320+
for (const wallet of this.messenger.call(
321+
'MultichainAccountService:getMultichainAccountWallets',
322+
)) {
323+
for (const group of wallet.getMultichainAccountGroups()) {
324+
this.#resyncAccountsFromMultichainAccountGroups(group);
325+
}
326+
}
327+
310328
// Once we have the account tree, we can apply persisted metadata (names + UI states).
311329
let previousSelectedAccountGroupStillExists = false;
312330
this.update((state) => {
@@ -1252,11 +1270,15 @@ export class AccountTreeController extends BaseController<
12521270
}
12531271

12541272
/**
1255-
* Handles multichain account group updates.
1273+
* Check if an account group object is in-sync with its multichain
1274+
* account group counterpart.
12561275
*
1257-
* @param group - Multichain account group that got updated.
1276+
* If not, then the extra-accounts fromt he account group object
1277+
* will be removed from the tree.
1278+
*
1279+
* @param group - Multichain account group that got created or updated.
12581280
*/
1259-
#handleMultichainAccountWalletGroupUpdated(
1281+
#resyncAccountsFromMultichainAccountGroups(
12601282
group: MultichainAccountGroup<Bip44Account<KeyringAccount>>,
12611283
): void {
12621284
const multichainGroupAccounts = new Set(
@@ -1281,6 +1303,17 @@ export class AccountTreeController extends BaseController<
12811303
this.#removeAccounts(treeGroupAccountsToRemove);
12821304
}
12831305

1306+
/**
1307+
* Handles multichain account group updates.
1308+
*
1309+
* @param group - Multichain account group that got updated.
1310+
*/
1311+
#handleMultichainAccountWalletGroupCreatedOrUpdated(
1312+
group: MultichainAccountGroup<Bip44Account<KeyringAccount>>,
1313+
): void {
1314+
this.#resyncAccountsFromMultichainAccountGroups(group);
1315+
}
1316+
12841317
/**
12851318
* Gets account group object.
12861319
*

packages/account-tree-controller/src/types.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ import type {
4040
AccountTreeWalletPersistedMetadata,
4141
} from './wallet';
4242
import type {
43+
MultichainAccountServiceGetMultichainAccountWalletsAction,
44+
MultichainAccountServiceMultichainAccountGroupCreatedEvent,
4345
MultichainAccountServiceMultichainAccountGroupUpdatedEvent,
4446
MultichainAccountServiceWalletStatusChangeEvent,
4547
} from '../../multichain-account-service/src/types';
@@ -130,7 +132,8 @@ export type AllowedActions =
130132
| UserStorageController.UserStorageControllerPerformSetStorage
131133
| UserStorageController.UserStorageControllerPerformBatchSetStorage
132134
| AuthenticationController.AuthenticationControllerGetSessionProfile
133-
| MultichainAccountServiceCreateMultichainAccountGroupAction;
135+
| MultichainAccountServiceCreateMultichainAccountGroupAction
136+
| MultichainAccountServiceGetMultichainAccountWalletsAction;
134137

135138
export type AccountTreeControllerActions =
136139
| AccountTreeControllerGetStateAction
@@ -171,6 +174,7 @@ export type AllowedEvents =
171174
| AccountsControllerSelectedAccountChangeEvent
172175
| UserStorageController.UserStorageControllerStateChangeEvent
173176
| MultichainAccountServiceWalletStatusChangeEvent
177+
| MultichainAccountServiceMultichainAccountGroupCreatedEvent
174178
| MultichainAccountServiceMultichainAccountGroupUpdatedEvent;
175179

176180
export type AccountTreeControllerEvents =

packages/account-tree-controller/tests/mockMessenger.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export function getAccountTreeControllerMessenger(
5050
'AccountsController:selectedAccountChange',
5151
'UserStorageController:stateChange',
5252
'MultichainAccountService:walletStatusChange',
53+
'MultichainAccountService:multichainAccountGroupCreated',
5354
'MultichainAccountService:multichainAccountGroupUpdated',
5455
],
5556
actions: [
@@ -64,6 +65,7 @@ export function getAccountTreeControllerMessenger(
6465
'UserStorageController:performBatchSetStorage',
6566
'AuthenticationController:getSessionProfile',
6667
'MultichainAccountService:createMultichainAccountGroup',
68+
'MultichainAccountService:getMultichainAccountWallets',
6769
'KeyringController:getState',
6870
'SnapController:get',
6971
],

0 commit comments

Comments
 (0)