Skip to content

feat(assets-controller): mirror custom token changes to Authenticated User Storage - #10336

Merged
Prithpal-Sooriya merged 24 commits into
mainfrom
feat/assets-aus-custom-token-sync
Nov 11, 2026
Merged

Prithpal-Sooriya merged 24 commits into
mainfrom
feat/assets-aus-custom-token-sync

Conversation

@Prithpal-Sooriya

@Prithpal-Sooriya Prithpal-Sooriya commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

Explanation

Custom token changes made locally (addCustomAsset, removeCustomAsset, hideAsset, unhideAsset) are now mirrored to Authenticated User Storage (AUS) so that user asset intent follows the account across clients.

  • Adds a single shared @syncAusUserAssets method decorator (syncAusUserAssets.ts) applied to the four custom-token mutation methods. The mapping from method to AUS behavior is centralized in a name-keyed config that fails fast (at class-definition time) if applied to an unconfigured method.
  • addCustomAsset → importTokens; hideAsset → hideTokens (each a single high-level SDK call with the checksummed CAIP-19 id, preserving the SDK's mutual-exclusivity semantics). removeCustomAsset/unhideAsset → strip-only: read getUserAssets, filter the id out of importedAssets/hiddenAssets respectively, and setUserAssets the result (no write when the blob is null or the id is already absent).
  • The sync is fire-and-forget: it fires as soon as the local state change is applied (before any post-mutation fetch settles), and AUS failures are debug-logged and reported via messenger.captureException (an Error('Failed to sync user assets to AUS', { cause }), matching the account-tree-controller / DeFiPositionsControllerV2 pattern; a throwing reporter is swallowed), never blocking or rolling back the local change. A locally failing method never writes to AUS.
  • Auto-graduation (which removes a custom asset when a metadata source supplies it) is routed through a new #removeCustomAssetInternal so graduation never records user intent in AUS.
  • Adds @metamask/authenticated-user-storage as a dev dependency (type-only usage) with project references, and registers the four AUS action types on the controller messenger's allowed actions.

Known limitations

  • Syncs are serialized per controller instance (each AUS read-modify-write starts only after the previous write has landed), so near-simultaneous local changes no longer lose updates. Cross-device writes are still last-write-wins: AUS has no ETag or revision check.
  • Hide → unhide leaves an empty importedAssets list in the blob. This is a product decision and is out of scope here.

Adversarial review (adverse)

Final verdict (round 1/3): SHIP-WITH-CAVEATS (3/3 ship, 0/3 block)
Findings: 0 critical · 11 warning · 7 info. Fixed: none in this round. The reviewed change is the per-instance sync serialization fix for Bugbot's in-flight merge race. Declined as out of scope for that fix: all 11 warnings. Each targets the PR's existing design or a product decision, not the serialization change. They cover per-account vs user-level removal (open decision), decorator vs explicit call, async-method firing before settle, the AUS package as devDependency in exported messenger types, consent/basic-functionality gating, unwired-client error noise, and test-fixture fidelity. They are flagged for the PR owner.
Reviewer: claude -p via adverse 0.2.1 (3 personas, 2 rounds).

References


Note

Medium Risk
Changes how user asset preferences are persisted to remote storage; failures are non-blocking but cross-client sync correctness depends on the new decorator and queue behavior.

Overview
User-driven custom token changes in AssetsController now mirror to Authenticated User Storage (AUS) so imported and hidden assets can follow the user across clients.

A new @syncAusUserAssets decorator on addCustomAsset, removeCustomAsset, hideAsset, and unhideAsset fires fire-and-forget syncs as soon as local state is applied: adds/hides call importTokens / hideTokens with normalized CAIP-19 ids; removes/unhides strip the id from the stored blob via getUserAssets → filter → setUserAssets (no write when the blob is missing or the id is already absent). Syncs are serialized per controller through a weak-map queue so overlapping read-modify-writes do not race. AUS failures are logged and reported with captureException and never roll back local state; validation failures never touch AUS. Auto-graduation removal uses new #removeCustomAssetInternal so automatic detection does not erase user intent in AUS.

Wiring adds the four AUS messenger actions, @metamask/authenticated-user-storage as a dev/type dependency, changelog entry, and broad unit/integration tests for the decorator and controller paths.

Reviewed by Cursor Bugbot for commit 0ca2b9a. Bugbot is set up for automated code reviews on this repo. Configure here.

Video Walkthrough

assets-aus-custom-token-sync.mp4

🤖 AI-generated walkthrough — script, animation, and voice made by an agent

@cursor cursor Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Stale Bugbot comment from a previous run.

@Prithpal-Sooriya
Prithpal-Sooriya marked this pull request as draft September 22, 2026 07:58
…orted/hidden assets)

Add a user-assets domain to the Authenticated User Storage SDK, backed by
the new GET/PUT /preferences/user-assets endpoints:

- getUserAssets / setUserAssets: low-level blob access, mirroring the
  assets-watchlist pattern (404 -> null on read, strict write validation)
- importTokens / hideTokens: high-level API that handles deduplication
  and mutual exclusivity internally, returning the resolved blob
- Fail-open conflict resolution: an identifier present in both
  importedAssets and hiddenAssets stays imported and is removed from
  hiddenAssets; writes are never rejected due to a conflict
- Strict write-side schema validation: every entry must be a CAIP-19
  asset identifier (CaipAssetTypeStruct); reads stay lenient

Jira: ASSETS-3937
Per review feedback on #10233: keep JSDoc to concise summaries with the
necessary param/returns/throws tags instead of multi-paragraph essays.
The generated action-types file is regenerated to match. No functional
change.
…s to it.each tables

Per review feedback on #10233: the mirrored importTokens/hideTokens
tests, the error-status and malformed-blob cases, and the cache
invalidation trio are now table-driven via it.each, split per scenario.
Adds a hiddenAssets-side malformed-blob row; all existing assertions
preserved.
…assets writes

Per review feedback on #10233: add a UserAssetsBlobNormalizedWriteSchema
refinement asserting no identifier appears in both importedAssets and
hiddenAssets, applied to the normalized blob right before the write.
Structural validation of the raw input still fails fast, but the
exclusivity check runs after fail-open normalization, so a write can
never be rejected because of a conflict — it only guards against
internal logic bugs.
…-tokens API contract

Per the backend integration (va-mmcx-notify-users-storage#128):

- Point getUserAssets/setUserAssets (and their mock URL) at the
  GET/PUT /api/v1/custom-tokens endpoints instead of the provisional
  /preferences/user-assets path.
- Mirror the API's server-side 100-entries-per-list cap with
  USER_ASSETS_MAX_ASSETS, enforced via size() on the write schema (same
  convention as ASSETS_WATCHLIST_MAX_ASSETS); the lenient read schema
  stays uncapped so existing server data is never rejected.
- README/CHANGELOG updated with the endpoint path and the cap.
…om tokens

Adds a clean-slate wipe: clearUserAssets() persists an empty blob
({ version: 1, importedAssets: [], hiddenAssets: [] }) via the existing
PUT /custom-tokens endpoint, which is the wipe mechanism supported by
the current API contract (the backend exposes record deletion only
through internal auth-event/GDPR flows, not a public DELETE endpoint).
Idempotent, works whether or not a blob exists, and invalidates the
getUserAssets cache. Exposed on the messenger with a regenerated
action type.
…itest migration

- Replace one `jest.spyOn` with `vi.spyOn` in the user-assets tests;
  main migrated this package from Jest to Vitest (#10951).
- Update `oxlint-suppressions.json`: one additional
  `no-unsafe-assignment`/`no-unsafe-return` pair from the new
  `getUserAssets` method (same `fetchQuery` idiom as the existing
  getters) and one `vitest/no-conditional-in-test` suppression for the
  cache-invalidation table test, matching repo-wide norms.
@Prithpal-Sooriya
Prithpal-Sooriya force-pushed the feature/act-as-a-senior-soft-rhj branch from 3b999be to 3208a82 Compare October 26, 2026 17:15
A delayed add sync could overwrite a later remove that had already
stripped the token from AUS, and a post-mutation fetch failure skipped
the mirror of an already-applied local add. Queue each sync when the
decorated method returns (its local mutation is already committed) and
run syncs strictly in invocation order. Also fix oxfmt formatting, the
tsconfig.lint.json authenticated-user-storage reference, and the README
dependency graph.
Remove the FIFO sync chain; the decorator now fires the AUS mirror
directly once the decorated method returns, since every configured
method applies its local mutation before returning or first awaiting.
Also trim JSDoc to terse one-line summaries per repo conventions.
- Replace Jest idioms (jest.fn/jest.Mock) with Vitest (vi.fn/Mock) in the
  AUS sync tests, mirroring the sibling authenticated-user-storage
  adaptation on the base branch.
- Await the now-async unhideAsset in tests and fold the AUS-sync unhide
  tests into the existing unhideAsset describe block (no-identical-title).
- Bump the @metamask/authenticated-user-storage devDependency range to
  ^4.1.0 to satisfy yarn constraints against the workspace version.
@Prithpal-Sooriya
Prithpal-Sooriya force-pushed the feat/assets-aus-custom-token-sync branch from eaa8eb4 to da2d647 Compare October 26, 2026 17:30
Prithpal-Sooriya and others added 5 commits November 2, 2026 15:50
… idiom

Main migrated nock to v15 and made the nock-based tests independent of
node-fetch (#11077, #11055) by replacing reply-callback request-body
assertions with `nock.RequestBodyMatcher` arguments plus `.isDone()`
checks. Convert `handleMockSetUserAssets` and its seven call sites to
the same idiom — the old callback form hangs under nock v15 with native
fetch.
…' into feat/assets-aus-custom-token-sync

# Conflicts:
#	yarn.lock
…se merge

The merge of origin/feature/act-as-a-senior-soft-rhj auto-placed the
#10336 changelog entry into the released [20.0.0] section (leaving
Unreleased empty). Move it back under Unreleased/Added so the
changelog check passes and the entry stays unreleased.
@Prithpal-Sooriya

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

Base automatically changed from feature/act-as-a-senior-soft-rhj to main November 10, 2026 13:03
…m-token-sync-1

# Conflicts:
#	packages/assets-controller/CHANGELOG.md
#	packages/assets-controller/package.json
#	packages/assets-controller/src/AssetsController.test.ts
#	yarn.lock
@Prithpal-Sooriya

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions

Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@11.2.0-preview-55655ba17
@metamask-previews/accounts-controller@40.2.0-preview-55655ba17
@metamask-previews/address-book-controller@8.0.0-preview-55655ba17
@metamask-previews/advanced-chart-core@1.1.0-preview-55655ba17
@metamask-previews/ai-controllers@2.0.0-preview-55655ba17
@metamask-previews/analytics-controller@4.3.0-preview-55655ba17
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-55655ba17
@metamask-previews/announcement-controller@9.0.0-preview-55655ba17
@metamask-previews/app-metadata-controller@3.0.0-preview-55655ba17
@metamask-previews/approval-controller@10.0.0-preview-55655ba17
@metamask-previews/assets-controller@20.3.1-preview-55655ba17
@metamask-previews/assets-controllers@113.3.1-preview-55655ba17
@metamask-previews/authenticated-user-storage@4.1.0-preview-55655ba17
@metamask-previews/base-controller@10.1.0-preview-55655ba17
@metamask-previews/base-data-service@2.1.0-preview-55655ba17
@metamask-previews/bitcoin-regtest-up@2.0.0-preview-55655ba17
@metamask-previews/bridge-controller@83.1.4-preview-55655ba17
@metamask-previews/bridge-status-controller@78.0.2-preview-55655ba17
@metamask-previews/build-utils@4.0.0-preview-55655ba17
@metamask-previews/byte-utils@0.1.0-preview-55655ba17
@metamask-previews/chain-agnostic-permission@2.1.0-preview-55655ba17
@metamask-previews/chomp-api-service@7.0.0-preview-55655ba17
@metamask-previews/claims-controller@1.1.0-preview-55655ba17
@metamask-previews/client-controller@2.0.0-preview-55655ba17
@metamask-previews/client-utils@3.2.0-preview-55655ba17
@metamask-previews/compliance-controller@3.0.0-preview-55655ba17
@metamask-previews/composable-controller@13.0.0-preview-55655ba17
@metamask-previews/config-registry-controller@5.0.0-preview-55655ba17
@metamask-previews/connectivity-controller@1.0.0-preview-55655ba17
@metamask-previews/controller-utils@13.0.0-preview-55655ba17
@metamask-previews/core-backend@14.0.0-preview-55655ba17
@metamask-previews/cryptography@1.1.2-preview-55655ba17
@metamask-previews/delegation-controller@4.0.0-preview-55655ba17
@metamask-previews/earn-controller@13.1.0-preview-55655ba17
@metamask-previews/eip-5792-middleware@4.1.0-preview-55655ba17
@metamask-previews/eip-7702-internal-rpc-middleware@1.0.0-preview-55655ba17
@metamask-previews/eip1193-permission-middleware@3.0.0-preview-55655ba17
@metamask-previews/error-utils@0.1.0-preview-55655ba17
@metamask-previews/eth-block-tracker@16.0.0-preview-55655ba17
@metamask-previews/eth-json-rpc-middleware@26.0.0-preview-55655ba17
@metamask-previews/eth-json-rpc-provider@7.0.0-preview-55655ba17
@metamask-previews/eth-sig-util@9.0.0-preview-55655ba17
@metamask-previews/foundryup@2.0.0-preview-55655ba17
@metamask-previews/gas-fee-controller@27.1.1-preview-55655ba17
@metamask-previews/gator-permissions-controller@6.1.1-preview-55655ba17
@metamask-previews/geolocation-controller@2.0.0-preview-55655ba17
@metamask-previews/java-tron-up@2.0.0-preview-55655ba17
@metamask-previews/json-rpc-engine@11.0.0-preview-55655ba17
@metamask-previews/json-rpc-middleware-stream@9.0.0-preview-55655ba17
@metamask-previews/key-tree@10.1.1-preview-55655ba17
@metamask-previews/keyring-controller@28.2.0-preview-55655ba17
@metamask-previews/kyc-controller@0.16.0-preview-55655ba17
@metamask-previews/local-node-utils@2.0.0-preview-55655ba17
@metamask-previews/logging-controller@10.0.0-preview-55655ba17
@metamask-previews/marketing-consent-controller@1.1.0-preview-55655ba17
@metamask-previews/message-manager@15.0.0-preview-55655ba17
@metamask-previews/messenger@3.0.0-preview-55655ba17
@metamask-previews/messenger-cli@1.0.0-preview-55655ba17
@metamask-previews/mfa-recovery-controller@0.0.0-preview-55655ba17
@metamask-previews/money-account-api-data-service@2.3.1-preview-55655ba17
@metamask-previews/money-account-balance-service@3.2.0-preview-55655ba17
@metamask-previews/money-account-controller@3.0.0-preview-55655ba17
@metamask-previews/money-account-lifecycle-controller@0.0.0-preview-55655ba17
@metamask-previews/money-account-mfa-whitelist@0.2.0-preview-55655ba17
@metamask-previews/money-account-upgrade-controller@6.0.1-preview-55655ba17
@metamask-previews/money-account-utils@2.2.0-preview-55655ba17
@metamask-previews/multichain-account-service@14.1.0-preview-55655ba17
@metamask-previews/multichain-api-middleware@5.1.0-preview-55655ba17
@metamask-previews/multichain-network-controller@4.1.1-preview-55655ba17
@metamask-previews/multichain-transactions-controller@8.0.0-preview-55655ba17
@metamask-previews/name-controller@10.0.0-preview-55655ba17
@metamask-previews/network-connection-banner-controller@1.1.0-preview-55655ba17
@metamask-previews/network-controller@38.0.0-preview-55655ba17
@metamask-previews/network-enablement-controller@7.1.1-preview-55655ba17
@metamask-previews/node-utils@0.1.0-preview-55655ba17
@metamask-previews/notification-services-controller@30.1.0-preview-55655ba17
@metamask-previews/passkey-controller@4.1.0-preview-55655ba17
@metamask-previews/permission-controller@14.1.0-preview-55655ba17
@metamask-previews/permission-log-controller@6.0.0-preview-55655ba17
@metamask-previews/perps-controller@22.3.0-preview-55655ba17
@metamask-previews/phishing-controller@18.3.0-preview-55655ba17
@metamask-previews/platform-api-docs@0.2.1-preview-55655ba17
@metamask-previews/polling-controller@17.0.0-preview-55655ba17
@metamask-previews/preferences-controller@24.0.0-preview-55655ba17
@metamask-previews/profile-controller@3.0.0-preview-55655ba17
@metamask-previews/profile-metrics-controller@5.2.1-preview-55655ba17
@metamask-previews/profile-sync-controller@36.1.0-preview-55655ba17
@metamask-previews/ramps-controller@29.0.0-preview-55655ba17
@metamask-previews/rate-limit-controller@8.0.0-preview-55655ba17
@metamask-previews/react-data-query@2.0.0-preview-55655ba17
@metamask-previews/remote-feature-flag-controller@7.0.0-preview-55655ba17
@metamask-previews/sample-controllers@6.1.0-preview-55655ba17
@metamask-previews/seedless-onboarding-controller@12.0.0-preview-55655ba17
@metamask-previews/selected-network-controller@27.1.0-preview-55655ba17
@metamask-previews/sentinel-api-service@2.1.0-preview-55655ba17
@metamask-previews/shield-controller@7.1.1-preview-55655ba17
@metamask-previews/signature-controller@40.1.0-preview-55655ba17
@metamask-previews/smart-transactions-controller@27.2.2-preview-55655ba17
@metamask-previews/snap-account-service@4.0.0-preview-55655ba17
@metamask-previews/social-controllers@3.20.0-preview-55655ba17
@metamask-previews/solana-test-validator-up@2.0.0-preview-55655ba17
@metamask-previews/stellar-quickstart-up@0.0.0-preview-55655ba17
@metamask-previews/storage-service@2.0.0-preview-55655ba17
@metamask-previews/subscription-controller@15.2.0-preview-55655ba17
@metamask-previews/transaction-controller@73.1.2-preview-55655ba17
@metamask-previews/transaction-pay-controller@31.1.0-preview-55655ba17
@metamask-previews/transaction-pay-middleware@2.0.2-preview-55655ba17
@metamask-previews/type-utils@0.1.0-preview-55655ba17
@metamask-previews/user-operation-controller@42.1.1-preview-55655ba17
@metamask-previews/utils@12.0.1-preview-55655ba17
@metamask-previews/wallet@21.0.1-preview-55655ba17
@metamask-previews/watch-only-account-service@0.1.0-preview-55655ba17

@Prithpal-Sooriya

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions

Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@11.2.0-preview-4ca608e50
@metamask-previews/accounts-controller@40.2.0-preview-4ca608e50
@metamask-previews/address-book-controller@8.0.0-preview-4ca608e50
@metamask-previews/advanced-chart-core@1.1.0-preview-4ca608e50
@metamask-previews/ai-controllers@2.0.0-preview-4ca608e50
@metamask-previews/analytics-controller@4.3.0-preview-4ca608e50
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-4ca608e50
@metamask-previews/announcement-controller@9.0.0-preview-4ca608e50
@metamask-previews/app-metadata-controller@3.0.0-preview-4ca608e50
@metamask-previews/approval-controller@10.0.0-preview-4ca608e50
@metamask-previews/assets-controller@20.3.1-preview-4ca608e50
@metamask-previews/assets-controllers@113.3.1-preview-4ca608e50
@metamask-previews/authenticated-user-storage@4.1.0-preview-4ca608e50
@metamask-previews/base-controller@10.1.0-preview-4ca608e50
@metamask-previews/base-data-service@2.1.0-preview-4ca608e50
@metamask-previews/bitcoin-regtest-up@2.0.0-preview-4ca608e50
@metamask-previews/bridge-controller@83.1.4-preview-4ca608e50
@metamask-previews/bridge-status-controller@78.0.2-preview-4ca608e50
@metamask-previews/build-utils@4.0.0-preview-4ca608e50
@metamask-previews/byte-utils@0.1.0-preview-4ca608e50
@metamask-previews/chain-agnostic-permission@2.1.0-preview-4ca608e50
@metamask-previews/chomp-api-service@7.0.0-preview-4ca608e50
@metamask-previews/claims-controller@1.1.0-preview-4ca608e50
@metamask-previews/client-controller@2.0.0-preview-4ca608e50
@metamask-previews/client-utils@3.2.0-preview-4ca608e50
@metamask-previews/compliance-controller@3.0.0-preview-4ca608e50
@metamask-previews/composable-controller@13.0.0-preview-4ca608e50
@metamask-previews/config-registry-controller@5.0.0-preview-4ca608e50
@metamask-previews/connectivity-controller@1.0.0-preview-4ca608e50
@metamask-previews/controller-utils@13.0.0-preview-4ca608e50
@metamask-previews/core-backend@14.0.0-preview-4ca608e50
@metamask-previews/cryptography@1.1.2-preview-4ca608e50
@metamask-previews/delegation-controller@4.0.0-preview-4ca608e50
@metamask-previews/earn-controller@13.1.0-preview-4ca608e50
@metamask-previews/eip-5792-middleware@4.1.0-preview-4ca608e50
@metamask-previews/eip-7702-internal-rpc-middleware@1.0.0-preview-4ca608e50
@metamask-previews/eip1193-permission-middleware@3.0.0-preview-4ca608e50
@metamask-previews/error-utils@0.1.0-preview-4ca608e50
@metamask-previews/eth-block-tracker@16.0.0-preview-4ca608e50
@metamask-previews/eth-json-rpc-middleware@26.0.0-preview-4ca608e50
@metamask-previews/eth-json-rpc-provider@7.0.0-preview-4ca608e50
@metamask-previews/eth-sig-util@9.0.0-preview-4ca608e50
@metamask-previews/foundryup@2.0.0-preview-4ca608e50
@metamask-previews/gas-fee-controller@27.1.1-preview-4ca608e50
@metamask-previews/gator-permissions-controller@6.1.1-preview-4ca608e50
@metamask-previews/geolocation-controller@2.0.0-preview-4ca608e50
@metamask-previews/java-tron-up@2.0.0-preview-4ca608e50
@metamask-previews/json-rpc-engine@11.0.0-preview-4ca608e50
@metamask-previews/json-rpc-middleware-stream@9.0.0-preview-4ca608e50
@metamask-previews/key-tree@10.1.1-preview-4ca608e50
@metamask-previews/keyring-controller@28.2.0-preview-4ca608e50
@metamask-previews/kyc-controller@0.16.0-preview-4ca608e50
@metamask-previews/local-node-utils@2.0.0-preview-4ca608e50
@metamask-previews/logging-controller@10.0.0-preview-4ca608e50
@metamask-previews/marketing-consent-controller@1.1.0-preview-4ca608e50
@metamask-previews/message-manager@15.0.0-preview-4ca608e50
@metamask-previews/messenger@3.0.0-preview-4ca608e50
@metamask-previews/messenger-cli@1.0.0-preview-4ca608e50
@metamask-previews/mfa-recovery-controller@0.0.0-preview-4ca608e50
@metamask-previews/money-account-api-data-service@2.3.1-preview-4ca608e50
@metamask-previews/money-account-balance-service@3.2.0-preview-4ca608e50
@metamask-previews/money-account-controller@3.0.0-preview-4ca608e50
@metamask-previews/money-account-lifecycle-controller@0.0.0-preview-4ca608e50
@metamask-previews/money-account-mfa-whitelist@0.2.0-preview-4ca608e50
@metamask-previews/money-account-upgrade-controller@6.0.1-preview-4ca608e50
@metamask-previews/money-account-utils@2.2.0-preview-4ca608e50
@metamask-previews/multichain-account-service@14.1.0-preview-4ca608e50
@metamask-previews/multichain-api-middleware@5.1.0-preview-4ca608e50
@metamask-previews/multichain-network-controller@4.1.1-preview-4ca608e50
@metamask-previews/multichain-transactions-controller@8.0.0-preview-4ca608e50
@metamask-previews/name-controller@10.0.0-preview-4ca608e50
@metamask-previews/network-connection-banner-controller@1.1.0-preview-4ca608e50
@metamask-previews/network-controller@38.0.0-preview-4ca608e50
@metamask-previews/network-enablement-controller@7.1.1-preview-4ca608e50
@metamask-previews/node-utils@0.1.0-preview-4ca608e50
@metamask-previews/notification-services-controller@30.1.0-preview-4ca608e50
@metamask-previews/passkey-controller@4.1.0-preview-4ca608e50
@metamask-previews/permission-controller@14.1.0-preview-4ca608e50
@metamask-previews/permission-log-controller@6.0.0-preview-4ca608e50
@metamask-previews/perps-controller@23.0.0-preview-4ca608e50
@metamask-previews/phishing-controller@18.3.0-preview-4ca608e50
@metamask-previews/platform-api-docs@0.2.1-preview-4ca608e50
@metamask-previews/polling-controller@17.0.0-preview-4ca608e50
@metamask-previews/preferences-controller@24.0.0-preview-4ca608e50
@metamask-previews/profile-controller@3.0.0-preview-4ca608e50
@metamask-previews/profile-metrics-controller@5.2.1-preview-4ca608e50
@metamask-previews/profile-sync-controller@36.1.1-preview-4ca608e50
@metamask-previews/ramps-controller@29.0.0-preview-4ca608e50
@metamask-previews/rate-limit-controller@8.0.0-preview-4ca608e50
@metamask-previews/react-data-query@2.0.0-preview-4ca608e50
@metamask-previews/remote-feature-flag-controller@7.0.0-preview-4ca608e50
@metamask-previews/sample-controllers@6.1.0-preview-4ca608e50
@metamask-previews/seedless-onboarding-controller@12.0.0-preview-4ca608e50
@metamask-previews/selected-network-controller@27.1.0-preview-4ca608e50
@metamask-previews/sentinel-api-service@2.1.0-preview-4ca608e50
@metamask-previews/shield-controller@7.1.1-preview-4ca608e50
@metamask-previews/signature-controller@40.1.0-preview-4ca608e50
@metamask-previews/smart-transactions-controller@27.2.2-preview-4ca608e50
@metamask-previews/snap-account-service@4.0.0-preview-4ca608e50
@metamask-previews/social-controllers@3.20.0-preview-4ca608e50
@metamask-previews/solana-test-validator-up@2.0.0-preview-4ca608e50
@metamask-previews/stellar-quickstart-up@0.0.0-preview-4ca608e50
@metamask-previews/storage-service@2.0.0-preview-4ca608e50
@metamask-previews/subscription-controller@15.2.0-preview-4ca608e50
@metamask-previews/transaction-controller@73.1.2-preview-4ca608e50
@metamask-previews/transaction-pay-controller@31.1.0-preview-4ca608e50
@metamask-previews/transaction-pay-middleware@2.0.3-preview-4ca608e50
@metamask-previews/type-utils@0.1.0-preview-4ca608e50
@metamask-previews/user-operation-controller@42.1.1-preview-4ca608e50
@metamask-previews/utils@12.0.1-preview-4ca608e50
@metamask-previews/wallet@21.0.1-preview-4ca608e50
@metamask-previews/watch-only-account-service@0.1.0-preview-4ca608e50

@cursor cursor Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Stale Bugbot comment from a previous run.

dawnseeker8
dawnseeker8 previously approved these changes Nov 11, 2026

@dawnseeker8 dawnseeker8 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

…m-token-sync-1

# Conflicts:
#	packages/assets-controller/CHANGELOG.md
#	packages/assets-controller/src/AssetsController.ts
@Prithpal-Sooriya

Copy link
Copy Markdown
Contributor Author

🤖 Merged latest main (4ab87ec) into this branch. Resolved conflicts in the assets-controller CHANGELOG and imports with no change to PR behaviour; assets-controller tests (1430) and build tsc/oxlint pass.

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 420cd37. Configure here.

…r instance

A strip (removeCustomAsset/unhideAsset) could read the AUS blob while an
earlier importTokens/hideTokens write was still in flight, see the asset
as absent and skip its write, so the earlier merge undid the strip.
Queue syncs per instance so each read-modify-write starts only after the
previous one has landed.

@dawnseeker8 dawnseeker8 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@Prithpal-Sooriya
Prithpal-Sooriya added this pull request to the merge queue Nov 11, 2026
Merged via the queue into main with commit a9a1619 Nov 11, 2026
48 checks passed
@Prithpal-Sooriya
Prithpal-Sooriya deleted the feat/assets-aus-custom-token-sync branch November 11, 2026 12:46
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.

2 participants