Skip to content

Commit dc2ee18

Browse files
feat(solana-wallet-snap): add CoreAssetsAdapter and mapControllerAsset
Introduce CoreAssetsAdapter with AssetsController reads and snap-owned publish helpers, plus mapControllerAsset / isSnapOwnedAsset. Wire Core messenger plumbing and store the adapter on AssetsService unused pending routing. Co-authored-by: Ulisses Ferreira <ulisses@hey.com>
1 parent c0b1fa8 commit dc2ee18

15 files changed

Lines changed: 1026 additions & 3 deletions

packages/solana-wallet-snap/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
12+
- Add `CoreAssetsAdapter` and `mapControllerAsset` for AssetsController integration (wired unused until routing lands), including Core messenger plumbing (`coreMessenger`, `RemoteFeatureFlagsProvider`, `AssetsProvider`). ([#122](https://github.com/MetaMask/internal-snaps/pull/122))
13+
1014
### Changed
1115

1216
- Extract Snap-owned assets domain logic into `SnapAssetsAdapter`; `AssetsService` is a thin facade that delegates metadata, market data, fetch, persist, and account asset reads through the adapter (no Core routing yet). ([#121](https://github.com/MetaMask/internal-snaps/pull/121))

packages/solana-wallet-snap/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,14 @@
5252
},
5353
"devDependencies": {
5454
"@jest/globals": "^29.5.0",
55+
"@metamask/assets-controller": "^13.0.0",
5556
"@metamask/auto-changelog": "^6.1.1",
5657
"@metamask/key-tree": "^10.1.1",
5758
"@metamask/keyring-api": "^23.7.0",
5859
"@metamask/keyring-snap-sdk": "^9.2.1",
60+
"@metamask/messenger": "^2.0.0",
61+
"@metamask/remote-feature-flag-controller": "^5.0.0",
62+
"@metamask/snap-networks-utils": "^1.0.0",
5963
"@metamask/snaps-cli": "^8.4.1",
6064
"@metamask/snaps-jest": "^10.2.0",
6165
"@metamask/snaps-sdk": "^11.2.0",

packages/solana-wallet-snap/snap.manifest.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,15 @@
8888
"snap_manageAccounts": {},
8989
"snap_manageState": {},
9090
"snap_dialog": {},
91-
"snap_getPreferences": {}
91+
"snap_getPreferences": {},
92+
"endowment:messenger": {
93+
"actions": [
94+
"RemoteFeatureFlagController:getState",
95+
"AssetsController:getAccountAssetByID",
96+
"AssetsController:getAccountAssetsByIDs",
97+
"AssetsController:getAccountAssetsByScope"
98+
]
99+
}
92100
},
93101
"platformVersion": "11.2.0",
94102
"manifestVersion": "0.1"

packages/solana-wallet-snap/src/core/services/assets/AssetsService.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { mockLogger } from '../mocks/logger';
2424
import { createMockConnection } from '../mocks/mockConnection';
2525
import { MOCK_SOLANA_RPC_GET_TOKEN_ACCOUNTS_BY_OWNER_RESPONSE } from '../mocks/mockSolanaRpcResponses';
2626
import type { TokenPricesService } from '../token-prices/TokenPrices';
27+
import { CoreAssetsAdapter } from './adapters/CoreAssetsAdapter';
2728
import { SnapAssetsAdapter } from './adapters/SnapAssetsAdapter';
2829
import type { AssetsRepository } from './AssetsRepository';
2930
import { AssetsService } from './AssetsService';
@@ -101,8 +102,19 @@ describe('AssetsService', () => {
101102
nftApiClient: mockNftApiClient,
102103
});
103104

105+
const coreAdapter = new CoreAssetsAdapter({
106+
getAccountAssetByID: jest.fn().mockResolvedValue(null),
107+
getAccountAssetsByIDs: jest.fn().mockResolvedValue({}),
108+
getAccountAssetsByScope: jest.fn().mockResolvedValue({}),
109+
findAccountById: mockAccountsService.findById.bind(mockAccountsService),
110+
getActiveNetworks: mockConfigProvider.getActiveNetworks.bind(
111+
mockConfigProvider,
112+
),
113+
});
114+
104115
assetsService = new AssetsService({
105116
snapAdapter: snapAssetsAdapter,
117+
coreAdapter,
106118
});
107119
});
108120

packages/solana-wallet-snap/src/core/services/assets/AssetsService.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,33 @@ import type { FungibleAssetMarketData } from '@metamask/snaps-sdk';
33
import type { CaipAssetType, CaipChainId } from '@metamask/utils';
44

55
import type { AssetEntity, SolanaKeyringAccount } from '../../../entities';
6+
import type { CoreAssetsAdapter } from './adapters/CoreAssetsAdapter';
67
import { SnapAssetsAdapter } from './adapters/SnapAssetsAdapter';
78
import type { AssetMetadata } from './types';
89

910
/**
1011
* Assets domain facade. Currently delegates all behavior to SnapAssetsAdapter
11-
* (legacy snap-owned reads/writes).
12+
* (legacy snap-owned reads/writes). Core adapter is initialized for upcoming
13+
* routing without changing callers.
1214
*/
1315
export class AssetsService {
1416
readonly #snapAdapter: SnapAssetsAdapter;
1517

18+
// Initialized for upcoming Core routing; not read until the migration PR lands.
19+
// eslint-disable-next-line no-unused-private-class-members -- reserved adapter slot
20+
readonly #coreAdapter: CoreAssetsAdapter;
21+
1622
readonly cacheTtlsMilliseconds: typeof SnapAssetsAdapter.cacheTtlsMilliseconds;
1723

18-
constructor({ snapAdapter }: { snapAdapter: SnapAssetsAdapter }) {
24+
constructor({
25+
snapAdapter,
26+
coreAdapter,
27+
}: {
28+
snapAdapter: SnapAssetsAdapter;
29+
coreAdapter: CoreAssetsAdapter;
30+
}) {
1931
this.#snapAdapter = snapAdapter;
32+
this.#coreAdapter = coreAdapter;
2033
this.cacheTtlsMilliseconds = SnapAssetsAdapter.cacheTtlsMilliseconds;
2134
}
2235

0 commit comments

Comments
 (0)