From 7354640ba53eb0127db1d76c2ced67c90288a5a7 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 4 Aug 2026 11:08:58 +0000 Subject: [PATCH 1/2] feat(tron-wallet-snap): add Core messenger plumbing Instantiate Core messenger via getMessenger and endow RemoteFeatureFlagController:getState plus AssetsController read actions. Wire RemoteFeatureFlagsProvider and AssetsProvider from @metamask/snap-networks-utils@1.0.0. No assets migration stage resolution or Core routing yet. Co-authored-by: Ulisses Ferreira --- packages/tron-wallet-snap/CHANGELOG.md | 1 + packages/tron-wallet-snap/package.json | 4 +++ packages/tron-wallet-snap/snap.manifest.json | 8 +++++ packages/tron-wallet-snap/src/context.ts | 30 +++++++++++++++- .../src/types/core-messenger.ts | 34 +++++++++++++++++++ yarn.lock | 21 ++++++++++-- 6 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 packages/tron-wallet-snap/src/types/core-messenger.ts diff --git a/packages/tron-wallet-snap/CHANGELOG.md b/packages/tron-wallet-snap/CHANGELOG.md index a10c6ddd..14fa407b 100644 --- a/packages/tron-wallet-snap/CHANGELOG.md +++ b/packages/tron-wallet-snap/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING** Implement Keyring API v2 (`KeyringSnapRpc` interface): rename `listAccounts` → `getAccounts`, `listAccountAssets` → `getAccountAssets`, `listAccountTransactions` → `getAccountTransactions`; `getAccount` now throws instead of returning `undefined`; add `exportAccount` with hexadecimal private key export using `sensitive()` for redaction; remove v1-only methods `createAccount`, `discoverAccounts`, `filterAccountChains`, and `updateAccount`. ([#56](https://github.com/MetaMask/internal-snaps/pull/56)) - Add `bip44:discover` support to `createAccounts`: checks on-chain activity across all Tron networks before persisting; returns `[]` if no activity to signal end-of-discovery to the client. ([#56](https://github.com/MetaMask/internal-snaps/pull/56)) - Add `endowment:keyring` capabilities to manifest declaring the `tron:728126428` scope, hexadecimal private key export, and BIP-44 derivation strategies. ([#56](https://github.com/MetaMask/internal-snaps/pull/56)) +- Wire Core messenger endowment and instantiate `RemoteFeatureFlagsProvider` and `AssetsProvider` from `@metamask/snap-networks-utils` v1.0.0 (plumbing only; no Core routing yet). ### Fixed diff --git a/packages/tron-wallet-snap/package.json b/packages/tron-wallet-snap/package.json index 5767cde3..922e9242 100644 --- a/packages/tron-wallet-snap/package.json +++ b/packages/tron-wallet-snap/package.json @@ -48,10 +48,14 @@ "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch" }, "devDependencies": { + "@metamask/assets-controller": "^13.0.0", "@metamask/auto-changelog": "^6.1.1", "@metamask/key-tree": "^10.1.1", "@metamask/keyring-api": "^23.7.0", "@metamask/keyring-snap-sdk": "^9.2.1", + "@metamask/messenger": "^2.0.0", + "@metamask/remote-feature-flag-controller": "4.2.2", + "@metamask/snap-networks-utils": "workspace:^", "@metamask/snaps-cli": "^8.4.1", "@metamask/snaps-jest": "^10.2.0", "@metamask/snaps-sdk": "^11.2.0", diff --git a/packages/tron-wallet-snap/snap.manifest.json b/packages/tron-wallet-snap/snap.manifest.json index 99b1b85f..2d2e9bf9 100644 --- a/packages/tron-wallet-snap/snap.manifest.json +++ b/packages/tron-wallet-snap/snap.manifest.json @@ -63,6 +63,14 @@ }, "endowment:assets": { "scopes": ["tron:728126428"] + }, + "endowment:messenger": { + "actions": [ + "RemoteFeatureFlagController:getState", + "AssetsController:getAccountAssetByID", + "AssetsController:getAccountAssetsByIDs", + "AssetsController:getAccountAssetsByScope" + ] } }, "platformVersion": "11.2.0", diff --git a/packages/tron-wallet-snap/src/context.ts b/packages/tron-wallet-snap/src/context.ts index db5c9641..ec9d12dd 100644 --- a/packages/tron-wallet-snap/src/context.ts +++ b/packages/tron-wallet-snap/src/context.ts @@ -1,3 +1,11 @@ +import { getMessenger } from '@metamask/snaps-sdk'; +import { + AssetsProvider, + RemoteFeatureFlagsProvider, + type AssetsProviderMessenger, + type RemoteFeatureFlagsProviderMessenger, +} from '@metamask/snap-networks-utils'; + import { InMemoryCache } from './caching/InMemoryCache'; import { StateCache } from './caching/StateCache'; import { PriceApiClient } from './clients/price-api/PriceApiClient'; @@ -29,6 +37,7 @@ import { TransactionScanService } from './services/transaction-scan/TransactionS import { TransactionsRepository } from './services/transactions/TransactionsRepository'; import { TransactionsService } from './services/transactions/TransactionsService'; import { WalletService } from './services/wallet/WalletService'; +import type { CoreMessenger, CoreMessengerMessenger } from './types/core-messenger'; import logger, { noOpLogger } from './utils/logger'; /** @@ -82,13 +91,23 @@ const priceApiClient = new PriceApiClient(configProvider, priceCache); // Token API client const tokenApiClient = new TokenApiClient(configProvider); +const coreMessenger = getMessenger(); + +const remoteFeatureFlagsProvider = new RemoteFeatureFlagsProvider({ + messenger: coreMessenger as RemoteFeatureFlagsProviderMessenger, +}); + +const assetsProvider = new AssetsProvider({ + messenger: coreMessenger as AssetsProviderMessenger, +}); + // Security Alerts API client const securityAlertsApiClient = new SecurityAlertsApiClient( configProvider, logger, ); -// Business Services - depend on Repositories, State and other Services +// Business Services const assetsService = new AssetsService({ logger, state, @@ -235,6 +254,12 @@ export type SnapExecutionContext = { confirmationHandler: ConfirmationHandler; transactionScanService: TransactionScanService; transactionExpirationRefresherService: TransactionExpirationRefresherService; + /** + * Core messenger plumbing (routing wired in a follow-up PR). + */ + coreMessenger: CoreMessenger; + remoteFeatureFlagsProvider: RemoteFeatureFlagsProvider; + assetsProvider: AssetsProvider; /** * Handlers */ @@ -267,6 +292,9 @@ const snapContext: SnapExecutionContext = { confirmationHandler, transactionScanService, transactionExpirationRefresherService, + coreMessenger, + remoteFeatureFlagsProvider, + assetsProvider, /** * Handlers */ diff --git a/packages/tron-wallet-snap/src/types/core-messenger.ts b/packages/tron-wallet-snap/src/types/core-messenger.ts new file mode 100644 index 00000000..6090a068 --- /dev/null +++ b/packages/tron-wallet-snap/src/types/core-messenger.ts @@ -0,0 +1,34 @@ +import type { + AssetsControllerGetAccountAssetByIDAction, + AssetsControllerGetAccountAssetsByIDsAction, + AssetsControllerGetAccountAssetsByScopeAction, +} from '@metamask/assets-controller'; +import type { Messenger } from '@metamask/messenger'; +import type { RemoteFeatureFlagControllerGetStateAction } from '@metamask/remote-feature-flag-controller'; +import type { AsyncMessenger } from '@metamask/snaps-sdk'; + +/** + * Namespace for this Snap's Core messenger endowment. + */ +export const TRON_WALLET_SNAP_MESSENGER_NAMESPACE = + 'TronWalletSnap' as const; + +export type CoreMessengerActions = + | RemoteFeatureFlagControllerGetStateAction + | AssetsControllerGetAccountAssetByIDAction + | AssetsControllerGetAccountAssetsByIDsAction + | AssetsControllerGetAccountAssetsByScopeAction; + +/** + * Messenger type passed to `getMessenger` for Core controller actions. + */ +export type CoreMessengerMessenger = Messenger< + typeof TRON_WALLET_SNAP_MESSENGER_NAMESPACE, + CoreMessengerActions +>; + +/** + * Typed async messenger for Core controller actions available to this Snap via + * `endowment:messenger` / `getMessenger`. + */ +export type CoreMessenger = AsyncMessenger; diff --git a/yarn.lock b/yarn.lock index 3de5c023..c0b103b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2273,7 +2273,7 @@ __metadata: languageName: node linkType: hard -"@metamask/controller-utils@npm:^12.0.0, @metamask/controller-utils@npm:^12.3.0": +"@metamask/controller-utils@npm:^12.0.0, @metamask/controller-utils@npm:^12.1.0, @metamask/controller-utils@npm:^12.3.0": version: 12.3.0 resolution: "@metamask/controller-utils@npm:12.3.0" dependencies: @@ -3215,6 +3215,19 @@ __metadata: languageName: node linkType: hard +"@metamask/remote-feature-flag-controller@npm:4.2.2": + version: 4.2.2 + resolution: "@metamask/remote-feature-flag-controller@npm:4.2.2" + dependencies: + "@metamask/base-controller": "npm:^9.1.0" + "@metamask/controller-utils": "npm:^12.1.0" + "@metamask/messenger": "npm:^1.2.0" + "@metamask/utils": "npm:^11.9.0" + uuid: "npm:^8.3.2" + checksum: 10/ed03ff1ba63c7a0f2b221c3514eb71a8be4200ec543b90676a44930dc731920ac2c92dcc2b13a32ed4e4e8e7e7b28a26db443af9f4bf30f5e2b5785580b286ab + languageName: node + linkType: hard + "@metamask/remote-feature-flag-controller@npm:^5.0.0": version: 5.0.0 resolution: "@metamask/remote-feature-flag-controller@npm:5.0.0" @@ -3299,7 +3312,7 @@ __metadata: languageName: node linkType: hard -"@metamask/snap-networks-utils@workspace:packages/snap-networks-utils": +"@metamask/snap-networks-utils@workspace:^, @metamask/snap-networks-utils@workspace:packages/snap-networks-utils": version: 0.0.0-use.local resolution: "@metamask/snap-networks-utils@workspace:packages/snap-networks-utils" dependencies: @@ -3767,10 +3780,14 @@ __metadata: version: 0.0.0-use.local resolution: "@metamask/tron-wallet-snap@workspace:packages/tron-wallet-snap" dependencies: + "@metamask/assets-controller": "npm:^13.0.0" "@metamask/auto-changelog": "npm:^6.1.1" "@metamask/key-tree": "npm:^10.1.1" "@metamask/keyring-api": "npm:^23.7.0" "@metamask/keyring-snap-sdk": "npm:^9.2.1" + "@metamask/messenger": "npm:^2.0.0" + "@metamask/remote-feature-flag-controller": "npm:4.2.2" + "@metamask/snap-networks-utils": "workspace:^" "@metamask/snaps-cli": "npm:^8.4.1" "@metamask/snaps-jest": "npm:^10.2.0" "@metamask/snaps-sdk": "npm:^11.2.0" From 24a1fdb2869c42c39c546f712acb91eaf83ddfb9 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 5 Aug 2026 08:15:12 +0000 Subject: [PATCH 2/2] fix(tron-wallet-snap): update manifest shasum after rebase onto main Co-authored-by: Ulisses Ferreira --- packages/tron-wallet-snap/CHANGELOG.md | 1 - packages/tron-wallet-snap/package.json | 2 +- packages/tron-wallet-snap/snap.manifest.json | 2 +- packages/tron-wallet-snap/src/context.ts | 20 +++++++------------ .../src/services/assets/AssetsService.ts | 3 +++ .../src/types/core-messenger.ts | 11 ++-------- yarn.lock | 4 ++-- 7 files changed, 16 insertions(+), 27 deletions(-) diff --git a/packages/tron-wallet-snap/CHANGELOG.md b/packages/tron-wallet-snap/CHANGELOG.md index 14fa407b..a10c6ddd 100644 --- a/packages/tron-wallet-snap/CHANGELOG.md +++ b/packages/tron-wallet-snap/CHANGELOG.md @@ -12,7 +12,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **BREAKING** Implement Keyring API v2 (`KeyringSnapRpc` interface): rename `listAccounts` → `getAccounts`, `listAccountAssets` → `getAccountAssets`, `listAccountTransactions` → `getAccountTransactions`; `getAccount` now throws instead of returning `undefined`; add `exportAccount` with hexadecimal private key export using `sensitive()` for redaction; remove v1-only methods `createAccount`, `discoverAccounts`, `filterAccountChains`, and `updateAccount`. ([#56](https://github.com/MetaMask/internal-snaps/pull/56)) - Add `bip44:discover` support to `createAccounts`: checks on-chain activity across all Tron networks before persisting; returns `[]` if no activity to signal end-of-discovery to the client. ([#56](https://github.com/MetaMask/internal-snaps/pull/56)) - Add `endowment:keyring` capabilities to manifest declaring the `tron:728126428` scope, hexadecimal private key export, and BIP-44 derivation strategies. ([#56](https://github.com/MetaMask/internal-snaps/pull/56)) -- Wire Core messenger endowment and instantiate `RemoteFeatureFlagsProvider` and `AssetsProvider` from `@metamask/snap-networks-utils` v1.0.0 (plumbing only; no Core routing yet). ### Fixed diff --git a/packages/tron-wallet-snap/package.json b/packages/tron-wallet-snap/package.json index 922e9242..80e93ce6 100644 --- a/packages/tron-wallet-snap/package.json +++ b/packages/tron-wallet-snap/package.json @@ -55,7 +55,7 @@ "@metamask/keyring-snap-sdk": "^9.2.1", "@metamask/messenger": "^2.0.0", "@metamask/remote-feature-flag-controller": "4.2.2", - "@metamask/snap-networks-utils": "workspace:^", + "@metamask/snap-networks-utils": "1.0.0", "@metamask/snaps-cli": "^8.4.1", "@metamask/snaps-jest": "^10.2.0", "@metamask/snaps-sdk": "^11.2.0", diff --git a/packages/tron-wallet-snap/snap.manifest.json b/packages/tron-wallet-snap/snap.manifest.json index 2d2e9bf9..63054319 100644 --- a/packages/tron-wallet-snap/snap.manifest.json +++ b/packages/tron-wallet-snap/snap.manifest.json @@ -7,7 +7,7 @@ "url": "https://github.com/MetaMask/internal-snaps.git" }, "source": { - "shasum": "uocZF1RsEzCWGmRM3X3mMv42laNfJWpwVXOfNViikl8=", + "shasum": "TcGnc5FNqoU0UNnDRWY79cyE/a8zm5xe5QEF4opj3zY=", "location": { "npm": { "filePath": "dist/bundle.js", diff --git a/packages/tron-wallet-snap/src/context.ts b/packages/tron-wallet-snap/src/context.ts index ec9d12dd..5fb54d0b 100644 --- a/packages/tron-wallet-snap/src/context.ts +++ b/packages/tron-wallet-snap/src/context.ts @@ -37,7 +37,7 @@ import { TransactionScanService } from './services/transaction-scan/TransactionS import { TransactionsRepository } from './services/transactions/TransactionsRepository'; import { TransactionsService } from './services/transactions/TransactionsService'; import { WalletService } from './services/wallet/WalletService'; -import type { CoreMessenger, CoreMessengerMessenger } from './types/core-messenger'; +import type { CoreMessenger } from './types/core-messenger'; import logger, { noOpLogger } from './utils/logger'; /** @@ -91,12 +91,13 @@ const priceApiClient = new PriceApiClient(configProvider, priceCache); // Token API client const tokenApiClient = new TokenApiClient(configProvider); -const coreMessenger = getMessenger(); - +/** + * Core controllers plumbing + */ +const coreMessenger = getMessenger(); const remoteFeatureFlagsProvider = new RemoteFeatureFlagsProvider({ messenger: coreMessenger as RemoteFeatureFlagsProviderMessenger, }); - const assetsProvider = new AssetsProvider({ messenger: coreMessenger as AssetsProviderMessenger, }); @@ -117,6 +118,8 @@ const assetsService = new AssetsService({ priceApiClient, tokenApiClient, snapClient, + remoteFeatureFlagsProvider, + assetsProvider, }); const transactionsService = new TransactionsService({ @@ -254,12 +257,6 @@ export type SnapExecutionContext = { confirmationHandler: ConfirmationHandler; transactionScanService: TransactionScanService; transactionExpirationRefresherService: TransactionExpirationRefresherService; - /** - * Core messenger plumbing (routing wired in a follow-up PR). - */ - coreMessenger: CoreMessenger; - remoteFeatureFlagsProvider: RemoteFeatureFlagsProvider; - assetsProvider: AssetsProvider; /** * Handlers */ @@ -292,9 +289,6 @@ const snapContext: SnapExecutionContext = { confirmationHandler, transactionScanService, transactionExpirationRefresherService, - coreMessenger, - remoteFeatureFlagsProvider, - assetsProvider, /** * Handlers */ diff --git a/packages/tron-wallet-snap/src/services/assets/AssetsService.ts b/packages/tron-wallet-snap/src/services/assets/AssetsService.ts index 6ba8e4a3..c29b651f 100644 --- a/packages/tron-wallet-snap/src/services/assets/AssetsService.ts +++ b/packages/tron-wallet-snap/src/services/assets/AssetsService.ts @@ -18,6 +18,7 @@ import type { ILogger } from '../../utils/logger'; import type { State, UnencryptedStateValue } from '../state/State'; import { SnapAssetsAdapter } from './adapters/SnapAssetsAdapter'; import type { AssetsRepository } from './AssetsRepository'; +import { AssetsProvider, RemoteFeatureFlagsProvider } from '@metamask/snap-networks-utils'; /** * Assets domain facade. Currently delegates all behavior to SnapAssetsAdapter @@ -47,6 +48,8 @@ export class AssetsService { priceApiClient: PriceApiClient; tokenApiClient: TokenApiClient; snapClient: SnapClient; + remoteFeatureFlagsProvider: RemoteFeatureFlagsProvider; + assetsProvider: AssetsProvider; }) { this.#snapAdapter = new SnapAssetsAdapter({ logger, diff --git a/packages/tron-wallet-snap/src/types/core-messenger.ts b/packages/tron-wallet-snap/src/types/core-messenger.ts index 6090a068..dd698af8 100644 --- a/packages/tron-wallet-snap/src/types/core-messenger.ts +++ b/packages/tron-wallet-snap/src/types/core-messenger.ts @@ -5,7 +5,6 @@ import type { } from '@metamask/assets-controller'; import type { Messenger } from '@metamask/messenger'; import type { RemoteFeatureFlagControllerGetStateAction } from '@metamask/remote-feature-flag-controller'; -import type { AsyncMessenger } from '@metamask/snaps-sdk'; /** * Namespace for this Snap's Core messenger endowment. @@ -22,13 +21,7 @@ export type CoreMessengerActions = /** * Messenger type passed to `getMessenger` for Core controller actions. */ -export type CoreMessengerMessenger = Messenger< +export type CoreMessenger = Messenger< typeof TRON_WALLET_SNAP_MESSENGER_NAMESPACE, CoreMessengerActions ->; - -/** - * Typed async messenger for Core controller actions available to this Snap via - * `endowment:messenger` / `getMessenger`. - */ -export type CoreMessenger = AsyncMessenger; +>; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index c0b103b1..de86c7ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3312,7 +3312,7 @@ __metadata: languageName: node linkType: hard -"@metamask/snap-networks-utils@workspace:^, @metamask/snap-networks-utils@workspace:packages/snap-networks-utils": +"@metamask/snap-networks-utils@npm:1.0.0, @metamask/snap-networks-utils@workspace:packages/snap-networks-utils": version: 0.0.0-use.local resolution: "@metamask/snap-networks-utils@workspace:packages/snap-networks-utils" dependencies: @@ -3787,7 +3787,7 @@ __metadata: "@metamask/keyring-snap-sdk": "npm:^9.2.1" "@metamask/messenger": "npm:^2.0.0" "@metamask/remote-feature-flag-controller": "npm:4.2.2" - "@metamask/snap-networks-utils": "workspace:^" + "@metamask/snap-networks-utils": "npm:1.0.0" "@metamask/snaps-cli": "npm:^8.4.1" "@metamask/snaps-jest": "npm:^10.2.0" "@metamask/snaps-sdk": "npm:^11.2.0"