Skip to content

Conversation

@montelaidev
Copy link
Contributor

@montelaidev montelaidev commented Oct 22, 2025

Explanation

This PR adds a migration mechanism for pinned and hidden state from State 0 into the AccountTreeController.

References

Fixes: https://consensyssoftware.atlassian.net/browse/MUL-1174?atlOrigin=eyJpIjoiYTEwNTBkNDBmYjg4NDAzNzkzMDdjMWVlMDIxMWY4YjQiLCJwIjoiaiJ9

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed, highlighting breaking changes as necessary
  • I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes

Note

Adds optional callbacks to migrate per-account hidden/pinned into group metadata during init, persists defaults when absent, and updates tests and changelog.

  • Account Tree Controller
    • Migration callbacks: Add optional config.accountOrderCallbacks with isHiddenAccount and isPinnedAccount to derive group hidden/pinned when no persisted metadata exists.
    • Metadata persistence: On init, default hidden/pinned are persisted to accountGroupsMetadata with lastUpdatedAt: 0; persisted values take precedence over callbacks.
    • Bug fix: Read persisted group metadata by groupId (not group.id) when applying names/states.
  • Tests
    • Expand expectations to include pinned/hidden entries in accountGroupsMetadata and group metadata.
    • New tests covering callback presence/absence, precedence vs persisted data, and default behaviors.
  • Config/Docs
    • Update types.ts to include accountOrderCallbacks in AccountTreeControllerConfig.
    • Changelog entry documenting the new optional callbacks.
    • Jest coverage threshold for branches adjusted to 98.34.

Written by Cursor Bugbot for commit aa4bb59. This will update automatically on new commits. Configure here.

@montelaidev
Copy link
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "1.5.0-preview-887b5d5c",
  "@metamask-previews/accounts-controller": "33.1.1-preview-887b5d5c",
  "@metamask-previews/address-book-controller": "6.2.0-preview-887b5d5c",
  "@metamask-previews/announcement-controller": "7.1.0-preview-887b5d5c",
  "@metamask-previews/app-metadata-controller": "1.1.0-preview-887b5d5c",
  "@metamask-previews/approval-controller": "7.2.0-preview-887b5d5c",
  "@metamask-previews/assets-controllers": "82.0.0-preview-887b5d5c",
  "@metamask-previews/base-controller": "8.4.1-preview-887b5d5c",
  "@metamask-previews/bridge-controller": "54.0.0-preview-887b5d5c",
  "@metamask-previews/bridge-status-controller": "54.0.0-preview-887b5d5c",
  "@metamask-previews/build-utils": "3.0.4-preview-887b5d5c",
  "@metamask-previews/chain-agnostic-permission": "1.2.0-preview-887b5d5c",
  "@metamask-previews/composable-controller": "11.1.0-preview-887b5d5c",
  "@metamask-previews/controller-utils": "11.14.1-preview-887b5d5c",
  "@metamask-previews/core-backend": "2.1.0-preview-887b5d5c",
  "@metamask-previews/delegation-controller": "0.8.0-preview-887b5d5c",
  "@metamask-previews/earn-controller": "8.0.1-preview-887b5d5c",
  "@metamask-previews/eip-5792-middleware": "1.2.3-preview-887b5d5c",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.0.0-preview-887b5d5c",
  "@metamask-previews/eip1193-permission-middleware": "1.0.1-preview-887b5d5c",
  "@metamask-previews/ens-controller": "17.1.0-preview-887b5d5c",
  "@metamask-previews/error-reporting-service": "2.2.1-preview-887b5d5c",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-887b5d5c",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-887b5d5c",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-887b5d5c",
  "@metamask-previews/foundryup": "1.0.1-preview-887b5d5c",
  "@metamask-previews/gas-fee-controller": "24.1.0-preview-887b5d5c",
  "@metamask-previews/gator-permissions-controller": "0.2.1-preview-887b5d5c",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-887b5d5c",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-887b5d5c",
  "@metamask-previews/keyring-controller": "23.1.1-preview-887b5d5c",
  "@metamask-previews/logging-controller": "6.1.0-preview-887b5d5c",
  "@metamask-previews/message-manager": "13.0.1-preview-887b5d5c",
  "@metamask-previews/messenger": "0.3.0-preview-887b5d5c",
  "@metamask-previews/multichain-account-service": "1.6.1-preview-887b5d5c",
  "@metamask-previews/multichain-api-middleware": "1.2.1-preview-887b5d5c",
  "@metamask-previews/multichain-network-controller": "1.0.1-preview-887b5d5c",
  "@metamask-previews/multichain-transactions-controller": "5.1.0-preview-887b5d5c",
  "@metamask-previews/name-controller": "8.1.0-preview-887b5d5c",
  "@metamask-previews/network-controller": "24.3.0-preview-887b5d5c",
  "@metamask-previews/network-enablement-controller": "2.1.1-preview-887b5d5c",
  "@metamask-previews/notification-services-controller": "18.3.0-preview-887b5d5c",
  "@metamask-previews/permission-controller": "11.1.0-preview-887b5d5c",
  "@metamask-previews/permission-log-controller": "4.1.0-preview-887b5d5c",
  "@metamask-previews/phishing-controller": "14.1.2-preview-887b5d5c",
  "@metamask-previews/polling-controller": "14.0.1-preview-887b5d5c",
  "@metamask-previews/preferences-controller": "20.0.2-preview-887b5d5c",
  "@metamask-previews/profile-sync-controller": "25.1.1-preview-887b5d5c",
  "@metamask-previews/rate-limit-controller": "6.1.0-preview-887b5d5c",
  "@metamask-previews/remote-feature-flag-controller": "1.9.0-preview-887b5d5c",
  "@metamask-previews/sample-controllers": "2.0.1-preview-887b5d5c",
  "@metamask-previews/seedless-onboarding-controller": "4.1.0-preview-887b5d5c",
  "@metamask-previews/selected-network-controller": "24.0.1-preview-887b5d5c",
  "@metamask-previews/shield-controller": "0.3.2-preview-887b5d5c",
  "@metamask-previews/signature-controller": "34.0.1-preview-887b5d5c",
  "@metamask-previews/subscription-controller": "2.0.0-preview-887b5d5c",
  "@metamask-previews/token-search-discovery-controller": "3.5.0-preview-887b5d5c",
  "@metamask-previews/transaction-controller": "60.9.0-preview-887b5d5c",
  "@metamask-previews/user-operation-controller": "39.2.0-preview-887b5d5c"
}

@montelaidev montelaidev self-assigned this Oct 22, 2025
@montelaidev montelaidev marked this pull request as ready for review October 22, 2025 13:37
@montelaidev montelaidev requested a review from a team as a code owner October 22, 2025 13:37
@montelaidev montelaidev requested a review from a team as a code owner October 22, 2025 13:39
Co-authored-by: Charly Chevalier <charly.chevalier@consensys.net>
@ccharly ccharly changed the title feat!: add callbacks for hidden and pinned data feat(account-tree-controller): add callbacks for hidden and pinned data Oct 22, 2025
@montelaidev
Copy link
Contributor Author

@metamaskbot publish-preview


if (this.#accountOrderCallbacks?.isPinnedAccount) {
isPinned = group.accounts.some((account) =>
this.#accountOrderCallbacks?.isPinnedAccount?.(account),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: But that should be defined inside this if already

Suggested change
this.#accountOrderCallbacks?.isPinnedAccount?.(account),
this.#accountOrderCallbacks.isPinnedAccount(account),


if (this.#accountOrderCallbacks?.isHiddenAccount) {
isHidden = group.accounts.some((account) =>
this.#accountOrderCallbacks?.isHiddenAccount?.(account),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here:

Suggested change
this.#accountOrderCallbacks?.isHiddenAccount?.(account),
this.#accountOrderCallbacks.isHiddenAccount(account),

},
});
});

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: we could have add a test when both callbacks are provided, but coverage-wise we should be good for those.

Copy link
Contributor

@ccharly ccharly left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, left some nits, but we can take care of that later on. The logic is good anyway!

@montelaidev montelaidev enabled auto-merge (squash) October 22, 2025 16:27
@github-actions
Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "1.5.0-preview-a649a76b",
  "@metamask-previews/accounts-controller": "33.1.1-preview-a649a76b",
  "@metamask-previews/address-book-controller": "6.2.0-preview-a649a76b",
  "@metamask-previews/announcement-controller": "7.1.0-preview-a649a76b",
  "@metamask-previews/app-metadata-controller": "1.1.0-preview-a649a76b",
  "@metamask-previews/approval-controller": "7.2.0-preview-a649a76b",
  "@metamask-previews/assets-controllers": "82.0.0-preview-a649a76b",
  "@metamask-previews/base-controller": "8.4.2-preview-a649a76b",
  "@metamask-previews/bridge-controller": "54.0.0-preview-a649a76b",
  "@metamask-previews/bridge-status-controller": "54.0.0-preview-a649a76b",
  "@metamask-previews/build-utils": "3.0.4-preview-a649a76b",
  "@metamask-previews/chain-agnostic-permission": "1.2.0-preview-a649a76b",
  "@metamask-previews/composable-controller": "11.1.0-preview-a649a76b",
  "@metamask-previews/controller-utils": "11.14.1-preview-a649a76b",
  "@metamask-previews/core-backend": "2.1.0-preview-a649a76b",
  "@metamask-previews/delegation-controller": "0.8.0-preview-a649a76b",
  "@metamask-previews/earn-controller": "8.0.1-preview-a649a76b",
  "@metamask-previews/eip-5792-middleware": "1.2.3-preview-a649a76b",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-a649a76b",
  "@metamask-previews/eip1193-permission-middleware": "1.0.1-preview-a649a76b",
  "@metamask-previews/ens-controller": "17.1.0-preview-a649a76b",
  "@metamask-previews/error-reporting-service": "2.2.1-preview-a649a76b",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-a649a76b",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-a649a76b",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-a649a76b",
  "@metamask-previews/foundryup": "1.0.1-preview-a649a76b",
  "@metamask-previews/gas-fee-controller": "24.1.0-preview-a649a76b",
  "@metamask-previews/gator-permissions-controller": "0.2.1-preview-a649a76b",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-a649a76b",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-a649a76b",
  "@metamask-previews/keyring-controller": "23.1.1-preview-a649a76b",
  "@metamask-previews/logging-controller": "6.1.0-preview-a649a76b",
  "@metamask-previews/message-manager": "13.0.1-preview-a649a76b",
  "@metamask-previews/messenger": "0.3.0-preview-a649a76b",
  "@metamask-previews/multichain-account-service": "1.6.1-preview-a649a76b",
  "@metamask-previews/multichain-api-middleware": "1.2.1-preview-a649a76b",
  "@metamask-previews/multichain-network-controller": "1.0.1-preview-a649a76b",
  "@metamask-previews/multichain-transactions-controller": "5.1.0-preview-a649a76b",
  "@metamask-previews/name-controller": "8.1.0-preview-a649a76b",
  "@metamask-previews/network-controller": "24.3.0-preview-a649a76b",
  "@metamask-previews/network-enablement-controller": "2.1.1-preview-a649a76b",
  "@metamask-previews/notification-services-controller": "18.3.0-preview-a649a76b",
  "@metamask-previews/permission-controller": "11.1.0-preview-a649a76b",
  "@metamask-previews/permission-log-controller": "4.1.0-preview-a649a76b",
  "@metamask-previews/phishing-controller": "14.1.2-preview-a649a76b",
  "@metamask-previews/polling-controller": "14.0.1-preview-a649a76b",
  "@metamask-previews/preferences-controller": "20.1.0-preview-a649a76b",
  "@metamask-previews/profile-sync-controller": "25.1.1-preview-a649a76b",
  "@metamask-previews/rate-limit-controller": "6.1.0-preview-a649a76b",
  "@metamask-previews/remote-feature-flag-controller": "1.9.0-preview-a649a76b",
  "@metamask-previews/sample-controllers": "2.0.1-preview-a649a76b",
  "@metamask-previews/seedless-onboarding-controller": "4.1.0-preview-a649a76b",
  "@metamask-previews/selected-network-controller": "24.0.1-preview-a649a76b",
  "@metamask-previews/shield-controller": "0.3.2-preview-a649a76b",
  "@metamask-previews/signature-controller": "34.0.1-preview-a649a76b",
  "@metamask-previews/subscription-controller": "2.0.0-preview-a649a76b",
  "@metamask-previews/token-search-discovery-controller": "3.5.0-preview-a649a76b",
  "@metamask-previews/transaction-controller": "60.9.0-preview-a649a76b",
  "@metamask-previews/user-operation-controller": "39.2.0-preview-a649a76b"
}

@montelaidev montelaidev merged commit 3513a0f into main Oct 22, 2025
255 checks passed
@montelaidev montelaidev deleted the feat/pinned-hidden-migration branch October 22, 2025 16:43
Gudahtt added a commit that referenced this pull request Oct 24, 2025
…r/multichain-transactions-controller

* origin/main: (35 commits)
  feat: `JsonRpcEngineV2` (#6176)
  Release 641.0.0 (#6940)
  feat: Add transaction emulation actions (#6935)
  Release/640.0.0 (#6934)
  fix(core-backend): control randomness to fix flaky test (#6936)
  chore: Add `@metamask-previews/*` to NPM age gate exceptions (#6937)
  Release/639.0.0 (#6931)
  feat: make getCryptoApproveTransactionParams synchronous (#6930)
  feat: add new actions to `KeyringController` (#6928)
  feat: add `getAccounts` to `AccountsController` (#6927)
  chore: remove `Monad Mainnet` single call balance contract and add into account v4 (#6929)
  Release/638.0.0 (#6923)
  fix: Downgrade `multiformats` to `^9.9.0` to avoid ESM-only dependency (#6920)
  Release/637.0.0 (#6919)
  feat(account-tree-controller): add callbacks for hidden and pinned data (#6910)
  Release 636.0.0 (#6918)
  fix(core-backend): reconnection logic (#6861)
  fix:  Tx state listener and signature coverage (#6906)
  Release/635.0.0 (#6917)
  fix(base-controller): add TypeScript declaration file for legacy module resolution (#6915)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants