@@ -41,13 +41,19 @@ import {
4141 getRpcCaveatOrigins ,
4242 processSnapPermissions ,
4343 getEncryptionEntropy ,
44+ getChainIdsCaveat ,
4445} from '@metamask/snaps-rpc-methods' ;
4546import type {
4647 RequestSnapsParams ,
4748 RequestSnapsResult ,
4849 SnapId ,
4950 ComponentOrElement ,
5051 ContentType ,
52+ OnAssetsLookupResponse ,
53+ FungibleAssetMetadata ,
54+ OnAssetsConversionResponse ,
55+ OnAssetsConversionArguments ,
56+ AssetConversion ,
5157} from '@metamask/snaps-sdk' ;
5258import {
5359 AuxiliaryFileEncoding ,
@@ -97,7 +103,12 @@ import {
97103 MAX_FILE_SIZE ,
98104 OnSettingsPageResponseStruct ,
99105} from '@metamask/snaps-utils' ;
100- import type { Json , NonEmptyArray , SemVerRange } from '@metamask/utils' ;
106+ import type {
107+ Json ,
108+ NonEmptyArray ,
109+ SemVerRange ,
110+ CaipAssetType ,
111+ } from '@metamask/utils' ;
101112import {
102113 assert ,
103114 assertIsJsonRpcRequest ,
@@ -3513,6 +3524,7 @@ export class SnapController extends BaseController<
35133524 const transformedResult = await this . #transformSnapRpcRequestResult(
35143525 snapId ,
35153526 handlerType ,
3527+ request ,
35163528 result ,
35173529 ) ;
35183530
@@ -3574,12 +3586,14 @@ export class SnapController extends BaseController<
35743586 *
35753587 * @param snapId - The snap ID of the snap that produced the result.
35763588 * @param handlerType - The handler type that produced the result.
3589+ * @param request - The request that returned the result.
35773590 * @param result - The result.
35783591 * @returns The transformed result if applicable, otherwise the original result.
35793592 */
35803593 async #transformSnapRpcRequestResult(
35813594 snapId : SnapId ,
35823595 handlerType : HandlerType ,
3596+ request : Record < string , unknown > ,
35833597 result : unknown ,
35843598 ) {
35853599 switch ( handlerType ) {
@@ -3602,6 +3616,55 @@ export class SnapController extends BaseController<
36023616 }
36033617 return result ;
36043618 }
3619+ case HandlerType . OnAssetsLookup : {
3620+ // We know the permissions are guaranteed to be set here.
3621+ const permissions = this . messagingSystem . call (
3622+ 'PermissionController:getPermissions' ,
3623+ snapId ,
3624+ ) as SubjectPermissions < PermissionConstraint > ;
3625+
3626+ const permission = permissions [ SnapEndowments . Assets ] ;
3627+ const scopes = getChainIdsCaveat ( permission ) as string [ ] ;
3628+
3629+ // We can cast since the result has already been validated.
3630+ const { assets } = result as OnAssetsLookupResponse ;
3631+ const filteredAssets = Object . keys ( assets ) . reduce <
3632+ Record < CaipAssetType , FungibleAssetMetadata >
3633+ > ( ( accumulator , assetType ) => {
3634+ const castAssetType = assetType as CaipAssetType ;
3635+ const isValid = scopes . some ( ( scope ) =>
3636+ castAssetType . startsWith ( scope ) ,
3637+ ) ;
3638+ // Filter out assets for scopes the Snap hasn't registered for.
3639+ if ( isValid ) {
3640+ accumulator [ castAssetType ] = assets [ castAssetType ] ;
3641+ }
3642+ return accumulator ;
3643+ } , { } ) ;
3644+ return { assets : filteredAssets } ;
3645+ }
3646+ case HandlerType . OnAssetsConversion : {
3647+ // We can cast since the request and result have already been validated.
3648+ const { params : requestedParams } = request as {
3649+ params : OnAssetsConversionArguments ;
3650+ } ;
3651+ const { conversions : requestedConversions } = requestedParams ;
3652+
3653+ const { conversionRates } = result as OnAssetsConversionResponse ;
3654+
3655+ const filteredConversionRates = requestedConversions . reduce <
3656+ Record < CaipAssetType , Record < CaipAssetType , AssetConversion > >
3657+ > ( ( accumulator , conversion ) => {
3658+ const rate = conversionRates [ conversion . from ] ?. [ conversion . to ] ;
3659+ // Only include rates that were actually requested.
3660+ if ( rate ) {
3661+ accumulator [ conversion . from ] ??= { } ;
3662+ accumulator [ conversion . from ] [ conversion . to ] = rate ;
3663+ }
3664+ return accumulator ;
3665+ } , { } ) ;
3666+ return { conversionRates : filteredConversionRates } ;
3667+ }
36053668 default :
36063669 return result ;
36073670 }
0 commit comments