@@ -17,11 +17,12 @@ import type {
1717 SnapId ,
1818 ComponentOrElement ,
1919 InterfaceContext ,
20+ FungibleAssetMetadata ,
2021} from '@metamask/snaps-sdk' ;
2122import { ContentType } from '@metamask/snaps-sdk' ;
2223import type { JSXElement } from '@metamask/snaps-sdk/jsx' ;
2324import { getJsonSizeUnsafe , validateJsxLinks } from '@metamask/snaps-utils' ;
24- import type { Json } from '@metamask/utils' ;
25+ import type { CaipAssetType , Json } from '@metamask/utils' ;
2526import { assert , hasProperty } from '@metamask/utils' ;
2627import { castDraft } from 'immer' ;
2728import { 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+
7586export type SnapInterfaceControllerAllowedActions =
7687 | TestOrigin
7788 | MaybeUpdateState
7889 | HasApprovalRequest
7990 | AcceptRequest
80- | GetSnap ;
91+ | GetSnap
92+ | MultichainAssetsControllerGetStateAction ;
8193
8294export 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