Skip to content

Commit d194133

Browse files
Add result transformers
1 parent a39b81c commit d194133

File tree

1 file changed

+64
-1
lines changed

1 file changed

+64
-1
lines changed

packages/snaps-controllers/src/snaps/SnapController.ts

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,19 @@ import {
4141
getRpcCaveatOrigins,
4242
processSnapPermissions,
4343
getEncryptionEntropy,
44+
getChainIdsCaveat,
4445
} from '@metamask/snaps-rpc-methods';
4546
import 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';
5258
import {
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';
101112
import {
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

Comments
 (0)