Skip to content

Commit 82f5df5

Browse files
committed
Wire up to SnapInterfaceController
1 parent 27a8659 commit 82f5df5

File tree

11 files changed

+411
-57
lines changed

11 files changed

+411
-57
lines changed
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"branches": 93.31,
3-
"functions": 97.05,
4-
"lines": 98.25,
5-
"statements": 97.98
2+
"branches": 93.36,
3+
"functions": 97.06,
4+
"lines": 98.26,
5+
"statements": 97.99
66
}

packages/snaps-controllers/src/interface/SnapInterfaceController.test.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
ContentType,
1010
} from '@metamask/snaps-sdk';
1111
import {
12+
AssetSelector,
1213
Box,
1314
Field,
1415
FileInput,
@@ -159,6 +160,36 @@ describe('SnapInterfaceController', () => {
159160
expect(state).toStrictEqual({ foo: { bar: null } });
160161
});
161162

163+
it('calls the multichain asset controller to construct an asset selector state', async () => {
164+
const rootMessenger = getRootSnapInterfaceControllerMessenger();
165+
const controllerMessenger =
166+
getRestrictedSnapInterfaceControllerMessenger(rootMessenger);
167+
168+
// eslint-disable-next-line no-new
169+
new SnapInterfaceController({
170+
messenger: controllerMessenger,
171+
});
172+
173+
const components = (
174+
<AssetSelector
175+
name="foo"
176+
addresses={['eip155:0:0x1234567890123456789012345678901234567890']}
177+
value="eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f"
178+
/>
179+
);
180+
181+
await rootMessenger.call(
182+
'SnapInterfaceController:createInterface',
183+
MOCK_SNAP_ID,
184+
components,
185+
);
186+
187+
expect(rootMessenger.call).toHaveBeenNthCalledWith(
188+
3,
189+
'MultichainAssetsController:getState',
190+
);
191+
});
192+
162193
it('can create a new interface from JSX', async () => {
163194
const rootMessenger = getRootSnapInterfaceControllerMessenger();
164195
const controllerMessenger =

packages/snaps-controllers/src/interface/SnapInterfaceController.ts

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ import type {
1717
SnapId,
1818
ComponentOrElement,
1919
InterfaceContext,
20+
FungibleAssetMetadata,
2021
} from '@metamask/snaps-sdk';
2122
import { ContentType } from '@metamask/snaps-sdk';
2223
import type { JSXElement } from '@metamask/snaps-sdk/jsx';
2324
import { getJsonSizeUnsafe, validateJsxLinks } from '@metamask/snaps-utils';
24-
import type { Json } from '@metamask/utils';
25+
import type { CaipAssetType, Json } from '@metamask/utils';
2526
import { assert, hasProperty } from '@metamask/utils';
2627
import { castDraft } from 'immer';
2728
import { nanoid } from 'nanoid';
@@ -72,12 +73,23 @@ export type SnapInterfaceControllerGetStateAction = ControllerGetStateAction<
7273
SnapInterfaceControllerState
7374
>;
7475

76+
type MultichainAssetsControllerGetStateAction = ControllerGetStateAction<
77+
'MultichainAssetsController',
78+
{
79+
assetsMetadata: {
80+
[asset: CaipAssetType]: FungibleAssetMetadata;
81+
};
82+
accountsAssets: { [account: string]: CaipAssetType[] };
83+
}
84+
>;
85+
7586
export type SnapInterfaceControllerAllowedActions =
7687
| TestOrigin
7788
| MaybeUpdateState
7889
| HasApprovalRequest
7990
| AcceptRequest
80-
| GetSnap;
91+
| GetSnap
92+
| MultichainAssetsControllerGetStateAction;
8193

8294
export type SnapInterfaceControllerActions =
8395
| CreateInterface
@@ -249,7 +261,9 @@ export class SnapInterfaceController extends BaseController<
249261
validateInterfaceContext(context);
250262

251263
const id = nanoid();
252-
const componentState = constructState({}, element);
264+
const componentState = constructState({}, element, {
265+
getAssetMetadata: this.#getAssetMetadata.bind(this),
266+
});
253267

254268
this.update((draftState) => {
255269
// @ts-expect-error - TS2589: Type instantiation is excessively deep and
@@ -299,7 +313,9 @@ export class SnapInterfaceController extends BaseController<
299313
validateInterfaceContext(context);
300314

301315
const oldState = this.state.interfaces[id].state;
302-
const newState = constructState(oldState, element);
316+
const newState = constructState(oldState, element, {
317+
getAssetMetadata: this.#getAssetMetadata.bind(this),
318+
});
303319

304320
this.update((draftState) => {
305321
draftState.interfaces[id].state = newState;
@@ -426,6 +442,15 @@ export class SnapInterfaceController extends BaseController<
426442
);
427443
}
428444

445+
#getAssetMetadata(assetId: CaipAssetType) {
446+
// TODO: Introduce an action in MultichainAssetsController to get a specific asset metadata.
447+
const assets = this.messagingSystem.call(
448+
'MultichainAssetsController:getState',
449+
);
450+
451+
return assets.assetsMetadata[assetId];
452+
}
453+
429454
/**
430455
* Utility function to validate the components of an interface.
431456
* Throws if something is invalid.

0 commit comments

Comments
 (0)