Skip to content

Commit 33b18cc

Browse files
committed
perf(accounts-controller): prevent unnecessary update with SnapController:stateChange
1 parent fd0c24f commit 33b18cc

File tree

2 files changed

+22
-14
lines changed

2 files changed

+22
-14
lines changed

packages/accounts-controller/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1919
- **BREAKING:** Bump `@metamask/providers` peer dependency from ^18.1.0 to ^21.0.0 ([#5639](https://github.com/MetaMask/core/pull/5639))
2020
- Bump `@metamask/snaps-sdk` from ^6.17.1 to ^6.22.0 ([#5639](https://github.com/MetaMask/core/pull/5639))
2121
- Bump `@metamask/snaps-utils` from ^8.10.0 to ^9.2.0 ([#5639](https://github.com/MetaMask/core/pull/5639))
22+
- Prevent unnecasary state updates when updating `InternalAccount.metadata.snap` ([#5735](https://github.com/MetaMask/core/pull/5735))
2223

2324
## [27.0.0]
2425

packages/accounts-controller/src/AccountsController.ts

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -988,24 +988,31 @@ export class AccountsController extends BaseController<
988988
#handleOnSnapStateChange(snapState: SnapControllerState) {
989989
// only check if snaps changed in status
990990
const { snaps } = snapState;
991-
const accounts = this.listMultichainAccounts().filter(
992-
(account) => account.metadata.snap,
993-
);
994991

995-
this.update((currentState) => {
996-
accounts.forEach((account) => {
997-
const currentAccount =
998-
currentState.internalAccounts.accounts[account.id];
999-
if (currentAccount.metadata.snap) {
1000-
const snapId = currentAccount.metadata.snap.id;
1001-
const storedSnap: Snap = snaps[snapId as SnapId];
1002-
if (storedSnap) {
1003-
currentAccount.metadata.snap.enabled =
1004-
storedSnap.enabled && !storedSnap.blocked;
992+
const accounts: { id: string; enabled: boolean }[] = [];
993+
for (const account of this.listMultichainAccounts()) {
994+
if (account.metadata.snap) {
995+
const snap: Snap = snaps[account.metadata.snap.id as SnapId];
996+
const enabled = snap.enabled && !snap.blocked;
997+
const metadata = account.metadata.snap;
998+
999+
if (metadata.enabled !== enabled) {
1000+
accounts.push({ id: account.id, enabled });
1001+
}
1002+
}
1003+
}
1004+
1005+
if (accounts.length > 0) {
1006+
this.update((state) => {
1007+
for (const { id, enabled } of accounts) {
1008+
const account = state.internalAccounts.accounts[id];
1009+
1010+
if (account.metadata.snap) {
1011+
account.metadata.snap.enabled = enabled;
10051012
}
10061013
}
10071014
});
1008-
});
1015+
}
10091016
}
10101017

10111018
/**

0 commit comments

Comments
 (0)