From 621606f8c67adb47cbb1755f54e177f1e565da0c Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Thu, 3 Jul 2025 22:10:06 -0700 Subject: [PATCH 01/18] WIP some events created, but will remove in next commit --- .../src/insights/SnapInsightsController.ts | 7 +++ .../src/test-utils/controller.ts | 1 + .../src/types/controllers.ts | 5 ++ packages/snaps-controllers/src/utils.test.ts | 1 + packages/snaps-controllers/src/utils.ts | 1 + .../src/endowments/activity-item-insight.ts | 51 ++++++++++++++++++ .../snaps-rpc-methods/src/endowments/enum.ts | 1 + .../src/types/handlers/activity-item.ts | 54 +++++++++++++++++++ .../snaps-sdk/src/types/handlers/index.ts | 1 + packages/snaps-utils/src/handlers/exports.ts | 11 ++++ packages/snaps-utils/src/handlers/types.ts | 1 + 11 files changed, 134 insertions(+) create mode 100644 packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts create mode 100644 packages/snaps-sdk/src/types/handlers/activity-item.ts diff --git a/packages/snaps-controllers/src/insights/SnapInsightsController.ts b/packages/snaps-controllers/src/insights/SnapInsightsController.ts index f1a22a2acd..71dca8cbfc 100644 --- a/packages/snaps-controllers/src/insights/SnapInsightsController.ts +++ b/packages/snaps-controllers/src/insights/SnapInsightsController.ts @@ -24,6 +24,7 @@ import { getRunnableSnaps } from '../snaps'; import type { TransactionControllerUnapprovedTransactionAddedEvent, TransactionMeta, + TransactionControllerActivityItemViewedEvent, SignatureStateChange, SignatureControllerState, StateSignature, @@ -56,6 +57,7 @@ export type SnapInsightControllerEvents = SnapInsightControllerStateChangeEvent; export type SnapInsightsControllerAllowedEvents = | TransactionControllerUnapprovedTransactionAddedEvent | TransactionControllerTransactionStatusUpdatedEvent + | TransactionControllerActivityItemViewedEvent | SignatureStateChange; export type SnapInsightsControllerMessenger = RestrictedMessenger< @@ -120,6 +122,11 @@ export class SnapInsightsController extends BaseController< 'SignatureController:stateChange', this.#handleSignatureStateChange.bind(this), ); + + this.messagingSystem.subscribe( + 'ActivityController:activityItemViewed', + this.#handleViewActivityItem.bind(this), + ); } /** diff --git a/packages/snaps-controllers/src/test-utils/controller.ts b/packages/snaps-controllers/src/test-utils/controller.ts index df8aee00f5..de353370ab 100644 --- a/packages/snaps-controllers/src/test-utils/controller.ts +++ b/packages/snaps-controllers/src/test-utils/controller.ts @@ -895,6 +895,7 @@ export const getRestrictedSnapInsightsControllerMessenger = ( >({ name: 'SnapInsightsController', allowedEvents: [ + 'TransactionController:activityItemViewed', 'TransactionController:unapprovedTransactionAdded', 'TransactionController:transactionStatusUpdated', 'SignatureController:stateChange', diff --git a/packages/snaps-controllers/src/types/controllers.ts b/packages/snaps-controllers/src/types/controllers.ts index 1d24aab183..6bbc7f406a 100644 --- a/packages/snaps-controllers/src/types/controllers.ts +++ b/packages/snaps-controllers/src/types/controllers.ts @@ -135,6 +135,11 @@ export type TransactionControllerTransactionStatusUpdatedEvent = { ]; }; +export type TransactionControllerActivityItemViewedEvent = { + type: `TransactionController:activityItemViewed`; + payload: [transactionMeta: TransactionMeta]; +}; + export type StateSignatureParams = { from: string; origin?: string; diff --git a/packages/snaps-controllers/src/utils.test.ts b/packages/snaps-controllers/src/utils.test.ts index cc0a320bc9..3fe59a4f62 100644 --- a/packages/snaps-controllers/src/utils.test.ts +++ b/packages/snaps-controllers/src/utils.test.ts @@ -233,6 +233,7 @@ describe('TRACKABLE_HANDLERS', () => { HandlerType.OnRpcRequest, HandlerType.OnSignature, HandlerType.OnTransaction, + HandlerType.OnViewActivityItem, HandlerType.OnUpdate, ]); }); diff --git a/packages/snaps-controllers/src/utils.ts b/packages/snaps-controllers/src/utils.ts index 1016d43845..6620794ea2 100644 --- a/packages/snaps-controllers/src/utils.ts +++ b/packages/snaps-controllers/src/utils.ts @@ -387,6 +387,7 @@ export const TRACKABLE_HANDLERS = Object.freeze([ HandlerType.OnRpcRequest, HandlerType.OnSignature, HandlerType.OnTransaction, + HandlerType.OnViewActivityItem, HandlerType.OnUpdate, ] as const); diff --git a/packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts b/packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts new file mode 100644 index 0000000000..22a98e7b2e --- /dev/null +++ b/packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts @@ -0,0 +1,51 @@ +import type { + PermissionSpecificationBuilder, + EndowmentGetterParams, + ValidPermissionSpecification, + PermissionValidatorConstraint, +} from '@metamask/permission-controller'; +import { PermissionType, SubjectType } from '@metamask/permission-controller'; +import { SnapCaveatType } from '@metamask/snaps-utils'; +import type { NonEmptyArray } from '@metamask/utils'; + +import { createGenericPermissionValidator } from './caveats'; +import { SnapEndowments } from './enum'; + +const permissionName = SnapEndowments.ActivityItemInsight; + +type ActivityItemInsightEndowmentSpecification = ValidPermissionSpecification<{ + permissionType: PermissionType.Endowment; + targetName: typeof permissionName; + endowmentGetter: (_options?: EndowmentGetterParams) => null; + allowedCaveats: Readonly> | null; + validator: PermissionValidatorConstraint; +}>; + +/** + * `endowment:activity-item-insight` returns nothing; it is intended to be used as a flag + * by the extension to detect whether the snap has the capability to show information on the transaction confirmation screen. + * + * @param _builderOptions - Optional specification builder options. + * @returns The specification for the transaction-insight endowment. + */ +const specificationBuilder: PermissionSpecificationBuilder< + PermissionType.Endowment, + any, + ActivityItemInsightEndowmentSpecification +> = (_builderOptions?: unknown) => { + return { + permissionType: PermissionType.Endowment, + targetName: permissionName, + allowedCaveats: [SnapCaveatType.MaxRequestTime], + endowmentGetter: (_getterOptions?: EndowmentGetterParams) => null, + validator: createGenericPermissionValidator([ + { type: SnapCaveatType.MaxRequestTime, optional: true }, + ]), + subjectTypes: [SubjectType.Snap], + }; +}; + +export const activityItemInsightEndowmentBuilder = Object.freeze({ + targetName: permissionName, + specificationBuilder, +} as const); diff --git a/packages/snaps-rpc-methods/src/endowments/enum.ts b/packages/snaps-rpc-methods/src/endowments/enum.ts index e3f24b4de5..f17eca912d 100644 --- a/packages/snaps-rpc-methods/src/endowments/enum.ts +++ b/packages/snaps-rpc-methods/src/endowments/enum.ts @@ -2,6 +2,7 @@ export enum SnapEndowments { NetworkAccess = 'endowment:network-access', SignatureInsight = 'endowment:signature-insight', TransactionInsight = 'endowment:transaction-insight', + ActivityItemInsight = 'endowment:activity-item-insight', Cronjob = 'endowment:cronjob', EthereumProvider = 'endowment:ethereum-provider', Rpc = 'endowment:rpc', diff --git a/packages/snaps-sdk/src/types/handlers/activity-item.ts b/packages/snaps-sdk/src/types/handlers/activity-item.ts new file mode 100644 index 0000000000..ffa813ebe3 --- /dev/null +++ b/packages/snaps-sdk/src/types/handlers/activity-item.ts @@ -0,0 +1,54 @@ +import type { ComponentOrElement } from '..'; + +/** + * The `onViewActivityItem` handler. This is called when a user views an activity item. + * + * @param params - The activity item parameters. + * @returns The response from the handler. + */ +export type OnViewActivityItemHandler = ( + params: OnViewActivityItemParams, +) => Promise; + +export type OnViewActivityItemParams = { + /** + * The activity item data. + */ + activity: { + id: string; + hash: string; + type: string; + timestamp: number; + value?: string; + from?: string; + to?: string; + [key: string]: unknown; + }; + + /** + * The chain ID of the network. + */ + chainId: string; + + /** + * The origin of the activity view request. + */ + origin?: string; +}; + +export type OnViewActivityItemResponse = { + /** + * A unique identifier for the insight interface. + */ + id?: string; + + /** + * The severity level of the insight. + */ + severity?: 'critical' | 'warning' | 'info'; + + /** + * Optional content to display. + */ + content?: ComponentOrElement; +}; diff --git a/packages/snaps-sdk/src/types/handlers/index.ts b/packages/snaps-sdk/src/types/handlers/index.ts index 74eff8227f..d50d301cc6 100644 --- a/packages/snaps-sdk/src/types/handlers/index.ts +++ b/packages/snaps-sdk/src/types/handlers/index.ts @@ -15,3 +15,4 @@ export type * from './signature'; export * from './user-input'; export type * from './settings-page'; export type * from './web-socket-event'; +export type * from './activity-item'; diff --git a/packages/snaps-utils/src/handlers/exports.ts b/packages/snaps-utils/src/handlers/exports.ts index f817f2436e..2046a17551 100644 --- a/packages/snaps-utils/src/handlers/exports.ts +++ b/packages/snaps-utils/src/handlers/exports.ts @@ -20,6 +20,8 @@ import type { OnWebSocketEventHandler, } from '@metamask/snaps-sdk'; +import { OnViewActivityItemHandler } from '../../../snaps-sdk/src/types/handlers/activity-item'; // change to npm + import { HandlerType } from './types'; export const SNAP_EXPORTS = { @@ -37,6 +39,15 @@ export const SNAP_EXPORTS = { return typeof snapExport === 'function'; }, }, + [HandlerType.OnViewActivityItem]: { + type: HandlerType.OnViewActivityItem, + required: true, + validator: ( + snapExport: unknown, + ): snapExport is OnViewActivityItemHandler => { + return typeof snapExport === 'function'; + }, + }, [HandlerType.OnCronjob]: { type: HandlerType.OnCronjob, required: true, diff --git a/packages/snaps-utils/src/handlers/types.ts b/packages/snaps-utils/src/handlers/types.ts index d6690ac0f8..889fb1b71d 100644 --- a/packages/snaps-utils/src/handlers/types.ts +++ b/packages/snaps-utils/src/handlers/types.ts @@ -32,6 +32,7 @@ export enum HandlerType { OnRpcRequest = 'onRpcRequest', OnSignature = 'onSignature', OnTransaction = 'onTransaction', + OnViewActivityItem = 'onViewActivityItem', OnCronjob = 'onCronjob', OnInstall = 'onInstall', OnUpdate = 'onUpdate', From 2c9033f4c9b7dced4514e6e1da839d584a5f0845 Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Fri, 4 Jul 2025 09:23:09 -0700 Subject: [PATCH 02/18] Implement @handleViewActivityItem on SnapInsightsController --- .../src/insights/SnapInsightsController.ts | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/packages/snaps-controllers/src/insights/SnapInsightsController.ts b/packages/snaps-controllers/src/insights/SnapInsightsController.ts index 71dca8cbfc..c230a3d7b6 100644 --- a/packages/snaps-controllers/src/insights/SnapInsightsController.ts +++ b/packages/snaps-controllers/src/insights/SnapInsightsController.ts @@ -124,7 +124,7 @@ export class SnapInsightsController extends BaseController< ); this.messagingSystem.subscribe( - 'ActivityController:activityItemViewed', + 'TransactionController:activityItemViewed', this.#handleViewActivityItem.bind(this), ); } @@ -166,6 +166,47 @@ export class SnapInsightsController extends BaseController< }, []); } + /** + * Handle a newly added unapproved transaction. + * This function fetches insights from all available Snaps + * and populates the insights state blob with the responses. + * + * @param transactionMeta - The transaction object. + */ + #handleViewActivityItem(transactionMeta: TransactionMeta) { + const { id, chainId /*, txParams */ } = transactionMeta; + // This assumes that the transactions are EVM-compatible for now. + const caipChainId = `eip155:${hexToBigInt(chainId).toString(10)}`; + + const snaps = this.#getSnapsWithPermission( + SnapEndowments.ActivityItemInsight, + ); + + snaps.forEach(({ snapId /*, permission */ }) => { + this.update((state) => { + state.insights[id] ??= {}; + state.insights[id][snapId] = { snapId, loading: true }; + }); + + this.#handleSnapRequest({ + snapId, + handler: HandlerType.OnViewActivityItem, + params: { + transaction: transactionMeta, + chainId: caipChainId, + }, + }) + .then((response) => + this.#handleSnapResponse({ + id, + snapId, + response: response as Record, + }), + ) + .catch((error) => this.#handleSnapResponse({ id, snapId, error })); + }); + } + /** * Handle a newly added unapproved transaction. * This function fetches insights from all available Snaps @@ -363,7 +404,10 @@ export class SnapInsightsController extends BaseController< params, }: { snapId: SnapId; - handler: HandlerType.OnTransaction | HandlerType.OnSignature; + handler: + | HandlerType.OnTransaction + | HandlerType.OnSignature + | HandlerType.OnViewActivityItem; params: Record; }) { return this.messagingSystem.call('SnapController:handleRequest', { From 957a3729812b865eac093faa848c48af6da62230 Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Fri, 4 Jul 2025 13:43:41 -0700 Subject: [PATCH 03/18] New snaps functionality almost building, pending build issues --- .../src/common/commands.ts | 8 ++ .../src/common/validation.ts | 22 +++++ .../src/endowments/activity-item-insight.ts | 94 ++++++++++++++++++- .../snaps-rpc-methods/src/endowments/index.ts | 4 + 4 files changed, 127 insertions(+), 1 deletion(-) diff --git a/packages/snaps-execution-environments/src/common/commands.ts b/packages/snaps-execution-environments/src/common/commands.ts index 31b9640d7c..0b02d24aa8 100644 --- a/packages/snaps-execution-environments/src/common/commands.ts +++ b/packages/snaps-execution-environments/src/common/commands.ts @@ -21,6 +21,7 @@ import { assertIsOnAssetHistoricalPriceRequestArguments, assertIsOnWebSocketEventArguments, assertIsOnAssetsMarketDataRequestArguments, + assertIsOnViewActivityItemRequestArguments, } from './validation'; export type CommandMethodsMapping = { @@ -56,6 +57,13 @@ export function getHandlerArguments( transactionOrigin, }; } + + case HandlerType.OnViewActivityItem: { + assertIsOnViewActivityItemRequestArguments(request.params); + const { transactionMeta } = request.params; + return { transactionMeta }; + } + case HandlerType.OnSignature: { assertIsOnSignatureRequestArguments(request.params); diff --git a/packages/snaps-execution-environments/src/common/validation.ts b/packages/snaps-execution-environments/src/common/validation.ts index b23b8d4b90..05eafa90df 100644 --- a/packages/snaps-execution-environments/src/common/validation.ts +++ b/packages/snaps-execution-environments/src/common/validation.ts @@ -171,6 +171,28 @@ export function assertIsOnTransactionRequestArguments( assertRequestArguments(value, OnTransactionRequestArgumentsStruct); } +export const OnViewActivityItemRequestArgumentsStruct = object({ + transactionMeta: record(string(), JsonStruct), +}); + +export type OnViewActivityItemRequestArguments = Infer< + typeof OnViewActivityItemRequestArgumentsStruct +>; + +/** + * Asserts that the given value is a valid {@link OnViewActivityItemRequestArguments} + * object. + * + * @param value - The value to validate. + * @throws If the value is not a valid {@link OnViewActivityItemRequestArguments} + * object. + */ +export function assertIsOnViewActivityItemRequestArguments( + value: unknown, +): asserts value is OnViewActivityItemRequestArguments { + assertRequestArguments(value, OnViewActivityItemRequestArgumentsStruct); +} + export const OnSignatureRequestArgumentsStruct = object({ signature: record(string(), JsonStruct), signatureOrigin: nullable(string()), diff --git a/packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts b/packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts index 22a98e7b2e..d891aed1aa 100644 --- a/packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts +++ b/packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts @@ -3,10 +3,15 @@ import type { EndowmentGetterParams, ValidPermissionSpecification, PermissionValidatorConstraint, + PermissionConstraint, + CaveatSpecificationConstraint, + Caveat, } from '@metamask/permission-controller'; import { PermissionType, SubjectType } from '@metamask/permission-controller'; +import { rpcErrors } from '@metamask/rpc-errors'; import { SnapCaveatType } from '@metamask/snaps-utils'; -import type { NonEmptyArray } from '@metamask/utils'; +import type { Json, NonEmptyArray } from '@metamask/utils'; +import { assert, hasProperty, isObject, isPlainObject } from '@metamask/utils'; import { createGenericPermissionValidator } from './caveats'; import { SnapEndowments } from './enum'; @@ -49,3 +54,90 @@ export const activityItemInsightEndowmentBuilder = Object.freeze({ targetName: permissionName, specificationBuilder, } as const); + +/** + * Validates the type of the caveat value. + * + * @param caveat - The caveat to validate. + * @throws If the caveat value is invalid. + */ +function validateCaveat(caveat: Caveat): void { + if (!hasProperty(caveat, 'value') || !isPlainObject(caveat)) { + throw rpcErrors.invalidParams({ + message: 'Expected a plain object.', + }); + } + + const { value } = caveat; + + assert( + typeof value === 'boolean', + 'Expected caveat value to have type "boolean"', + ); +} + +/** + * Map a raw value from the `initialPermissions` to a caveat specification. + * Note that this function does not do any validation, that's handled by the + * PermissionsController when the permission is requested. + * + * @param value - The raw value from the `initialPermissions`. + * @returns The caveat specification. + */ +export function getActivityItemInsightCaveatMapper( + value: Json, +): Pick { + if ( + !value || + !isObject(value) || + (isObject(value) && Object.keys(value).length === 0) + ) { + return { caveats: null }; + } + return { + caveats: [ + { + type: SnapCaveatType.TransactionOrigin, + value: + hasProperty(value, 'allowTransactionOrigin') && + (value.allowTransactionOrigin as boolean), + }, + ], + }; +} + +/** + * Getter function to get the transaction origin caveat from a permission. + * + * This does basic validation of the caveat, but does not validate the type or + * value of the namespaces object itself, as this is handled by the + * `PermissionsController` when the permission is requested. + * + * @param permission - The permission to get the transaction origin caveat from. + * @returns The transaction origin, or `null` if the permission does not have a + * transaction origin caveat. + */ +export function getActivityItemInsightCaveat( + permission?: PermissionConstraint, +): boolean | null { + if (!permission?.caveats) { + return null; + } + + assert(permission.caveats.length === 1); + assert(permission.caveats[0].type === SnapCaveatType.TransactionOrigin); + + const caveat = permission.caveats[0] as Caveat; + + return caveat.value ?? null; +} + +export const activityItemInsightCaveatSpecifications: Record< + SnapCaveatType.TransactionOrigin, + CaveatSpecificationConstraint +> = { + [SnapCaveatType.TransactionOrigin]: Object.freeze({ + type: SnapCaveatType.TransactionOrigin, + validator: (caveat: Caveat) => validateCaveat(caveat), + }), +}; diff --git a/packages/snaps-rpc-methods/src/endowments/index.ts b/packages/snaps-rpc-methods/src/endowments/index.ts index 843a8b5db2..b8170cfe96 100644 --- a/packages/snaps-rpc-methods/src/endowments/index.ts +++ b/packages/snaps-rpc-methods/src/endowments/index.ts @@ -2,6 +2,7 @@ import type { PermissionConstraint } from '@metamask/permission-controller'; import { HandlerType } from '@metamask/snaps-utils'; import type { Json } from '@metamask/utils'; +import { activityItemInsightEndowmentBuilder } from './activity-item-insight'; import { assetsEndowmentBuilder, getAssetsCaveatMapper } from './assets'; import { createMaxRequestTimeMapper, @@ -117,6 +118,8 @@ export const endowmentCaveatMappers: Record< export const handlerEndowments: Record = { [HandlerType.OnRpcRequest]: rpcEndowmentBuilder.targetName, [HandlerType.OnTransaction]: transactionInsightEndowmentBuilder.targetName, + [HandlerType.OnViewActivityItem]: + activityItemInsightEndowmentBuilder.targetName, [HandlerType.OnCronjob]: cronjobEndowmentBuilder.targetName, [HandlerType.OnNameLookup]: nameLookupEndowmentBuilder.targetName, [HandlerType.OnInstall]: lifecycleHooksEndowmentBuilder.targetName, @@ -141,6 +144,7 @@ export { getRpcCaveatOrigins } from './rpc'; export { getSignatureOriginCaveat } from './signature-insight'; export { getTransactionOriginCaveat } from './transaction-insight'; export { getChainIdsCaveat, getLookupMatchersCaveat } from './name-lookup'; +export { getActivityItemInsightCaveat } from './activity-item-insight'; export { getKeyringCaveatOrigins } from './keyring'; export { getMaxRequestTimeCaveat } from './caveats'; export { getCronjobCaveatJobs } from './cronjob'; From a06924c894a2268ae2c20df3016cc13047647b11 Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Fri, 4 Jul 2025 14:40:54 -0700 Subject: [PATCH 04/18] Add missing handler and associated import (until we use npm) --- packages/snaps-utils/src/handlers/activity-item.ts | 3 +++ packages/snaps-utils/src/handlers/exports.ts | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 packages/snaps-utils/src/handlers/activity-item.ts diff --git a/packages/snaps-utils/src/handlers/activity-item.ts b/packages/snaps-utils/src/handlers/activity-item.ts new file mode 100644 index 0000000000..c1ec77ad02 --- /dev/null +++ b/packages/snaps-utils/src/handlers/activity-item.ts @@ -0,0 +1,3 @@ +import { OnTransactionResponseStruct } from './transaction'; + +export const OnViewActivityItemResponseStruct = OnTransactionResponseStruct; diff --git a/packages/snaps-utils/src/handlers/exports.ts b/packages/snaps-utils/src/handlers/exports.ts index 2046a17551..13c3c23646 100644 --- a/packages/snaps-utils/src/handlers/exports.ts +++ b/packages/snaps-utils/src/handlers/exports.ts @@ -20,9 +20,8 @@ import type { OnWebSocketEventHandler, } from '@metamask/snaps-sdk'; -import { OnViewActivityItemHandler } from '../../../snaps-sdk/src/types/handlers/activity-item'; // change to npm - import { HandlerType } from './types'; +import type { OnViewActivityItemHandler } from '../../../snaps-sdk/src/types/handlers/activity-item'; export const SNAP_EXPORTS = { [HandlerType.OnRpcRequest]: { From 980ed4f37ef75998580d1318d47e36c89abc7543 Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Sun, 6 Jul 2025 22:56:52 -0700 Subject: [PATCH 05/18] =?UTF-8?q?onViewActivityItem=20insights=20working!?= =?UTF-8?q?=20=F0=9F=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/insights/SnapInsightsController.ts | 46 ++++++++++++++----- .../src/types/controllers.ts | 2 +- .../src/endowments/activity-item-insight.ts | 24 ++++++---- .../snaps-rpc-methods/src/endowments/index.ts | 14 +++++- .../src/types/handlers/activity-item.ts | 2 +- packages/snaps-sdk/src/types/permissions.ts | 4 ++ packages/snaps-utils/src/caveats.ts | 5 ++ .../snaps-utils/src/manifest/validation.ts | 8 ++++ 8 files changed, 80 insertions(+), 25 deletions(-) diff --git a/packages/snaps-controllers/src/insights/SnapInsightsController.ts b/packages/snaps-controllers/src/insights/SnapInsightsController.ts index c230a3d7b6..bc7b6af458 100644 --- a/packages/snaps-controllers/src/insights/SnapInsightsController.ts +++ b/packages/snaps-controllers/src/insights/SnapInsightsController.ts @@ -166,15 +166,20 @@ export class SnapInsightsController extends BaseController< }, []); } - /** - * Handle a newly added unapproved transaction. - * This function fetches insights from all available Snaps - * and populates the insights state blob with the responses. - * - * @param transactionMeta - The transaction object. - */ - #handleViewActivityItem(transactionMeta: TransactionMeta) { - const { id, chainId /*, txParams */ } = transactionMeta; + #handleViewActivityItem({ + transactionMeta, + }: { + transactionMeta: TransactionMeta; + }) { + console.log( + 'kylan snaps-controllers->handleViewActivityItem1', + transactionMeta, + ); + const { id, chainId, origin, txParams } = transactionMeta; + console.log( + 'kylan snaps-controllers->handleViewActivityItem, chainId', + chainId, + ); // This assumes that the transactions are EVM-compatible for now. const caipChainId = `eip155:${hexToBigInt(chainId).toString(10)}`; @@ -182,18 +187,24 @@ export class SnapInsightsController extends BaseController< SnapEndowments.ActivityItemInsight, ); - snaps.forEach(({ snapId /*, permission */ }) => { + snaps.forEach(({ snapId, permission }) => { this.update((state) => { state.insights[id] ??= {}; state.insights[id][snapId] = { snapId, loading: true }; }); + // Check if snap has transactionOrigin caveat + const hasTransactionOriginCaveat = getTransactionOriginCaveat(permission); + const transactionOrigin = + hasTransactionOriginCaveat && origin ? origin : null; + this.#handleSnapRequest({ snapId, handler: HandlerType.OnViewActivityItem, params: { - transaction: transactionMeta, + transaction: txParams, chainId: caipChainId, + transactionOrigin, }, }) .then((response) => @@ -410,6 +421,11 @@ export class SnapInsightsController extends BaseController< | HandlerType.OnViewActivityItem; params: Record; }) { + console.log('kylan snaps-controllers->#handleSnapRequest', { + snapId, + handler, + params, + }); return this.messagingSystem.call('SnapController:handleRequest', { snapId, origin: 'metamask', @@ -441,9 +457,17 @@ export class SnapInsightsController extends BaseController< response?: Record; error?: Error; }) { + console.log( + 'kylan snaps-controllers->#handleSnapResponse1', + id, + snapId, // local:_______ + response, // n/a + error, + ); // If the insight has been cleaned up already, we can skip setting the state. // This may happen if a user accepts/rejects a transaction/signature faster than the Snap responds. if (!this.#hasInsight(id)) { + console.log('kylan snaps-controllers->#handleSnapResponse, no insight'); return; } diff --git a/packages/snaps-controllers/src/types/controllers.ts b/packages/snaps-controllers/src/types/controllers.ts index 6bbc7f406a..cd09331806 100644 --- a/packages/snaps-controllers/src/types/controllers.ts +++ b/packages/snaps-controllers/src/types/controllers.ts @@ -137,7 +137,7 @@ export type TransactionControllerTransactionStatusUpdatedEvent = { export type TransactionControllerActivityItemViewedEvent = { type: `TransactionController:activityItemViewed`; - payload: [transactionMeta: TransactionMeta]; + payload: [{ transactionMeta: TransactionMeta }]; }; export type StateSignatureParams = { diff --git a/packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts b/packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts index d891aed1aa..7b163c1496 100644 --- a/packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts +++ b/packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts @@ -41,9 +41,13 @@ const specificationBuilder: PermissionSpecificationBuilder< return { permissionType: PermissionType.Endowment, targetName: permissionName, - allowedCaveats: [SnapCaveatType.MaxRequestTime], + allowedCaveats: [ + SnapCaveatType.MaxRequestTime, + SnapCaveatType.ActivityItemOrigin, + ], endowmentGetter: (_getterOptions?: EndowmentGetterParams) => null, validator: createGenericPermissionValidator([ + { type: SnapCaveatType.ActivityItemOrigin, optional: true }, { type: SnapCaveatType.MaxRequestTime, optional: true }, ]), subjectTypes: [SubjectType.Snap], @@ -97,17 +101,17 @@ export function getActivityItemInsightCaveatMapper( return { caveats: [ { - type: SnapCaveatType.TransactionOrigin, + type: SnapCaveatType.ActivityItemOrigin, value: - hasProperty(value, 'allowTransactionOrigin') && - (value.allowTransactionOrigin as boolean), + hasProperty(value, 'allowActivityItemOrigin') && + (value.allowActivityItemOrigin as boolean), }, ], }; } /** - * Getter function to get the transaction origin caveat from a permission. + * Getter function to get the activity item origin caveat from a permission. * * This does basic validation of the caveat, but does not validate the type or * value of the namespaces object itself, as this is handled by the @@ -117,7 +121,7 @@ export function getActivityItemInsightCaveatMapper( * @returns The transaction origin, or `null` if the permission does not have a * transaction origin caveat. */ -export function getActivityItemInsightCaveat( +export function getActivityItemOriginCaveat( permission?: PermissionConstraint, ): boolean | null { if (!permission?.caveats) { @@ -125,7 +129,7 @@ export function getActivityItemInsightCaveat( } assert(permission.caveats.length === 1); - assert(permission.caveats[0].type === SnapCaveatType.TransactionOrigin); + assert(permission.caveats[0].type === SnapCaveatType.ActivityItemOrigin); const caveat = permission.caveats[0] as Caveat; @@ -133,11 +137,11 @@ export function getActivityItemInsightCaveat( } export const activityItemInsightCaveatSpecifications: Record< - SnapCaveatType.TransactionOrigin, + SnapCaveatType.ActivityItemOrigin, CaveatSpecificationConstraint > = { - [SnapCaveatType.TransactionOrigin]: Object.freeze({ - type: SnapCaveatType.TransactionOrigin, + [SnapCaveatType.ActivityItemOrigin]: Object.freeze({ + type: SnapCaveatType.ActivityItemOrigin, validator: (caveat: Caveat) => validateCaveat(caveat), }), }; diff --git a/packages/snaps-rpc-methods/src/endowments/index.ts b/packages/snaps-rpc-methods/src/endowments/index.ts index b8170cfe96..3552b4e07d 100644 --- a/packages/snaps-rpc-methods/src/endowments/index.ts +++ b/packages/snaps-rpc-methods/src/endowments/index.ts @@ -2,7 +2,11 @@ import type { PermissionConstraint } from '@metamask/permission-controller'; import { HandlerType } from '@metamask/snaps-utils'; import type { Json } from '@metamask/utils'; -import { activityItemInsightEndowmentBuilder } from './activity-item-insight'; +import { + activityItemInsightCaveatSpecifications, + activityItemInsightEndowmentBuilder, + getActivityItemInsightCaveatMapper, +} from './activity-item-insight'; import { assetsEndowmentBuilder, getAssetsCaveatMapper } from './assets'; import { createMaxRequestTimeMapper, @@ -55,6 +59,8 @@ export const endowmentPermissionBuilders = { [networkAccessEndowmentBuilder.targetName]: networkAccessEndowmentBuilder, [transactionInsightEndowmentBuilder.targetName]: transactionInsightEndowmentBuilder, + [activityItemInsightEndowmentBuilder.targetName]: + activityItemInsightEndowmentBuilder, [cronjobEndowmentBuilder.targetName]: cronjobEndowmentBuilder, [ethereumProviderEndowmentBuilder.targetName]: ethereumProviderEndowmentBuilder, @@ -74,6 +80,7 @@ export const endowmentPermissionBuilders = { export const endowmentCaveatSpecifications = { ...cronjobCaveatSpecifications, ...transactionInsightCaveatSpecifications, + ...activityItemInsightCaveatSpecifications, ...rpcCaveatSpecifications, ...nameLookupCaveatSpecifications, ...keyringCaveatSpecifications, @@ -92,6 +99,9 @@ export const endowmentCaveatMappers: Record< [transactionInsightEndowmentBuilder.targetName]: createMaxRequestTimeMapper( getTransactionInsightCaveatMapper, ), + [activityItemInsightEndowmentBuilder.targetName]: createMaxRequestTimeMapper( + getActivityItemInsightCaveatMapper, + ), [rpcEndowmentBuilder.targetName]: createMaxRequestTimeMapper(getRpcCaveatMapper), [nameLookupEndowmentBuilder.targetName]: createMaxRequestTimeMapper( @@ -143,8 +153,8 @@ export * from './enum'; export { getRpcCaveatOrigins } from './rpc'; export { getSignatureOriginCaveat } from './signature-insight'; export { getTransactionOriginCaveat } from './transaction-insight'; +export { getActivityItemOriginCaveat } from './activity-item-insight'; export { getChainIdsCaveat, getLookupMatchersCaveat } from './name-lookup'; -export { getActivityItemInsightCaveat } from './activity-item-insight'; export { getKeyringCaveatOrigins } from './keyring'; export { getMaxRequestTimeCaveat } from './caveats'; export { getCronjobCaveatJobs } from './cronjob'; diff --git a/packages/snaps-sdk/src/types/handlers/activity-item.ts b/packages/snaps-sdk/src/types/handlers/activity-item.ts index ffa813ebe3..ba860d38b8 100644 --- a/packages/snaps-sdk/src/types/handlers/activity-item.ts +++ b/packages/snaps-sdk/src/types/handlers/activity-item.ts @@ -14,7 +14,7 @@ export type OnViewActivityItemParams = { /** * The activity item data. */ - activity: { + transactionMeta: { id: string; hash: string; type: string; diff --git a/packages/snaps-sdk/src/types/permissions.ts b/packages/snaps-sdk/src/types/permissions.ts index 1427b6bce3..773acd0247 100644 --- a/packages/snaps-sdk/src/types/permissions.ts +++ b/packages/snaps-sdk/src/types/permissions.ts @@ -81,6 +81,10 @@ export type InitialPermissions = Partial<{ allowTransactionOrigin?: boolean; maxRequestTime?: number; }; + 'endowment:activity-item-insight': { + allowActivityItemOrigin?: boolean; + maxRequestTime?: number; + }; 'endowment:webassembly': EmptyObject; /* eslint-disable @typescript-eslint/naming-convention */ diff --git a/packages/snaps-utils/src/caveats.ts b/packages/snaps-utils/src/caveats.ts index 8272be9bc8..1464bc9dc4 100644 --- a/packages/snaps-utils/src/caveats.ts +++ b/packages/snaps-utils/src/caveats.ts @@ -19,6 +19,11 @@ export enum SnapCaveatType { */ TransactionOrigin = 'transactionOrigin', + /** + * Caveat specifying access to the activity item origin, used by `endowment:activity-item-insight`. + */ + ActivityItemOrigin = 'activityItemOrigin', + /** * Caveat specifying access to the signature origin, used by `endowment:signature-insight`. */ diff --git a/packages/snaps-utils/src/manifest/validation.ts b/packages/snaps-utils/src/manifest/validation.ts index 2df4e9ce5c..976e66585a 100644 --- a/packages/snaps-utils/src/manifest/validation.ts +++ b/packages/snaps-utils/src/manifest/validation.ts @@ -243,6 +243,14 @@ export const PermissionsStruct: Describe = type({ }), ), ), + 'endowment:activity-item-insight': optional( + mergeStructs( + HandlerCaveatsStruct, + object({ + allowActivityItemOrigin: optional(boolean()), + }), + ), + ), 'endowment:webassembly': optional(EmptyObjectStruct), snap_dialog: optional(EmptyObjectStruct), snap_manageState: optional(EmptyObjectStruct), From 665b014d6e2f825d684f6a22ed89d7420b4d3e75 Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Mon, 7 Jul 2025 01:54:24 -0700 Subject: [PATCH 06/18] Add missing event handler --- packages/snaps-controllers/src/snaps/SnapController.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/snaps-controllers/src/snaps/SnapController.ts b/packages/snaps-controllers/src/snaps/SnapController.ts index 30fe2484bb..0094118288 100644 --- a/packages/snaps-controllers/src/snaps/SnapController.ts +++ b/packages/snaps-controllers/src/snaps/SnapController.ts @@ -3776,6 +3776,7 @@ export class SnapController extends BaseController< switch (handlerType) { case HandlerType.OnTransaction: case HandlerType.OnSignature: + case HandlerType.OnViewActivityItem: case HandlerType.OnHomePage: case HandlerType.OnSettingsPage: { // Since this type has been asserted earlier we can cast @@ -4000,6 +4001,15 @@ export class SnapController extends BaseController< break; } + case HandlerType.OnViewActivityItem: { + assertStruct(result, OnTransactionResponseStruct); + + if (result && hasProperty(result, 'id')) { + this.#assertInterfaceExists(snapId, result.id as string); + } + + break; + } case HandlerType.OnHomePage: { assertStruct(result, OnHomePageResponseStruct); From 0b6c8dfac52f7c0f430fbc3765e69f7c87e89d13 Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Mon, 7 Jul 2025 15:49:12 -0700 Subject: [PATCH 07/18] =?UTF-8?q?ActivityItemInsights=20finally=20working!?= =?UTF-8?q?=20=F0=9F=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/insights/SnapInsightsController.ts | 35 +++++-------------- .../src/common/commands.ts | 4 +-- .../src/common/validation.ts | 2 ++ 3 files changed, 12 insertions(+), 29 deletions(-) diff --git a/packages/snaps-controllers/src/insights/SnapInsightsController.ts b/packages/snaps-controllers/src/insights/SnapInsightsController.ts index bc7b6af458..9476a41eb5 100644 --- a/packages/snaps-controllers/src/insights/SnapInsightsController.ts +++ b/packages/snaps-controllers/src/insights/SnapInsightsController.ts @@ -10,6 +10,7 @@ import type { ValidPermission, } from '@metamask/permission-controller'; import { + getActivityItemOriginCaveat, getSignatureOriginCaveat, getTransactionOriginCaveat, SnapEndowments, @@ -171,15 +172,7 @@ export class SnapInsightsController extends BaseController< }: { transactionMeta: TransactionMeta; }) { - console.log( - 'kylan snaps-controllers->handleViewActivityItem1', - transactionMeta, - ); - const { id, chainId, origin, txParams } = transactionMeta; - console.log( - 'kylan snaps-controllers->handleViewActivityItem, chainId', - chainId, - ); + const { id, chainId, origin } = transactionMeta; // This assumes that the transactions are EVM-compatible for now. const caipChainId = `eip155:${hexToBigInt(chainId).toString(10)}`; @@ -194,17 +187,18 @@ export class SnapInsightsController extends BaseController< }); // Check if snap has transactionOrigin caveat - const hasTransactionOriginCaveat = getTransactionOriginCaveat(permission); - const transactionOrigin = - hasTransactionOriginCaveat && origin ? origin : null; + const hasActivityItemOriginCaveat = + getActivityItemOriginCaveat(permission); + const activityItemOrigin = + hasActivityItemOriginCaveat && origin ? origin : null; this.#handleSnapRequest({ snapId, handler: HandlerType.OnViewActivityItem, params: { - transaction: txParams, + transactionMeta, chainId: caipChainId, - transactionOrigin, + origin: activityItemOrigin, }, }) .then((response) => @@ -421,11 +415,6 @@ export class SnapInsightsController extends BaseController< | HandlerType.OnViewActivityItem; params: Record; }) { - console.log('kylan snaps-controllers->#handleSnapRequest', { - snapId, - handler, - params, - }); return this.messagingSystem.call('SnapController:handleRequest', { snapId, origin: 'metamask', @@ -457,17 +446,9 @@ export class SnapInsightsController extends BaseController< response?: Record; error?: Error; }) { - console.log( - 'kylan snaps-controllers->#handleSnapResponse1', - id, - snapId, // local:_______ - response, // n/a - error, - ); // If the insight has been cleaned up already, we can skip setting the state. // This may happen if a user accepts/rejects a transaction/signature faster than the Snap responds. if (!this.#hasInsight(id)) { - console.log('kylan snaps-controllers->#handleSnapResponse, no insight'); return; } diff --git a/packages/snaps-execution-environments/src/common/commands.ts b/packages/snaps-execution-environments/src/common/commands.ts index 0b02d24aa8..817a8da006 100644 --- a/packages/snaps-execution-environments/src/common/commands.ts +++ b/packages/snaps-execution-environments/src/common/commands.ts @@ -60,8 +60,8 @@ export function getHandlerArguments( case HandlerType.OnViewActivityItem: { assertIsOnViewActivityItemRequestArguments(request.params); - const { transactionMeta } = request.params; - return { transactionMeta }; + const { transactionMeta, chainId } = request.params; + return { transactionMeta, origin, chainId }; } case HandlerType.OnSignature: { diff --git a/packages/snaps-execution-environments/src/common/validation.ts b/packages/snaps-execution-environments/src/common/validation.ts index 05eafa90df..70e2a67333 100644 --- a/packages/snaps-execution-environments/src/common/validation.ts +++ b/packages/snaps-execution-environments/src/common/validation.ts @@ -173,6 +173,8 @@ export function assertIsOnTransactionRequestArguments( export const OnViewActivityItemRequestArgumentsStruct = object({ transactionMeta: record(string(), JsonStruct), + origin: nullable(string()), + chainId: CaipChainIdStruct, }); export type OnViewActivityItemRequestArguments = Infer< From 2bcb455c240df6f603060c8d74825b3fd3c8aaaa Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Mon, 7 Jul 2025 18:40:13 -0700 Subject: [PATCH 08/18] Add selectedAccount and selectedAddress to onViewActivityItem event --- .../src/insights/SnapInsightsController.ts | 8 +++- .../src/snaps/SnapController.ts | 4 +- .../src/types/controllers.ts | 9 +++- .../src/common/commands.ts | 11 ++++- .../src/common/validation.ts | 2 + .../src/types/handlers/activity-item.ts | 10 +++++ .../snaps-utils/src/handlers/activity-item.ts | 43 ++++++++++++++++++- packages/snaps-utils/src/handlers/index.ts | 1 + 8 files changed, 80 insertions(+), 8 deletions(-) diff --git a/packages/snaps-controllers/src/insights/SnapInsightsController.ts b/packages/snaps-controllers/src/insights/SnapInsightsController.ts index 9476a41eb5..e75046686a 100644 --- a/packages/snaps-controllers/src/insights/SnapInsightsController.ts +++ b/packages/snaps-controllers/src/insights/SnapInsightsController.ts @@ -16,7 +16,7 @@ import { SnapEndowments, } from '@metamask/snaps-rpc-methods'; import type { Json, SnapId } from '@metamask/snaps-sdk'; -import { HandlerType } from '@metamask/snaps-utils'; +import { HandlerType, InternalAccount } from '@metamask/snaps-utils'; import { hasProperty, hexToBigInt } from '@metamask/utils'; import type { DeleteInterface } from '../interface'; @@ -169,8 +169,12 @@ export class SnapInsightsController extends BaseController< #handleViewActivityItem({ transactionMeta, + selectedAddress, + selectedAccount, }: { transactionMeta: TransactionMeta; + selectedAddress: string; + selectedAccount: InternalAccount; }) { const { id, chainId, origin } = transactionMeta; // This assumes that the transactions are EVM-compatible for now. @@ -199,6 +203,8 @@ export class SnapInsightsController extends BaseController< transactionMeta, chainId: caipChainId, origin: activityItemOrigin, + selectedAddress, + selectedAccount, }, }) .then((response) => diff --git a/packages/snaps-controllers/src/snaps/SnapController.ts b/packages/snaps-controllers/src/snaps/SnapController.ts index 0094118288..5e6b8a1d2f 100644 --- a/packages/snaps-controllers/src/snaps/SnapController.ts +++ b/packages/snaps-controllers/src/snaps/SnapController.ts @@ -91,6 +91,7 @@ import { logError, normalizeRelative, OnTransactionResponseStruct, + OnViewActivityItemResponseStruct, OnSignatureResponseStruct, resolveVersionRange, SnapCaveatType, @@ -4002,8 +4003,7 @@ export class SnapController extends BaseController< break; } case HandlerType.OnViewActivityItem: { - assertStruct(result, OnTransactionResponseStruct); - + assertStruct(result, OnViewActivityItemResponseStruct); if (result && hasProperty(result, 'id')) { this.#assertInterfaceExists(snapId, result.id as string); } diff --git a/packages/snaps-controllers/src/types/controllers.ts b/packages/snaps-controllers/src/types/controllers.ts index cd09331806..15d6c9be5c 100644 --- a/packages/snaps-controllers/src/types/controllers.ts +++ b/packages/snaps-controllers/src/types/controllers.ts @@ -1,4 +1,5 @@ import type { ControllerStateChangeEvent } from '@metamask/base-controller'; +import { InternalAccount } from '@metamask/snaps-utils'; import type { Hex, Json } from '@metamask/utils'; // Partial types that should overlap with types from controllers. @@ -137,7 +138,13 @@ export type TransactionControllerTransactionStatusUpdatedEvent = { export type TransactionControllerActivityItemViewedEvent = { type: `TransactionController:activityItemViewed`; - payload: [{ transactionMeta: TransactionMeta }]; + payload: [ + { + transactionMeta: TransactionMeta; + selectedAddress: string; + selectedAccount: InternalAccount; + }, + ]; }; export type StateSignatureParams = { diff --git a/packages/snaps-execution-environments/src/common/commands.ts b/packages/snaps-execution-environments/src/common/commands.ts index 817a8da006..d45657c644 100644 --- a/packages/snaps-execution-environments/src/common/commands.ts +++ b/packages/snaps-execution-environments/src/common/commands.ts @@ -60,8 +60,15 @@ export function getHandlerArguments( case HandlerType.OnViewActivityItem: { assertIsOnViewActivityItemRequestArguments(request.params); - const { transactionMeta, chainId } = request.params; - return { transactionMeta, origin, chainId }; + const { transactionMeta, chainId, selectedAddress, selectedAccount } = + request.params; + return { + transactionMeta, + origin, + chainId, + selectedAddress, + selectedAccount, + }; } case HandlerType.OnSignature: { diff --git a/packages/snaps-execution-environments/src/common/validation.ts b/packages/snaps-execution-environments/src/common/validation.ts index 70e2a67333..3560cd04d9 100644 --- a/packages/snaps-execution-environments/src/common/validation.ts +++ b/packages/snaps-execution-environments/src/common/validation.ts @@ -175,6 +175,8 @@ export const OnViewActivityItemRequestArgumentsStruct = object({ transactionMeta: record(string(), JsonStruct), origin: nullable(string()), chainId: CaipChainIdStruct, + selectedAddress: string(), + selectedAccount: record(string(), JsonStruct), }); export type OnViewActivityItemRequestArguments = Infer< diff --git a/packages/snaps-sdk/src/types/handlers/activity-item.ts b/packages/snaps-sdk/src/types/handlers/activity-item.ts index ba860d38b8..1551ad60f8 100644 --- a/packages/snaps-sdk/src/types/handlers/activity-item.ts +++ b/packages/snaps-sdk/src/types/handlers/activity-item.ts @@ -34,6 +34,16 @@ export type OnViewActivityItemParams = { * The origin of the activity view request. */ origin?: string; + + /** + * The selected address of the user. + */ + selectedAddress: string; + + /** + * The selected account of the user. + */ + selectedAccount: any; }; export type OnViewActivityItemResponse = { diff --git a/packages/snaps-utils/src/handlers/activity-item.ts b/packages/snaps-utils/src/handlers/activity-item.ts index c1ec77ad02..d0d48ee633 100644 --- a/packages/snaps-utils/src/handlers/activity-item.ts +++ b/packages/snaps-utils/src/handlers/activity-item.ts @@ -1,3 +1,42 @@ -import { OnTransactionResponseStruct } from './transaction'; +import { ComponentOrElementStruct } from '@metamask/snaps-sdk'; +import { + literal, + object, + optional, + string, + assign, + nullable, + union, +} from '@metamask/superstruct'; -export const OnViewActivityItemResponseStruct = OnTransactionResponseStruct; +// Fix: Allow all severity levels, not just Critical +export const OnViewActivityItemSeverityResponseStruct = object({ + severity: optional( + union([literal('critical'), literal('warning'), literal('info')]), + ), +}); + +export const OnViewActivityItemResponseWithIdStruct = assign( + OnViewActivityItemSeverityResponseStruct, + object({ + id: string(), + }), +); + +export const OnViewActivityItemResponseWithContentStruct = assign( + OnViewActivityItemSeverityResponseStruct, + object({ + content: ComponentOrElementStruct, + }), +); + +// Fix: Allow flexible combinations, not strict either/or +export const OnViewActivityItemResponseStruct = nullable( + object({ + id: optional(string()), + severity: optional( + union([literal('critical'), literal('warning'), literal('info')]), + ), + content: optional(ComponentOrElementStruct), + }), +); diff --git a/packages/snaps-utils/src/handlers/index.ts b/packages/snaps-utils/src/handlers/index.ts index 638126f14f..1787d89eeb 100644 --- a/packages/snaps-utils/src/handlers/index.ts +++ b/packages/snaps-utils/src/handlers/index.ts @@ -1,3 +1,4 @@ +export * from './activity-item'; export * from './asset-historical-price'; export * from './assets-conversion'; export * from './assets-market-data'; From 871631f01c9d845503d5a4ea0305373bf7de618e Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Tue, 8 Jul 2025 11:26:06 -0700 Subject: [PATCH 09/18] Switch package.jsons to local --- packages/snaps-cli/package.json | 10 +++++----- packages/snaps-controllers/package.json | 8 ++++---- packages/snaps-execution-environments/package.json | 4 ++-- packages/snaps-rpc-methods/package.json | 4 ++-- packages/snaps-utils/package.json | 2 +- packages/snaps-webpack-plugin/package.json | 6 +++--- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/snaps-cli/package.json b/packages/snaps-cli/package.json index 870cdf0065..f888ee184d 100644 --- a/packages/snaps-cli/package.json +++ b/packages/snaps-cli/package.json @@ -64,11 +64,11 @@ "test:watch": "jest --watch" }, "dependencies": { - "@metamask/snaps-rpc-methods": "workspace:^", - "@metamask/snaps-sandbox": "workspace:^", - "@metamask/snaps-sdk": "workspace:^", - "@metamask/snaps-utils": "workspace:^", - "@metamask/snaps-webpack-plugin": "workspace:^", + "@metamask/snaps-rpc-methods": "file:../snaps-rpc-methods", + "@metamask/snaps-sandbox": "file:../snaps-sandbox", + "@metamask/snaps-sdk": "file:../snaps-sdk", + "@metamask/snaps-utils": "file:../snaps-utils", + "@metamask/snaps-webpack-plugin": "file:../snaps-webpack-plugin", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.4.2", "@swc/core": "1.11.31", diff --git a/packages/snaps-controllers/package.json b/packages/snaps-controllers/package.json index e5b77e5e67..8b826a9d32 100644 --- a/packages/snaps-controllers/package.json +++ b/packages/snaps-controllers/package.json @@ -90,9 +90,9 @@ "@metamask/post-message-stream": "^10.0.0", "@metamask/rpc-errors": "^7.0.3", "@metamask/snaps-registry": "^3.2.3", - "@metamask/snaps-rpc-methods": "workspace:^", - "@metamask/snaps-sdk": "workspace:^", - "@metamask/snaps-utils": "workspace:^", + "@metamask/snaps-rpc-methods": "file:../snaps-rpc-methods", + "@metamask/snaps-sdk": "file:../snaps-sdk", + "@metamask/snaps-utils": "file:../snaps-utils", "@metamask/utils": "^11.4.2", "@xstate/fsm": "^2.0.0", "async-mutex": "^0.5.0", @@ -145,7 +145,7 @@ "vitest": "^3.1.1" }, "peerDependencies": { - "@metamask/snaps-execution-environments": "workspace:^" + "@metamask/snaps-execution-environments": "file:../snaps-execution-environments" }, "peerDependenciesMeta": { "@metamask/snaps-execution-environments": { diff --git a/packages/snaps-execution-environments/package.json b/packages/snaps-execution-environments/package.json index 1236759a52..5a9dfdc8ba 100644 --- a/packages/snaps-execution-environments/package.json +++ b/packages/snaps-execution-environments/package.json @@ -71,8 +71,8 @@ "@metamask/post-message-stream": "^10.0.0", "@metamask/providers": "^22.1.0", "@metamask/rpc-errors": "^7.0.3", - "@metamask/snaps-sdk": "workspace:^", - "@metamask/snaps-utils": "workspace:^", + "@metamask/snaps-sdk": "file:../snaps-sdk", + "@metamask/snaps-utils": "file:../snaps-utils", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.4.2", "readable-stream": "^3.6.2" diff --git a/packages/snaps-rpc-methods/package.json b/packages/snaps-rpc-methods/package.json index 4b835eddfa..9c2dfd36a8 100644 --- a/packages/snaps-rpc-methods/package.json +++ b/packages/snaps-rpc-methods/package.json @@ -58,8 +58,8 @@ "@metamask/key-tree": "^10.1.1", "@metamask/permission-controller": "^11.0.6", "@metamask/rpc-errors": "^7.0.3", - "@metamask/snaps-sdk": "workspace:^", - "@metamask/snaps-utils": "workspace:^", + "@metamask/snaps-sdk": "file:../snaps-sdk", + "@metamask/snaps-utils": "file:../snaps-utils", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.4.2", "@noble/hashes": "^1.7.1" diff --git a/packages/snaps-utils/package.json b/packages/snaps-utils/package.json index 45455ca083..fbabc6a4ee 100644 --- a/packages/snaps-utils/package.json +++ b/packages/snaps-utils/package.json @@ -86,7 +86,7 @@ "@metamask/rpc-errors": "^7.0.3", "@metamask/slip44": "^4.2.0", "@metamask/snaps-registry": "^3.2.3", - "@metamask/snaps-sdk": "workspace:^", + "@metamask/snaps-sdk": "file:../snaps-sdk", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.4.2", "@noble/hashes": "^1.7.1", diff --git a/packages/snaps-webpack-plugin/package.json b/packages/snaps-webpack-plugin/package.json index 9919bb15af..444816e824 100644 --- a/packages/snaps-webpack-plugin/package.json +++ b/packages/snaps-webpack-plugin/package.json @@ -57,9 +57,9 @@ "test:watch": "jest --watch" }, "dependencies": { - "@metamask/snaps-rpc-methods": "workspace:^", - "@metamask/snaps-sdk": "workspace:^", - "@metamask/snaps-utils": "workspace:^", + "@metamask/snaps-rpc-methods": "file:../snaps-rpc-methods", + "@metamask/snaps-sdk": "file:../snaps-sdk", + "@metamask/snaps-utils": "file:../snaps-utils", "@metamask/utils": "^11.4.2", "chalk": "^4.1.2", "webpack-sources": "^3.2.3" From efc3e7be25da938a2082f5edffc24672728891a3 Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Wed, 9 Jul 2025 16:38:55 -0700 Subject: [PATCH 10/18] Add missing onActivityItem utils and tests --- .../src/test-utils/controller.ts | 24 +++ .../src/common/commands.test.ts | 11 ++ .../src/common/validation.test.ts | 81 ++++++++ .../endowments/activity-item-insight.test.ts | 186 ++++++++++++++++++ packages/snaps-utils/src/handlers/exports.ts | 2 +- 5 files changed, 303 insertions(+), 1 deletion(-) create mode 100644 packages/snaps-rpc-methods/src/endowments/activity-item-insight.test.ts diff --git a/packages/snaps-controllers/src/test-utils/controller.ts b/packages/snaps-controllers/src/test-utils/controller.ts index de353370ab..2f75ff219a 100644 --- a/packages/snaps-controllers/src/test-utils/controller.ts +++ b/packages/snaps-controllers/src/test-utils/controller.ts @@ -287,6 +287,18 @@ export const MOCK_INSIGHTS_PERMISSIONS: Record = { invoker: MOCK_SNAP_ID, parentCapability: SnapEndowments.SignatureInsight, }, + [SnapEndowments.ActivityItemInsight]: { + caveats: [ + { + type: SnapCaveatType.ActivityItemOrigin, + value: true, + }, + ], + date: 1664187844588, + id: 'izn0WGUO8cvq_jqvLQuQP', + invoker: MOCK_SNAP_ID, + parentCapability: SnapEndowments.ActivityItemInsight, + }, }; export const MOCK_INSIGHTS_PERMISSIONS_NO_ORIGINS: Record< @@ -305,6 +317,18 @@ export const MOCK_INSIGHTS_PERMISSIONS_NO_ORIGINS: Record< invoker: MOCK_SNAP_ID, parentCapability: SnapEndowments.TransactionInsight, }, + [SnapEndowments.ActivityItemInsight]: { + caveats: [ + { + type: SnapCaveatType.ActivityItemOrigin, + value: false, + }, + ], + date: 1664187844588, + id: 'izn0WGUO8cvq_jqvLQuQP', + invoker: MOCK_SNAP_ID, + parentCapability: SnapEndowments.ActivityItemInsight, + }, [SnapEndowments.SignatureInsight]: { caveats: [ { diff --git a/packages/snaps-execution-environments/src/common/commands.test.ts b/packages/snaps-execution-environments/src/common/commands.test.ts index 9b5b71f704..ec3ae6e679 100644 --- a/packages/snaps-execution-environments/src/common/commands.test.ts +++ b/packages/snaps-execution-environments/src/common/commands.test.ts @@ -19,6 +19,17 @@ describe('getHandlerArguments', () => { ).toThrow('Invalid request params'); }); + it('validates the request params for the OnViewActivityItem handler', () => { + expect(() => + getHandlerArguments(MOCK_ORIGIN, HandlerType.OnViewActivityItem, { + id: 1, + jsonrpc: '2.0', + method: 'foo', + params: {}, + }), + ).toThrow('Invalid request params'); + }); + it('validates the request params for the OnSignature handler', () => { expect(() => getHandlerArguments(MOCK_ORIGIN, HandlerType.OnSignature, { diff --git a/packages/snaps-execution-environments/src/common/validation.test.ts b/packages/snaps-execution-environments/src/common/validation.test.ts index 476106533c..3beea2d005 100644 --- a/packages/snaps-execution-environments/src/common/validation.test.ts +++ b/packages/snaps-execution-environments/src/common/validation.test.ts @@ -9,6 +9,7 @@ import { assertIsOnProtocolRequestArguments, assertIsOnSignatureRequestArguments, assertIsOnTransactionRequestArguments, + assertIsOnViewActivityItemRequestArguments, assertIsOnUserInputRequestArguments, isEndowment, isEndowmentsArray, @@ -89,6 +90,86 @@ describe('assertIsOnTransactionRequestArguments', () => { ); }); +describe('assertIsOnViewActivityItemRequestArguments', () => { + it.each([ + { + transactionMeta: { foo: 'bar' }, + selectedAddress: '0xsomeAddress', + selectedAccount: { baz: 'bar' }, + chainId: 'eip155:1', + origin: 'https://some.origin', + }, + { + transactionMeta: { foo: 'bar' }, + selectedAddress: '0xsomeAddress', + selectedAccount: { baz: 'bar' }, + chainId: 'bip122:000000000019d6689c085ae165831e93', + origin: 'https://some.origin', + }, + { + transactionMeta: { bar: 'baz' }, + selectedAddress: '0xsomeAddress', + selectedAccount: { baz: 'bar' }, + chainId: 'eip155:84532', + origin: 'https://some.origin', + }, + ])('does not throw for a valid transaction params object', (args) => { + expect(() => + assertIsOnViewActivityItemRequestArguments(args), + ).not.toThrow(); + }); + + it.each([ + true, + false, + null, + undefined, + 0, + 1, + '', + 'foo', + [], + {}, + { + // missing origin + transaction: { foo: 'bar' }, + chainId: 'eip155:84532', + selectedAddress: '0xsomeAddress', + selectedAccount: { baz: 'bar' }, + }, + { + origin: null, + transaction: 'falseTransaction', + chainId: 'eip155:84532', + selectedAddress: '0xsomeAddress', + selectedAccount: { baz: 'bar' }, + }, + + { + origin: null, + transaction: { foo: 'bar' }, + chainId: 1, + selectedAddress: ['0xsomeAddress'], + selectedAccount: { baz: 'bar' }, + }, + + { + origin: null, + transaction: { foo: 'bar' }, + chainId: 'eip155:84532', + selectedAddress: '0xsomeAddress', + selectedAccount: null, + }, + ])( + 'throws if the value is not a valid transaction params object', + (value) => { + expect(() => + assertIsOnViewActivityItemRequestArguments(value as any), + ).toThrow('Invalid request params:'); + }, + ); +}); + describe('assertIsOnSignatureRequestArguments', () => { const FROM_ADDRESS = '0xd8da6bf26964af9d7eed9e03e53415d37aa96045'; it.each([ diff --git a/packages/snaps-rpc-methods/src/endowments/activity-item-insight.test.ts b/packages/snaps-rpc-methods/src/endowments/activity-item-insight.test.ts new file mode 100644 index 0000000000..d84af262d7 --- /dev/null +++ b/packages/snaps-rpc-methods/src/endowments/activity-item-insight.test.ts @@ -0,0 +1,186 @@ +import type { PermissionConstraint } from '@metamask/permission-controller'; +import { PermissionType, SubjectType } from '@metamask/permission-controller'; +import { SnapCaveatType } from '@metamask/snaps-utils'; + +import { getActivityItemOriginCaveat, SnapEndowments } from '.'; +import { + activityItemInsightEndowmentBuilder, + activityItemInsightCaveatSpecifications, + getActivityItemInsightCaveatMapper, +} from './activity-item-insight'; + +describe('endowment:activity-item-insight-insight', () => { + const specification = + activityItemInsightEndowmentBuilder.specificationBuilder({}); + it('builds the expected permission specification', () => { + expect(specification).toStrictEqual({ + permissionType: PermissionType.Endowment, + targetName: SnapEndowments.ActivityItemInsight, + allowedCaveats: [ + SnapCaveatType.ActivityItemOrigin, + SnapCaveatType.MaxRequestTime, + ], + endowmentGetter: expect.any(Function), + validator: expect.any(Function), + subjectTypes: [SubjectType.Snap], + }); + + expect(specification.endowmentGetter()).toBeNull(); + }); + + describe('validator', () => { + it('allows no caveats', () => { + expect(() => + // @ts-expect-error Missing required permission types. + specification.validator({}), + ).not.toThrow(); + }); + + it('throws if the caveat is not a single "activityItemOrigin"', () => { + expect(() => + // @ts-expect-error Missing other required permission types. + specification.validator({ + caveats: [{ type: 'foo', value: 'bar' }], + }), + ).toThrow( + 'Expected the following caveats: "activityItemOrigin", "maxRequestTime", received "foo".', + ); + + expect(() => + // @ts-expect-error Missing other required permission types. + specification.validator({ + caveats: [ + { type: 'activityItemOrigin', value: [] }, + { type: 'activityItemOrigin', value: [] }, + ], + }), + ).toThrow('Duplicate caveats are not allowed.'); + }); + }); +}); + +describe('getActivityItemOriginCaveat', () => { + it('returns the value from a activity item insight permission', () => { + const permission: PermissionConstraint = { + date: 0, + parentCapability: 'foo', + invoker: 'bar', + id: 'baz', + caveats: [ + { + type: SnapCaveatType.ActivityItemOrigin, + value: true, + }, + ], + }; + + expect(getActivityItemOriginCaveat(permission)).toBe(true); + }); + + it('returns null if the input is undefined', () => { + expect(getActivityItemOriginCaveat(undefined)).toBeNull(); + }); + + it('returns null if the permission does not have caveats', () => { + const permission: PermissionConstraint = { + date: 0, + parentCapability: 'foo', + invoker: 'bar', + id: 'baz', + caveats: null, + }; + + expect(getActivityItemOriginCaveat(permission)).toBeNull(); + }); + + it('throws if the permission does not have exactly one caveat', () => { + const permission: PermissionConstraint = { + date: 0, + parentCapability: 'foo', + invoker: 'bar', + id: 'baz', + caveats: [ + { + type: SnapCaveatType.ActivityItemOrigin, + value: true, + }, + { + type: SnapCaveatType.ActivityItemOrigin, + value: true, + }, + ], + }; + + expect(() => getActivityItemOriginCaveat(permission)).toThrow( + 'Assertion failed', + ); + }); + + it('throws if the first caveat is not a "activityItemOrigin" caveat', () => { + const permission: PermissionConstraint = { + date: 0, + parentCapability: 'foo', + invoker: 'bar', + id: 'baz', + caveats: [ + { + type: SnapCaveatType.PermittedCoinTypes, + value: 'foo', + }, + ], + }; + + expect(() => getActivityItemOriginCaveat(permission)).toThrow( + 'Assertion failed', + ); + }); +}); + +describe('getActivityItemInsightCaveatMapper', () => { + it('maps input to a caveat', () => { + expect( + getActivityItemInsightCaveatMapper({ + allowActivityItemOrigin: true, + }), + ).toStrictEqual({ + caveats: [ + { + type: 'activityItemOrigin', + value: true, + }, + ], + }); + }); + + it('does not include caveat if input is empty object', () => { + expect(getActivityItemInsightCaveatMapper({})).toStrictEqual({ + caveats: null, + }); + }); +}); + +describe('activityItemInsightCaveatSpecifications', () => { + describe('validator', () => { + it('throws if the caveat values are invalid', () => { + expect(() => + activityItemInsightCaveatSpecifications[ + SnapCaveatType.ActivityItemOrigin + ].validator?.( + // @ts-expect-error Missing value type. + { + type: SnapCaveatType.ActivityItemOrigin, + }, + ), + ).toThrow('Expected a plain object.'); + + expect(() => + activityItemInsightCaveatSpecifications[ + SnapCaveatType.ActivityItemOrigin + ].validator?.({ + type: SnapCaveatType.ActivityItemOrigin, + value: undefined, + }), + ).toThrow('Expected caveat value to have type "boolean"'); + }); + }); +}); diff --git a/packages/snaps-utils/src/handlers/exports.ts b/packages/snaps-utils/src/handlers/exports.ts index 13c3c23646..3d1759d3ad 100644 --- a/packages/snaps-utils/src/handlers/exports.ts +++ b/packages/snaps-utils/src/handlers/exports.ts @@ -13,6 +13,7 @@ import type { OnRpcRequestHandler, OnSettingsPageHandler, OnSignatureHandler, + OnViewActivityItemHandler, OnStartHandler, OnTransactionHandler, OnUpdateHandler, @@ -21,7 +22,6 @@ import type { } from '@metamask/snaps-sdk'; import { HandlerType } from './types'; -import type { OnViewActivityItemHandler } from '../../../snaps-sdk/src/types/handlers/activity-item'; export const SNAP_EXPORTS = { [HandlerType.OnRpcRequest]: { From 2b8a6b6c9e4ad2a18d6e396ae6632005b39775f1 Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Wed, 9 Jul 2025 16:40:03 -0700 Subject: [PATCH 11/18] Change onViewActivityItem handler severity to only just 'critical' --- packages/snaps-utils/src/handlers/activity-item.ts | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/packages/snaps-utils/src/handlers/activity-item.ts b/packages/snaps-utils/src/handlers/activity-item.ts index d0d48ee633..9277392272 100644 --- a/packages/snaps-utils/src/handlers/activity-item.ts +++ b/packages/snaps-utils/src/handlers/activity-item.ts @@ -1,4 +1,4 @@ -import { ComponentOrElementStruct } from '@metamask/snaps-sdk'; +import { ComponentOrElementStruct, SeverityLevel } from '@metamask/snaps-sdk'; import { literal, object, @@ -6,14 +6,10 @@ import { string, assign, nullable, - union, } from '@metamask/superstruct'; -// Fix: Allow all severity levels, not just Critical export const OnViewActivityItemSeverityResponseStruct = object({ - severity: optional( - union([literal('critical'), literal('warning'), literal('info')]), - ), + severity: optional(literal(SeverityLevel.Critical)), }); export const OnViewActivityItemResponseWithIdStruct = assign( @@ -30,13 +26,10 @@ export const OnViewActivityItemResponseWithContentStruct = assign( }), ); -// Fix: Allow flexible combinations, not strict either/or export const OnViewActivityItemResponseStruct = nullable( object({ id: optional(string()), - severity: optional( - union([literal('critical'), literal('warning'), literal('info')]), - ), + severity: optional(literal(SeverityLevel.Critical)), content: optional(ComponentOrElementStruct), }), ); From b4ed11917f8b5e6840419e6b966cdc5c9bb76afd Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Wed, 9 Jul 2025 16:40:36 -0700 Subject: [PATCH 12/18] Add more documentation for onViewActivityItem --- .../src/types/handlers/activity-item.ts | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/snaps-sdk/src/types/handlers/activity-item.ts b/packages/snaps-sdk/src/types/handlers/activity-item.ts index 1551ad60f8..047eac246a 100644 --- a/packages/snaps-sdk/src/types/handlers/activity-item.ts +++ b/packages/snaps-sdk/src/types/handlers/activity-item.ts @@ -1,10 +1,21 @@ import type { ComponentOrElement } from '..'; /** - * The `onViewActivityItem` handler. This is called when a user views an activity item. + * This event is called when a user clicks on a transaction to bring up the + * transaction details modal * - * @param params - The activity item parameters. - * @returns The response from the handler. + * The `onViewActivityItem` handler returns a Snaps UI component, which is displayed + * in the activity item insights panel (transaction details modal). + * + * @param params - The request parameters. + * @param params.transactionMeta - The transaction object. This contains the + * transaction parameters, such as the `from`, `to`, `value`, and `data` fields. + * @param params.origin - The origin of the transaction. A URL is the transaction originated + * from a website or, for example, 'Metamask' if the transaction was initiated by the user. + * @param params.chainId - The chain ID of the transaction. + * @param params.selectedAddress - The address of the account that initiated the transaction. + * @param params.selectedAccount - The account object of the account that initiated the transaction. + * @returns The activity item insights. */ export type OnViewActivityItemHandler = ( params: OnViewActivityItemParams, @@ -15,13 +26,21 @@ export type OnViewActivityItemParams = { * The activity item data. */ transactionMeta: { + /** Unique transaction identifier */ id: string; + /** Transaction hash */ hash: string; + /** Transaction type */ type: string; + /** Transaction timestamp */ timestamp: number; + /** Transaction value (optional) */ value?: string; + /** From address (optional) */ from?: string; + /** To address (optional) */ to?: string; + /** Additional transaction properties */ [key: string]: unknown; }; @@ -46,6 +65,14 @@ export type OnViewActivityItemParams = { selectedAccount: any; }; +/** + * The response from a Snap's `onViewActivityItem` handler. + * + * @property id - A unique identifier for the insight interface. + * @property severity - The severity level of the insight. Currently only one + * level is supported: `critical`. + * @property content - Optional content to display in the activity item view. + */ export type OnViewActivityItemResponse = { /** * A unique identifier for the insight interface. From 7bd00e9e29a4033882446e8d440798a0d43641fa Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Wed, 9 Jul 2025 16:40:56 -0700 Subject: [PATCH 13/18] Add onViewActivityItem example --- .../activity-item-insights/.depcheckrc.json | 18 ++ .../activity-item-insights/CHANGELOG.md | 105 +++++++++ .../activity-item-insights/LICENSE.APACHE2 | 201 ++++++++++++++++++ .../activity-item-insights/LICENSE.MIT0 | 16 ++ .../packages/activity-item-insights/README.md | 49 +++++ .../activity-item-insights/jest.config.js | 36 ++++ .../activity-item-insights/package.json | 74 +++++++ .../activity-item-insights/snap.config.ts | 16 ++ .../activity-item-insights/snap.manifest.json | 24 +++ .../activity-item-insights/src/index.test.ts | 114 ++++++++++ .../activity-item-insights/src/index.ts | 48 +++++ .../activity-item-insights/tsconfig.json | 8 + 12 files changed, 709 insertions(+) create mode 100644 packages/examples/packages/activity-item-insights/.depcheckrc.json create mode 100644 packages/examples/packages/activity-item-insights/CHANGELOG.md create mode 100644 packages/examples/packages/activity-item-insights/LICENSE.APACHE2 create mode 100644 packages/examples/packages/activity-item-insights/LICENSE.MIT0 create mode 100644 packages/examples/packages/activity-item-insights/README.md create mode 100644 packages/examples/packages/activity-item-insights/jest.config.js create mode 100644 packages/examples/packages/activity-item-insights/package.json create mode 100644 packages/examples/packages/activity-item-insights/snap.config.ts create mode 100644 packages/examples/packages/activity-item-insights/snap.manifest.json create mode 100644 packages/examples/packages/activity-item-insights/src/index.test.ts create mode 100644 packages/examples/packages/activity-item-insights/src/index.ts create mode 100644 packages/examples/packages/activity-item-insights/tsconfig.json diff --git a/packages/examples/packages/activity-item-insights/.depcheckrc.json b/packages/examples/packages/activity-item-insights/.depcheckrc.json new file mode 100644 index 0000000000..c437c59cd2 --- /dev/null +++ b/packages/examples/packages/activity-item-insights/.depcheckrc.json @@ -0,0 +1,18 @@ +{ + "ignore-patterns": ["dist", "coverage"], + "ignores": [ + "@lavamoat/allow-scripts", + "@lavamoat/preinstall-always-fail", + "@metamask/auto-changelog", + "@metamask/eslint-*", + "@types/*", + "@typescript-eslint/*", + "eslint-config-*", + "eslint-plugin-*", + "jest-silent-reporter", + "prettier-plugin-packagejson", + "ts-node", + "typedoc", + "typescript" + ] +} diff --git a/packages/examples/packages/activity-item-insights/CHANGELOG.md b/packages/examples/packages/activity-item-insights/CHANGELOG.md new file mode 100644 index 0000000000..6538feeaff --- /dev/null +++ b/packages/examples/packages/activity-item-insights/CHANGELOG.md @@ -0,0 +1,105 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [2.2.3] + +### Fixed + +- Bump MetaMask dependencies + +## [2.2.2] + +### Fixed + +- Fix address validation in row component ([#2257](https://github.com/MetaMask/snaps/pull/2257)) + +## [2.2.1] + +### Changed + +- Remove snap icon ([#2189](https://github.com/MetaMask/snaps/pull/2189)) + +## [2.2.0] + +### Added + +- Use new `row` and `address` component ([#1968](https://github.com/MetaMask/snaps/pull/1968)) + +## [2.1.0] + +### Changed + +- Use `@metamask/snaps-sdk` package ([#1930](https://github.com/MetaMask/snaps/pull/1930), + [#1946](https://github.com/MetaMask/snaps/pull/1946), [#1950](https://github.com/MetaMask/snaps/pull/1950), + [#1949](https://github.com/MetaMask/snaps/pull/1949), [#1954](https://github.com/MetaMask/snaps/pull/1954)) + - This package replaces the `@metamask/snaps-types` and + - `@metamask/snaps-ui` packages, and is much more lightweight. + +## [2.0.2] + +### Changed + +- Update example insight snap to support transaction insights v2 ([#1911](https://github.com/MetaMask/snaps/pull/1911)) + +## [2.0.1] + +### Changed + +- Update multiple MetaMask dependencies ([#1841](https://github.com/MetaMask/snaps/pull/1841)) + +## [2.0.0] + +### Changed + +- **BREAKING:** Bump minimum Node.js version to `^18.16.0` ([#1741](https://github.com/MetaMask/snaps/pull/1741)) + +## [1.0.0] + +### Changed + +- Initial stable release from main branch ([#1757](https://github.com/MetaMask/snaps/pull/1757)) + +## [0.38.1-flask.1] + +### Changed + +- Use `polyfills` option for specifying Node.js polyfills ([#1650](https://github.com/MetaMask/snaps/pull/1650)) + +### Fixed + +- Remove unused dependencies ([#1680](https://github.com/MetaMask/snaps/pull/1680)) + +## [0.38.0-flask.1] + +### Changed + +- Update example to the new configuration format ([#1632](https://github.com/MetaMask/snaps/pull/1632)) + - The example now uses Webpack instead of Browserify. + +## [0.37.2-flask.1] + +### Changed + +- Release package independently ([#1600](https://github.com/MetaMask/snaps/pull/1600)) + - The version of the package no longer needs to match the version of all other + MetaMask Snaps packages. + +[Unreleased]: https://github.com/MetaMask/snaps/compare/@metamask/insights-example-snap@2.2.3...HEAD +[2.2.3]: https://github.com/MetaMask/snaps/compare/@metamask/insights-example-snap@2.2.2...@metamask/insights-example-snap@2.2.3 +[2.2.2]: https://github.com/MetaMask/snaps/compare/@metamask/insights-example-snap@2.2.1...@metamask/insights-example-snap@2.2.2 +[2.2.1]: https://github.com/MetaMask/snaps/compare/@metamask/insights-example-snap@2.2.0...@metamask/insights-example-snap@2.2.1 +[2.2.0]: https://github.com/MetaMask/snaps/compare/@metamask/insights-example-snap@2.1.0...@metamask/insights-example-snap@2.2.0 +[2.1.0]: https://github.com/MetaMask/snaps/compare/@metamask/insights-example-snap@2.0.2...@metamask/insights-example-snap@2.1.0 +[2.0.2]: https://github.com/MetaMask/snaps/compare/@metamask/insights-example-snap@2.0.1...@metamask/insights-example-snap@2.0.2 +[2.0.1]: https://github.com/MetaMask/snaps/compare/@metamask/insights-example-snap@2.0.0...@metamask/insights-example-snap@2.0.1 +[2.0.0]: https://github.com/MetaMask/snaps/compare/@metamask/insights-example-snap@1.0.0...@metamask/insights-example-snap@2.0.0 +[1.0.0]: https://github.com/MetaMask/snaps/compare/@metamask/insights-example-snap@0.38.1-flask.1...@metamask/insights-example-snap@1.0.0 +[0.38.1-flask.1]: https://github.com/MetaMask/snaps/compare/@metamask/insights-example-snap@0.38.0-flask.1...@metamask/insights-example-snap@0.38.1-flask.1 +[0.38.0-flask.1]: https://github.com/MetaMask/snaps/compare/@metamask/insights-example-snap@0.37.2-flask.1...@metamask/insights-example-snap@0.38.0-flask.1 +[0.37.2-flask.1]: https://github.com/MetaMask/snaps/releases/tag/@metamask/insights-example-snap@0.37.2-flask.1 diff --git a/packages/examples/packages/activity-item-insights/LICENSE.APACHE2 b/packages/examples/packages/activity-item-insights/LICENSE.APACHE2 new file mode 100644 index 0000000000..bf37d0e612 --- /dev/null +++ b/packages/examples/packages/activity-item-insights/LICENSE.APACHE2 @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2023 ConsenSys Software Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/examples/packages/activity-item-insights/LICENSE.MIT0 b/packages/examples/packages/activity-item-insights/LICENSE.MIT0 new file mode 100644 index 0000000000..913c577462 --- /dev/null +++ b/packages/examples/packages/activity-item-insights/LICENSE.MIT0 @@ -0,0 +1,16 @@ +MIT No Attribution + +Copyright 2023 ConsenSys Software Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/examples/packages/activity-item-insights/README.md b/packages/examples/packages/activity-item-insights/README.md new file mode 100644 index 0000000000..ad77616f12 --- /dev/null +++ b/packages/examples/packages/activity-item-insights/README.md @@ -0,0 +1,49 @@ +# `@metamask/activity-item-insights-example-snap` + +This snap demonstrates how to use the `endowment:activity-item-insight` permission +to provide historical transaction insights to the user. This snap uses the `onViewActivityItem` +handler to provide insights for *past* user transactions. + +Activity item insights are displayed in the transaction details modal, and +can show any [Snaps-based UI](../../../snaps-sdk) components. + +## Snap manifest + +> **Note**: Using `onViewActivityItem` requires the `endowment:activity-item-insight` +> permissions. Refer to [the documentation](https://docs.metamask.io/snaps/reference/permissions) +> for more information. + +Along with other permissions, the manifest of this snap includes the +`endowment:activity-item-insight` permission: + +```json +{ + "initialPermissions": { + "endowment:activity-item-insight": {} + } +} +``` + +By default, the `onViewActivityItem` does not receive the transaction origin. If you +want to receive the origin, you can add the `allowActivityItemOrigin` property to +the permission definition: + +```json +{ + "initialPermissions": { + "endowment:activity-item-insight": { + "allowActivityItemOrigin": true + } + } +} +``` + +## Snap usage + +This snap exposes an `onViewActivityItem` handler, which is called when a transaction details modal is opened by a user. The handler receives the transaction details and the +transaction origin (if the `allowActivityItemOrigin` property is set to `true`). + +The snap simply takes the details about the transaction and displays them. In practice a real Snap may want use transaction details to fetch insights from a remote server and display them to the user. + +For more information, you can refer to +[the end-to-end tests](./src/index.test.ts). diff --git a/packages/examples/packages/activity-item-insights/jest.config.js b/packages/examples/packages/activity-item-insights/jest.config.js new file mode 100644 index 0000000000..f473a91b83 --- /dev/null +++ b/packages/examples/packages/activity-item-insights/jest.config.js @@ -0,0 +1,36 @@ +const deepmerge = require('deepmerge'); + +const baseConfig = require('../../../../jest.config.base'); + +module.exports = deepmerge(baseConfig, { + preset: '@metamask/snaps-jest', + + // Since `@metamask/snaps-jest` runs in the browser, we can't collect + // coverage information. + collectCoverage: false, + + // This is required for the tests to run inside the `MetaMask/snaps` + // repository. You don't need this in your own project. + moduleNameMapper: { + '^@metamask/(.+)/production/jsx-runtime': [ + '/../../../$1/src/jsx/production/jsx-runtime', + '/../../../../node_modules/@metamask/$1/jsx/production/jsx-runtime', + '/node_modules/@metamask/$1/jsx/production/jsx-runtime', + ], + '^@metamask/(.+)/jsx': [ + '/../../../$1/src/jsx', + '/../../../../node_modules/@metamask/$1/jsx', + '/node_modules/@metamask/$1/jsx', + ], + '^@metamask/(.+)/node$': [ + '/../../../$1/src/node', + '/../../../../node_modules/@metamask/$1/node', + '/node_modules/@metamask/$1/node', + ], + '^@metamask/(.+)$': [ + '/../../../$1/src', + '/../../../../node_modules/@metamask/$1', + '/node_modules/@metamask/$1', + ], + }, +}); diff --git a/packages/examples/packages/activity-item-insights/package.json b/packages/examples/packages/activity-item-insights/package.json new file mode 100644 index 0000000000..57b547af9b --- /dev/null +++ b/packages/examples/packages/activity-item-insights/package.json @@ -0,0 +1,74 @@ +{ + "name": "@metamask/insights-example-snap", + "version": "2.2.3", + "description": "MetaMask example snap demonstrating the use of the Activity Item Insights API", + "keywords": [ + "MetaMask", + "Snaps", + "Ethereum" + ], + "homepage": "https://github.com/MetaMask/snaps/tree/main/packages/examples/packages/activity-item-insights#readme", + "bugs": { + "url": "https://github.com/MetaMask/snaps/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/MetaMask/snaps.git" + }, + "license": "(MIT-0 OR Apache-2.0)", + "sideEffects": false, + "main": "./dist/bundle.js", + "files": [ + "dist", + "snap.manifest.json" + ], + "scripts": { + "build": "mm-snap build", + "build:clean": "yarn clean && yarn build", + "changelog:update": "../../../../scripts/update-changelog.sh @metamask/insights-example-snap", + "changelog:validate": "../../../../scripts/validate-changelog.sh @metamask/insights-example-snap", + "clean": "rimraf \"dist\"", + "lint": "yarn lint:eslint && yarn lint:misc --check && yarn changelog:validate && yarn lint:dependencies", + "lint:ci": "yarn lint", + "lint:dependencies": "depcheck", + "lint:eslint": "eslint . --cache", + "lint:fix": "yarn lint:eslint --fix && yarn lint:misc --write", + "lint:misc": "prettier --no-error-on-unmatched-pattern --log-level warn \"**/*.json\" \"**/*.md\" \"**/*.html\" \"!CHANGELOG.md\" \"!snap.manifest.json\" --ignore-path ../../../../.gitignore", + "publish:preview": "yarn npm publish --tag preview", + "since-latest-release": "../../../../scripts/since-latest-release.sh", + "start": "mm-snap watch", + "test": "jest --reporters=jest-silent-reporter", + "test:clean": "jest --clearCache", + "test:verbose": "jest --verbose", + "test:watch": "jest --watch" + }, + "dependencies": { + "@metamask/snaps-sdk": "workspace:^", + "@metamask/utils": "^11.4.2" + }, + "devDependencies": { + "@jest/globals": "^29.5.0", + "@lavamoat/allow-scripts": "^3.3.4", + "@metamask/auto-changelog": "^5.0.2", + "@metamask/snaps-cli": "workspace:^", + "@metamask/snaps-jest": "workspace:^", + "@swc/core": "1.11.31", + "@swc/jest": "^0.2.38", + "@types/node": "18.14.2", + "deepmerge": "^4.2.2", + "depcheck": "^1.4.7", + "eslint": "^9.11.0", + "jest": "^29.0.2", + "jest-silent-reporter": "^0.6.0", + "prettier": "^3.3.3", + "ts-node": "^10.9.1", + "typescript": "~5.3.3" + }, + "engines": { + "node": "^20 || >=22" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + } +} diff --git a/packages/examples/packages/activity-item-insights/snap.config.ts b/packages/examples/packages/activity-item-insights/snap.config.ts new file mode 100644 index 0000000000..8a61578f96 --- /dev/null +++ b/packages/examples/packages/activity-item-insights/snap.config.ts @@ -0,0 +1,16 @@ +import type { SnapConfig } from '@metamask/snaps-cli'; + +const config: SnapConfig = { + input: './src/index.ts', + server: { + port: 8018, + }, + typescript: { + enabled: true, + }, + stats: { + buffer: false, + }, +}; + +export default config; diff --git a/packages/examples/packages/activity-item-insights/snap.manifest.json b/packages/examples/packages/activity-item-insights/snap.manifest.json new file mode 100644 index 0000000000..361f21b08e --- /dev/null +++ b/packages/examples/packages/activity-item-insights/snap.manifest.json @@ -0,0 +1,24 @@ +{ + "version": "2.2.3", + "description": "MetaMask example snap demonstrating the use of the View Activity Item Insights API.", + "proposedName": "Insights Example Snap", + "repository": { + "type": "git", + "url": "https://github.com/MetaMask/snaps.git" + }, + "source": { + "shasum": "xtETCsV7ar+PvDWsk8dW9mLv5BvG+cHlMf4H5GsJ9sA=", + "location": { + "npm": { + "filePath": "dist/bundle.js", + "packageName": "@metamask/insights-example-snap", + "registry": "https://registry.npmjs.org/" + } + } + }, + "initialPermissions": { + "endowment:transaction-insight": {} + }, + "platformVersion": "9.1.0", + "manifestVersion": "0.1" +} diff --git a/packages/examples/packages/activity-item-insights/src/index.test.ts b/packages/examples/packages/activity-item-insights/src/index.test.ts new file mode 100644 index 0000000000..cb26ae56d2 --- /dev/null +++ b/packages/examples/packages/activity-item-insights/src/index.test.ts @@ -0,0 +1,114 @@ +import { expect } from '@jest/globals'; +import { installSnap } from '@metamask/snaps-jest'; +import { panel, text, row, address } from '@metamask/snaps-sdk'; + +describe('onTransaction', () => { + const FROM_ADDRESS = '0xd8da6bf26964af9d7eed9e03e53415d37aa96045'; + const TO_ADDRESS = '0x4bbeeb066ed09b7aed07bf39eee0460dfa261520'; + + it('returns transaction insights for an ERC-20 transaction', async () => { + const { onTransaction } = await installSnap(); + + const response = await onTransaction({ + from: FROM_ADDRESS, + to: TO_ADDRESS, + // This is not a valid ERC-20 transfer as all the values are zero, but it + // is enough to test the `onTransaction` handler. + data: '0xa9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + }); + + const screen = response.getInterface(); + + expect(screen).toRender( + panel([ + row('From', address(FROM_ADDRESS)), + row('To', address(TO_ADDRESS)), + row('Transaction type', text('ERC-20')), + ]), + ); + }); + + it('returns transaction insights for an ERC-721 transaction', async () => { + const { onTransaction } = await installSnap(); + + const response = await onTransaction({ + from: FROM_ADDRESS, + to: TO_ADDRESS, + // This is not a valid ERC-721 transfer as all the values are zero, but it + // is enough to test the `onTransaction` handler. + data: '0x23b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + }); + + const screen = response.getInterface(); + + expect(screen).toRender( + panel([ + row('From', address(FROM_ADDRESS)), + row('To', address(TO_ADDRESS)), + row('Transaction type', text('ERC-721')), + ]), + ); + }); + + it('returns transaction insights for an ERC-1155 transaction', async () => { + const { onTransaction } = await installSnap(); + + const response = await onTransaction({ + from: FROM_ADDRESS, + to: TO_ADDRESS, + // This is not a valid ERC-1155 transfer as all the values are zero, but + // it is enough to test the `onTransaction` handler. + data: '0xf242432a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + }); + + const screen = response.getInterface(); + + expect(screen).toRender( + panel([ + row('From', address(FROM_ADDRESS)), + row('To', address(TO_ADDRESS)), + row('Transaction type', text('ERC-1155')), + ]), + ); + }); + + it('returns transaction insights for an unknown transaction', async () => { + const { onTransaction } = await installSnap(); + + const response = await onTransaction({ + from: FROM_ADDRESS, + to: TO_ADDRESS, + data: '0xabcdef1200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + }); + + const screen = response.getInterface(); + + expect(screen).toRender( + panel([ + row('From', address(FROM_ADDRESS)), + row('To', address(TO_ADDRESS)), + row('Transaction type', text('Unknown')), + ]), + ); + }); + + it('returns transaction insights for a transaction with no data', async () => { + const { onTransaction } = await installSnap(); + + const response = await onTransaction({ + from: FROM_ADDRESS, + to: TO_ADDRESS, + data: '0x', + }); + + const screen = response.getInterface(); + + expect(screen).toRender( + panel([ + row('From', address(FROM_ADDRESS)), + row('To', address(TO_ADDRESS)), + row('Transaction type', text('Unknown')), + ]), + ); + }); +}); diff --git a/packages/examples/packages/activity-item-insights/src/index.ts b/packages/examples/packages/activity-item-insights/src/index.ts new file mode 100644 index 0000000000..dca8dbd0a4 --- /dev/null +++ b/packages/examples/packages/activity-item-insights/src/index.ts @@ -0,0 +1,48 @@ +import type { OnViewActivityItemHandler } from '@metamask/snaps-sdk'; +import { SeverityLevel, panel, text, row, address } from '@metamask/snaps-sdk'; + +/** + * This event is called when a user clicks on a transaction to bring up the + * transaction details modal + * + * The `onViewActivityItem` handler returns a Snaps UI component, which is displayed + * in the activity item insights panel (transaction details modal). + * + * @param args - The request parameters. + * @param args.transactionMeta - The transaction object. This contains the + * transaction parameters, such as the `from`, `to`, `value`, and `data` fields. + * @param args.origin - The origin of the transaction. A URL is the transaction originated + * from a website or, for example, 'Metamask' if the transaction was initiated by the user. + * @param args.chainId - The chain ID of the transaction. + * @param args.selectedAddress - The address of the account that initiated the transaction. + * @param args.selectedAccount - The account object of the account that initiated the transaction. + * @returns The activity item insights. + */ + +export const onViewActivityItem: OnViewActivityItemHandler = async ({ + transactionMeta, + origin, + chainId, + selectedAddress, + selectedAccount, +}) => { + const { txParams } = transactionMeta; + const { from, to }: { from: string; to: string } = txParams as { + from: string; + to: string; + }; + + // this is a good place to do an async HTTP request to fetch insights from a remote server + + return { + content: panel([ + row('From', address(from as `0x${string}`)), + row('To', to ? address(to as `0x${string}`) : text('None')), + row('Origin', text(origin)), + row('Chain ID', text(chainId)), + row('Selected Account', text(selectedAccount)), + row('Our address', text(selectedAddress)), + ]), + severity: SeverityLevel.Critical, + }; +}; diff --git a/packages/examples/packages/activity-item-insights/tsconfig.json b/packages/examples/packages/activity-item-insights/tsconfig.json new file mode 100644 index 0000000000..17a40a6a74 --- /dev/null +++ b/packages/examples/packages/activity-item-insights/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": false, + "baseUrl": "./" + }, + "include": ["src", "snap.config.ts"] +} From 2a22d390b5b6d6f53941c5e1d4ae494e7fa8b4c4 Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Wed, 9 Jul 2025 21:09:58 -0700 Subject: [PATCH 14/18] Undo 'workspace' -> 'file:' package.json changes --- packages/snaps-cli/package.json | 10 +++++----- packages/snaps-controllers/package.json | 8 ++++---- packages/snaps-execution-environments/package.json | 4 ++-- packages/snaps-rpc-methods/package.json | 4 ++-- packages/snaps-utils/package.json | 2 +- packages/snaps-webpack-plugin/package.json | 6 +++--- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/snaps-cli/package.json b/packages/snaps-cli/package.json index f888ee184d..870cdf0065 100644 --- a/packages/snaps-cli/package.json +++ b/packages/snaps-cli/package.json @@ -64,11 +64,11 @@ "test:watch": "jest --watch" }, "dependencies": { - "@metamask/snaps-rpc-methods": "file:../snaps-rpc-methods", - "@metamask/snaps-sandbox": "file:../snaps-sandbox", - "@metamask/snaps-sdk": "file:../snaps-sdk", - "@metamask/snaps-utils": "file:../snaps-utils", - "@metamask/snaps-webpack-plugin": "file:../snaps-webpack-plugin", + "@metamask/snaps-rpc-methods": "workspace:^", + "@metamask/snaps-sandbox": "workspace:^", + "@metamask/snaps-sdk": "workspace:^", + "@metamask/snaps-utils": "workspace:^", + "@metamask/snaps-webpack-plugin": "workspace:^", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.4.2", "@swc/core": "1.11.31", diff --git a/packages/snaps-controllers/package.json b/packages/snaps-controllers/package.json index 8b826a9d32..e5b77e5e67 100644 --- a/packages/snaps-controllers/package.json +++ b/packages/snaps-controllers/package.json @@ -90,9 +90,9 @@ "@metamask/post-message-stream": "^10.0.0", "@metamask/rpc-errors": "^7.0.3", "@metamask/snaps-registry": "^3.2.3", - "@metamask/snaps-rpc-methods": "file:../snaps-rpc-methods", - "@metamask/snaps-sdk": "file:../snaps-sdk", - "@metamask/snaps-utils": "file:../snaps-utils", + "@metamask/snaps-rpc-methods": "workspace:^", + "@metamask/snaps-sdk": "workspace:^", + "@metamask/snaps-utils": "workspace:^", "@metamask/utils": "^11.4.2", "@xstate/fsm": "^2.0.0", "async-mutex": "^0.5.0", @@ -145,7 +145,7 @@ "vitest": "^3.1.1" }, "peerDependencies": { - "@metamask/snaps-execution-environments": "file:../snaps-execution-environments" + "@metamask/snaps-execution-environments": "workspace:^" }, "peerDependenciesMeta": { "@metamask/snaps-execution-environments": { diff --git a/packages/snaps-execution-environments/package.json b/packages/snaps-execution-environments/package.json index 5a9dfdc8ba..1236759a52 100644 --- a/packages/snaps-execution-environments/package.json +++ b/packages/snaps-execution-environments/package.json @@ -71,8 +71,8 @@ "@metamask/post-message-stream": "^10.0.0", "@metamask/providers": "^22.1.0", "@metamask/rpc-errors": "^7.0.3", - "@metamask/snaps-sdk": "file:../snaps-sdk", - "@metamask/snaps-utils": "file:../snaps-utils", + "@metamask/snaps-sdk": "workspace:^", + "@metamask/snaps-utils": "workspace:^", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.4.2", "readable-stream": "^3.6.2" diff --git a/packages/snaps-rpc-methods/package.json b/packages/snaps-rpc-methods/package.json index 9c2dfd36a8..4b835eddfa 100644 --- a/packages/snaps-rpc-methods/package.json +++ b/packages/snaps-rpc-methods/package.json @@ -58,8 +58,8 @@ "@metamask/key-tree": "^10.1.1", "@metamask/permission-controller": "^11.0.6", "@metamask/rpc-errors": "^7.0.3", - "@metamask/snaps-sdk": "file:../snaps-sdk", - "@metamask/snaps-utils": "file:../snaps-utils", + "@metamask/snaps-sdk": "workspace:^", + "@metamask/snaps-utils": "workspace:^", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.4.2", "@noble/hashes": "^1.7.1" diff --git a/packages/snaps-utils/package.json b/packages/snaps-utils/package.json index fbabc6a4ee..45455ca083 100644 --- a/packages/snaps-utils/package.json +++ b/packages/snaps-utils/package.json @@ -86,7 +86,7 @@ "@metamask/rpc-errors": "^7.0.3", "@metamask/slip44": "^4.2.0", "@metamask/snaps-registry": "^3.2.3", - "@metamask/snaps-sdk": "file:../snaps-sdk", + "@metamask/snaps-sdk": "workspace:^", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.4.2", "@noble/hashes": "^1.7.1", diff --git a/packages/snaps-webpack-plugin/package.json b/packages/snaps-webpack-plugin/package.json index 444816e824..9919bb15af 100644 --- a/packages/snaps-webpack-plugin/package.json +++ b/packages/snaps-webpack-plugin/package.json @@ -57,9 +57,9 @@ "test:watch": "jest --watch" }, "dependencies": { - "@metamask/snaps-rpc-methods": "file:../snaps-rpc-methods", - "@metamask/snaps-sdk": "file:../snaps-sdk", - "@metamask/snaps-utils": "file:../snaps-utils", + "@metamask/snaps-rpc-methods": "workspace:^", + "@metamask/snaps-sdk": "workspace:^", + "@metamask/snaps-utils": "workspace:^", "@metamask/utils": "^11.4.2", "chalk": "^4.1.2", "webpack-sources": "^3.2.3" From 56dc1204e8ed1730c2f05ae47debd5be41f0f5ad Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Wed, 9 Jul 2025 22:12:55 -0700 Subject: [PATCH 15/18] Change name from activityItem to transactionDetail --- .../.depcheckrc.json | 0 .../CHANGELOG.md | 0 .../LICENSE.APACHE2 | 0 .../LICENSE.MIT0 | 0 .../README.md | 24 +++---- .../jest.config.js | 0 .../package.json | 6 +- .../snap.config.ts | 0 .../snap.manifest.json | 2 +- .../src/index.test.ts | 0 .../src/index.ts | 10 +-- .../tsconfig.json | 0 .../src/insights/SnapInsightsController.ts | 28 ++++---- .../src/snaps/SnapController.ts | 8 +-- .../src/test-utils/controller.ts | 14 ++-- .../src/types/controllers.ts | 4 +- packages/snaps-controllers/src/utils.test.ts | 2 +- packages/snaps-controllers/src/utils.ts | 2 +- .../src/common/commands.test.ts | 4 +- .../src/common/commands.ts | 6 +- .../src/common/validation.test.ts | 8 +-- .../src/common/validation.ts | 16 ++--- .../snaps-rpc-methods/src/endowments/enum.ts | 2 +- .../snaps-rpc-methods/src/endowments/index.ts | 25 ++++--- ...ts => transaction-details-insight.test.ts} | 72 +++++++++---------- ...ight.ts => transaction-details-insight.ts} | 51 ++++++------- .../snaps-sdk/src/types/handlers/index.ts | 2 +- ...ctivity-item.ts => transaction-details.ts} | 22 +++--- packages/snaps-sdk/src/types/permissions.ts | 4 +- packages/snaps-utils/src/caveats.ts | 4 +- packages/snaps-utils/src/handlers/exports.ts | 8 +-- packages/snaps-utils/src/handlers/index.ts | 2 +- ...ctivity-item.ts => transaction-details.ts} | 12 ++-- packages/snaps-utils/src/handlers/types.ts | 2 +- .../snaps-utils/src/manifest/validation.ts | 4 +- 35 files changed, 173 insertions(+), 171 deletions(-) rename packages/examples/packages/{activity-item-insights => transaction-details-insights}/.depcheckrc.json (100%) rename packages/examples/packages/{activity-item-insights => transaction-details-insights}/CHANGELOG.md (100%) rename packages/examples/packages/{activity-item-insights => transaction-details-insights}/LICENSE.APACHE2 (100%) rename packages/examples/packages/{activity-item-insights => transaction-details-insights}/LICENSE.MIT0 (100%) rename packages/examples/packages/{activity-item-insights => transaction-details-insights}/README.md (50%) rename packages/examples/packages/{activity-item-insights => transaction-details-insights}/jest.config.js (100%) rename packages/examples/packages/{activity-item-insights => transaction-details-insights}/package.json (93%) rename packages/examples/packages/{activity-item-insights => transaction-details-insights}/snap.config.ts (100%) rename packages/examples/packages/{activity-item-insights => transaction-details-insights}/snap.manifest.json (93%) rename packages/examples/packages/{activity-item-insights => transaction-details-insights}/src/index.test.ts (100%) rename packages/examples/packages/{activity-item-insights => transaction-details-insights}/src/index.ts (81%) rename packages/examples/packages/{activity-item-insights => transaction-details-insights}/tsconfig.json (100%) rename packages/snaps-rpc-methods/src/endowments/{activity-item-insight.test.ts => transaction-details-insight.test.ts} (59%) rename packages/snaps-rpc-methods/src/endowments/{activity-item-insight.ts => transaction-details-insight.ts} (70%) rename packages/snaps-sdk/src/types/handlers/{activity-item.ts => transaction-details.ts} (77%) rename packages/snaps-utils/src/handlers/{activity-item.ts => transaction-details.ts} (58%) diff --git a/packages/examples/packages/activity-item-insights/.depcheckrc.json b/packages/examples/packages/transaction-details-insights/.depcheckrc.json similarity index 100% rename from packages/examples/packages/activity-item-insights/.depcheckrc.json rename to packages/examples/packages/transaction-details-insights/.depcheckrc.json diff --git a/packages/examples/packages/activity-item-insights/CHANGELOG.md b/packages/examples/packages/transaction-details-insights/CHANGELOG.md similarity index 100% rename from packages/examples/packages/activity-item-insights/CHANGELOG.md rename to packages/examples/packages/transaction-details-insights/CHANGELOG.md diff --git a/packages/examples/packages/activity-item-insights/LICENSE.APACHE2 b/packages/examples/packages/transaction-details-insights/LICENSE.APACHE2 similarity index 100% rename from packages/examples/packages/activity-item-insights/LICENSE.APACHE2 rename to packages/examples/packages/transaction-details-insights/LICENSE.APACHE2 diff --git a/packages/examples/packages/activity-item-insights/LICENSE.MIT0 b/packages/examples/packages/transaction-details-insights/LICENSE.MIT0 similarity index 100% rename from packages/examples/packages/activity-item-insights/LICENSE.MIT0 rename to packages/examples/packages/transaction-details-insights/LICENSE.MIT0 diff --git a/packages/examples/packages/activity-item-insights/README.md b/packages/examples/packages/transaction-details-insights/README.md similarity index 50% rename from packages/examples/packages/activity-item-insights/README.md rename to packages/examples/packages/transaction-details-insights/README.md index ad77616f12..bbf2c486b0 100644 --- a/packages/examples/packages/activity-item-insights/README.md +++ b/packages/examples/packages/transaction-details-insights/README.md @@ -1,7 +1,7 @@ -# `@metamask/activity-item-insights-example-snap` +# `@metamask/transaction-details-insights-example-snap` -This snap demonstrates how to use the `endowment:activity-item-insight` permission -to provide historical transaction insights to the user. This snap uses the `onViewActivityItem` +This snap demonstrates how to use the `endowment:transaction-details-insight` permission +to provide historical transaction insights to the user. This snap uses the `onTransactionDetails` handler to provide insights for *past* user transactions. Activity item insights are displayed in the transaction details modal, and @@ -9,30 +9,30 @@ can show any [Snaps-based UI](../../../snaps-sdk) components. ## Snap manifest -> **Note**: Using `onViewActivityItem` requires the `endowment:activity-item-insight` +> **Note**: Using `onTransactionDetails` requires the `endowment:transaction-details-insight` > permissions. Refer to [the documentation](https://docs.metamask.io/snaps/reference/permissions) > for more information. Along with other permissions, the manifest of this snap includes the -`endowment:activity-item-insight` permission: +`endowment:transaction-details-insight` permission: ```json { "initialPermissions": { - "endowment:activity-item-insight": {} + "endowment:transaction-details-insight": {} } } ``` -By default, the `onViewActivityItem` does not receive the transaction origin. If you -want to receive the origin, you can add the `allowActivityItemOrigin` property to +By default, the `onTransactionDetails` does not receive the transaction origin. If you +want to receive the origin, you can add the `allowTransactionDetailsOrigin` property to the permission definition: ```json { "initialPermissions": { - "endowment:activity-item-insight": { - "allowActivityItemOrigin": true + "endowment:transaction-details-insight": { + "allowTransactionDetailsOrigin": true } } } @@ -40,8 +40,8 @@ the permission definition: ## Snap usage -This snap exposes an `onViewActivityItem` handler, which is called when a transaction details modal is opened by a user. The handler receives the transaction details and the -transaction origin (if the `allowActivityItemOrigin` property is set to `true`). +This snap exposes an `onTransactionDetails` handler, which is called when a transaction details modal is opened by a user. The handler receives the transaction details and the +transaction origin (if the `allowTransactionDetailsOrigin` property is set to `true`). The snap simply takes the details about the transaction and displays them. In practice a real Snap may want use transaction details to fetch insights from a remote server and display them to the user. diff --git a/packages/examples/packages/activity-item-insights/jest.config.js b/packages/examples/packages/transaction-details-insights/jest.config.js similarity index 100% rename from packages/examples/packages/activity-item-insights/jest.config.js rename to packages/examples/packages/transaction-details-insights/jest.config.js diff --git a/packages/examples/packages/activity-item-insights/package.json b/packages/examples/packages/transaction-details-insights/package.json similarity index 93% rename from packages/examples/packages/activity-item-insights/package.json rename to packages/examples/packages/transaction-details-insights/package.json index 57b547af9b..d4c3b91f68 100644 --- a/packages/examples/packages/activity-item-insights/package.json +++ b/packages/examples/packages/transaction-details-insights/package.json @@ -1,13 +1,13 @@ { - "name": "@metamask/insights-example-snap", + "name": "@metamask/transaction-details-insights-example-snap", "version": "2.2.3", - "description": "MetaMask example snap demonstrating the use of the Activity Item Insights API", + "description": "MetaMask example snap demonstrating the use of the Transaction Details Insights API", "keywords": [ "MetaMask", "Snaps", "Ethereum" ], - "homepage": "https://github.com/MetaMask/snaps/tree/main/packages/examples/packages/activity-item-insights#readme", + "homepage": "https://github.com/MetaMask/snaps/tree/main/packages/examples/packages/transaction-details-insights#readme", "bugs": { "url": "https://github.com/MetaMask/snaps/issues" }, diff --git a/packages/examples/packages/activity-item-insights/snap.config.ts b/packages/examples/packages/transaction-details-insights/snap.config.ts similarity index 100% rename from packages/examples/packages/activity-item-insights/snap.config.ts rename to packages/examples/packages/transaction-details-insights/snap.config.ts diff --git a/packages/examples/packages/activity-item-insights/snap.manifest.json b/packages/examples/packages/transaction-details-insights/snap.manifest.json similarity index 93% rename from packages/examples/packages/activity-item-insights/snap.manifest.json rename to packages/examples/packages/transaction-details-insights/snap.manifest.json index 361f21b08e..156c643841 100644 --- a/packages/examples/packages/activity-item-insights/snap.manifest.json +++ b/packages/examples/packages/transaction-details-insights/snap.manifest.json @@ -1,6 +1,6 @@ { "version": "2.2.3", - "description": "MetaMask example snap demonstrating the use of the View Activity Item Insights API.", + "description": "MetaMask example snap demonstrating the use of the View Transaction Details Insights API.", "proposedName": "Insights Example Snap", "repository": { "type": "git", diff --git a/packages/examples/packages/activity-item-insights/src/index.test.ts b/packages/examples/packages/transaction-details-insights/src/index.test.ts similarity index 100% rename from packages/examples/packages/activity-item-insights/src/index.test.ts rename to packages/examples/packages/transaction-details-insights/src/index.test.ts diff --git a/packages/examples/packages/activity-item-insights/src/index.ts b/packages/examples/packages/transaction-details-insights/src/index.ts similarity index 81% rename from packages/examples/packages/activity-item-insights/src/index.ts rename to packages/examples/packages/transaction-details-insights/src/index.ts index dca8dbd0a4..f4883453ee 100644 --- a/packages/examples/packages/activity-item-insights/src/index.ts +++ b/packages/examples/packages/transaction-details-insights/src/index.ts @@ -1,12 +1,12 @@ -import type { OnViewActivityItemHandler } from '@metamask/snaps-sdk'; +import type { OnTransactionDetailsHandler } from '@metamask/snaps-sdk'; import { SeverityLevel, panel, text, row, address } from '@metamask/snaps-sdk'; /** * This event is called when a user clicks on a transaction to bring up the * transaction details modal * - * The `onViewActivityItem` handler returns a Snaps UI component, which is displayed - * in the activity item insights panel (transaction details modal). + * The `onTransactionDetails` handler returns a Snaps UI component, which is displayed + * in the transaction details insights panel (transaction details modal). * * @param args - The request parameters. * @param args.transactionMeta - The transaction object. This contains the @@ -16,10 +16,10 @@ import { SeverityLevel, panel, text, row, address } from '@metamask/snaps-sdk'; * @param args.chainId - The chain ID of the transaction. * @param args.selectedAddress - The address of the account that initiated the transaction. * @param args.selectedAccount - The account object of the account that initiated the transaction. - * @returns The activity item insights. + * @returns The transaction details insights. */ -export const onViewActivityItem: OnViewActivityItemHandler = async ({ +export const onTransactionDetails: OnTransactionDetailsHandler = async ({ transactionMeta, origin, chainId, diff --git a/packages/examples/packages/activity-item-insights/tsconfig.json b/packages/examples/packages/transaction-details-insights/tsconfig.json similarity index 100% rename from packages/examples/packages/activity-item-insights/tsconfig.json rename to packages/examples/packages/transaction-details-insights/tsconfig.json diff --git a/packages/snaps-controllers/src/insights/SnapInsightsController.ts b/packages/snaps-controllers/src/insights/SnapInsightsController.ts index e75046686a..3eda7171fd 100644 --- a/packages/snaps-controllers/src/insights/SnapInsightsController.ts +++ b/packages/snaps-controllers/src/insights/SnapInsightsController.ts @@ -10,7 +10,7 @@ import type { ValidPermission, } from '@metamask/permission-controller'; import { - getActivityItemOriginCaveat, + getTransactionDetailsOriginCaveat, getSignatureOriginCaveat, getTransactionOriginCaveat, SnapEndowments, @@ -25,7 +25,7 @@ import { getRunnableSnaps } from '../snaps'; import type { TransactionControllerUnapprovedTransactionAddedEvent, TransactionMeta, - TransactionControllerActivityItemViewedEvent, + TransactionControllerTransactionDetailsViewedEvent, SignatureStateChange, SignatureControllerState, StateSignature, @@ -58,7 +58,7 @@ export type SnapInsightControllerEvents = SnapInsightControllerStateChangeEvent; export type SnapInsightsControllerAllowedEvents = | TransactionControllerUnapprovedTransactionAddedEvent | TransactionControllerTransactionStatusUpdatedEvent - | TransactionControllerActivityItemViewedEvent + | TransactionControllerTransactionDetailsViewedEvent | SignatureStateChange; export type SnapInsightsControllerMessenger = RestrictedMessenger< @@ -125,8 +125,8 @@ export class SnapInsightsController extends BaseController< ); this.messagingSystem.subscribe( - 'TransactionController:activityItemViewed', - this.#handleViewActivityItem.bind(this), + 'TransactionController:transactionDetailsViewed', + this.#handleTransactionDetails.bind(this), ); } @@ -167,7 +167,7 @@ export class SnapInsightsController extends BaseController< }, []); } - #handleViewActivityItem({ + #handleTransactionDetails({ transactionMeta, selectedAddress, selectedAccount, @@ -181,7 +181,7 @@ export class SnapInsightsController extends BaseController< const caipChainId = `eip155:${hexToBigInt(chainId).toString(10)}`; const snaps = this.#getSnapsWithPermission( - SnapEndowments.ActivityItemInsight, + SnapEndowments.TransactionDetailsInsight, ); snaps.forEach(({ snapId, permission }) => { @@ -191,18 +191,18 @@ export class SnapInsightsController extends BaseController< }); // Check if snap has transactionOrigin caveat - const hasActivityItemOriginCaveat = - getActivityItemOriginCaveat(permission); - const activityItemOrigin = - hasActivityItemOriginCaveat && origin ? origin : null; + const hasTransactionDetailsOriginCaveat = + getTransactionDetailsOriginCaveat(permission); + const transactionDetailsOrigin = + hasTransactionDetailsOriginCaveat && origin ? origin : null; this.#handleSnapRequest({ snapId, - handler: HandlerType.OnViewActivityItem, + handler: HandlerType.OnTransactionDetails, params: { transactionMeta, chainId: caipChainId, - origin: activityItemOrigin, + origin: transactionDetailsOrigin, selectedAddress, selectedAccount, }, @@ -418,7 +418,7 @@ export class SnapInsightsController extends BaseController< handler: | HandlerType.OnTransaction | HandlerType.OnSignature - | HandlerType.OnViewActivityItem; + | HandlerType.OnTransactionDetails; params: Record; }) { return this.messagingSystem.call('SnapController:handleRequest', { diff --git a/packages/snaps-controllers/src/snaps/SnapController.ts b/packages/snaps-controllers/src/snaps/SnapController.ts index 5e6b8a1d2f..a20f283b6c 100644 --- a/packages/snaps-controllers/src/snaps/SnapController.ts +++ b/packages/snaps-controllers/src/snaps/SnapController.ts @@ -91,7 +91,7 @@ import { logError, normalizeRelative, OnTransactionResponseStruct, - OnViewActivityItemResponseStruct, + OnTransactionDetailsResponseStruct, OnSignatureResponseStruct, resolveVersionRange, SnapCaveatType, @@ -3777,7 +3777,7 @@ export class SnapController extends BaseController< switch (handlerType) { case HandlerType.OnTransaction: case HandlerType.OnSignature: - case HandlerType.OnViewActivityItem: + case HandlerType.OnTransactionDetails: case HandlerType.OnHomePage: case HandlerType.OnSettingsPage: { // Since this type has been asserted earlier we can cast @@ -4002,8 +4002,8 @@ export class SnapController extends BaseController< break; } - case HandlerType.OnViewActivityItem: { - assertStruct(result, OnViewActivityItemResponseStruct); + case HandlerType.OnTransactionDetails: { + assertStruct(result, OnTransactionDetailsResponseStruct); if (result && hasProperty(result, 'id')) { this.#assertInterfaceExists(snapId, result.id as string); } diff --git a/packages/snaps-controllers/src/test-utils/controller.ts b/packages/snaps-controllers/src/test-utils/controller.ts index 2f75ff219a..356f6518f7 100644 --- a/packages/snaps-controllers/src/test-utils/controller.ts +++ b/packages/snaps-controllers/src/test-utils/controller.ts @@ -287,17 +287,17 @@ export const MOCK_INSIGHTS_PERMISSIONS: Record = { invoker: MOCK_SNAP_ID, parentCapability: SnapEndowments.SignatureInsight, }, - [SnapEndowments.ActivityItemInsight]: { + [SnapEndowments.TransactionDetailsInsight]: { caveats: [ { - type: SnapCaveatType.ActivityItemOrigin, + type: SnapCaveatType.TransactionDetailsOrigin, value: true, }, ], date: 1664187844588, id: 'izn0WGUO8cvq_jqvLQuQP', invoker: MOCK_SNAP_ID, - parentCapability: SnapEndowments.ActivityItemInsight, + parentCapability: SnapEndowments.TransactionDetailsInsight, }, }; @@ -317,17 +317,17 @@ export const MOCK_INSIGHTS_PERMISSIONS_NO_ORIGINS: Record< invoker: MOCK_SNAP_ID, parentCapability: SnapEndowments.TransactionInsight, }, - [SnapEndowments.ActivityItemInsight]: { + [SnapEndowments.TransactionDetailsInsight]: { caveats: [ { - type: SnapCaveatType.ActivityItemOrigin, + type: SnapCaveatType.TransactionDetailsOrigin, value: false, }, ], date: 1664187844588, id: 'izn0WGUO8cvq_jqvLQuQP', invoker: MOCK_SNAP_ID, - parentCapability: SnapEndowments.ActivityItemInsight, + parentCapability: SnapEndowments.TransactionDetailsInsight, }, [SnapEndowments.SignatureInsight]: { caveats: [ @@ -919,7 +919,7 @@ export const getRestrictedSnapInsightsControllerMessenger = ( >({ name: 'SnapInsightsController', allowedEvents: [ - 'TransactionController:activityItemViewed', + 'TransactionController:transactionDetailsViewed', 'TransactionController:unapprovedTransactionAdded', 'TransactionController:transactionStatusUpdated', 'SignatureController:stateChange', diff --git a/packages/snaps-controllers/src/types/controllers.ts b/packages/snaps-controllers/src/types/controllers.ts index 15d6c9be5c..d1c4fa2200 100644 --- a/packages/snaps-controllers/src/types/controllers.ts +++ b/packages/snaps-controllers/src/types/controllers.ts @@ -136,8 +136,8 @@ export type TransactionControllerTransactionStatusUpdatedEvent = { ]; }; -export type TransactionControllerActivityItemViewedEvent = { - type: `TransactionController:activityItemViewed`; +export type TransactionControllerTransactionDetailsViewedEvent = { + type: `TransactionController:transactionDetailsViewed`; payload: [ { transactionMeta: TransactionMeta; diff --git a/packages/snaps-controllers/src/utils.test.ts b/packages/snaps-controllers/src/utils.test.ts index 3fe59a4f62..97f5ee3dbf 100644 --- a/packages/snaps-controllers/src/utils.test.ts +++ b/packages/snaps-controllers/src/utils.test.ts @@ -233,7 +233,7 @@ describe('TRACKABLE_HANDLERS', () => { HandlerType.OnRpcRequest, HandlerType.OnSignature, HandlerType.OnTransaction, - HandlerType.OnViewActivityItem, + HandlerType.OnTransactionDetails, HandlerType.OnUpdate, ]); }); diff --git a/packages/snaps-controllers/src/utils.ts b/packages/snaps-controllers/src/utils.ts index 6620794ea2..4ad632f863 100644 --- a/packages/snaps-controllers/src/utils.ts +++ b/packages/snaps-controllers/src/utils.ts @@ -387,7 +387,7 @@ export const TRACKABLE_HANDLERS = Object.freeze([ HandlerType.OnRpcRequest, HandlerType.OnSignature, HandlerType.OnTransaction, - HandlerType.OnViewActivityItem, + HandlerType.OnTransactionDetails, HandlerType.OnUpdate, ] as const); diff --git a/packages/snaps-execution-environments/src/common/commands.test.ts b/packages/snaps-execution-environments/src/common/commands.test.ts index ec3ae6e679..585f308cda 100644 --- a/packages/snaps-execution-environments/src/common/commands.test.ts +++ b/packages/snaps-execution-environments/src/common/commands.test.ts @@ -19,9 +19,9 @@ describe('getHandlerArguments', () => { ).toThrow('Invalid request params'); }); - it('validates the request params for the OnViewActivityItem handler', () => { + it('validates the request params for the OnTransactionDetails handler', () => { expect(() => - getHandlerArguments(MOCK_ORIGIN, HandlerType.OnViewActivityItem, { + getHandlerArguments(MOCK_ORIGIN, HandlerType.OnTransactionDetails, { id: 1, jsonrpc: '2.0', method: 'foo', diff --git a/packages/snaps-execution-environments/src/common/commands.ts b/packages/snaps-execution-environments/src/common/commands.ts index d45657c644..5b79560cc1 100644 --- a/packages/snaps-execution-environments/src/common/commands.ts +++ b/packages/snaps-execution-environments/src/common/commands.ts @@ -21,7 +21,7 @@ import { assertIsOnAssetHistoricalPriceRequestArguments, assertIsOnWebSocketEventArguments, assertIsOnAssetsMarketDataRequestArguments, - assertIsOnViewActivityItemRequestArguments, + assertIsOnTransactionDetailsRequestArguments, } from './validation'; export type CommandMethodsMapping = { @@ -58,8 +58,8 @@ export function getHandlerArguments( }; } - case HandlerType.OnViewActivityItem: { - assertIsOnViewActivityItemRequestArguments(request.params); + case HandlerType.OnTransactionDetails: { + assertIsOnTransactionDetailsRequestArguments(request.params); const { transactionMeta, chainId, selectedAddress, selectedAccount } = request.params; return { diff --git a/packages/snaps-execution-environments/src/common/validation.test.ts b/packages/snaps-execution-environments/src/common/validation.test.ts index 3beea2d005..5a9b042068 100644 --- a/packages/snaps-execution-environments/src/common/validation.test.ts +++ b/packages/snaps-execution-environments/src/common/validation.test.ts @@ -9,7 +9,7 @@ import { assertIsOnProtocolRequestArguments, assertIsOnSignatureRequestArguments, assertIsOnTransactionRequestArguments, - assertIsOnViewActivityItemRequestArguments, + assertIsOnTransactionDetailsRequestArguments, assertIsOnUserInputRequestArguments, isEndowment, isEndowmentsArray, @@ -90,7 +90,7 @@ describe('assertIsOnTransactionRequestArguments', () => { ); }); -describe('assertIsOnViewActivityItemRequestArguments', () => { +describe('assertIsOnTransactionDetailsRequestArguments', () => { it.each([ { transactionMeta: { foo: 'bar' }, @@ -115,7 +115,7 @@ describe('assertIsOnViewActivityItemRequestArguments', () => { }, ])('does not throw for a valid transaction params object', (args) => { expect(() => - assertIsOnViewActivityItemRequestArguments(args), + assertIsOnTransactionDetailsRequestArguments(args), ).not.toThrow(); }); @@ -164,7 +164,7 @@ describe('assertIsOnViewActivityItemRequestArguments', () => { 'throws if the value is not a valid transaction params object', (value) => { expect(() => - assertIsOnViewActivityItemRequestArguments(value as any), + assertIsOnTransactionDetailsRequestArguments(value as any), ).toThrow('Invalid request params:'); }, ); diff --git a/packages/snaps-execution-environments/src/common/validation.ts b/packages/snaps-execution-environments/src/common/validation.ts index 3560cd04d9..362d36d68c 100644 --- a/packages/snaps-execution-environments/src/common/validation.ts +++ b/packages/snaps-execution-environments/src/common/validation.ts @@ -171,7 +171,7 @@ export function assertIsOnTransactionRequestArguments( assertRequestArguments(value, OnTransactionRequestArgumentsStruct); } -export const OnViewActivityItemRequestArgumentsStruct = object({ +export const OnTransactionDetailsRequestArgumentsStruct = object({ transactionMeta: record(string(), JsonStruct), origin: nullable(string()), chainId: CaipChainIdStruct, @@ -179,22 +179,22 @@ export const OnViewActivityItemRequestArgumentsStruct = object({ selectedAccount: record(string(), JsonStruct), }); -export type OnViewActivityItemRequestArguments = Infer< - typeof OnViewActivityItemRequestArgumentsStruct +export type OnTransactionDetailsRequestArguments = Infer< + typeof OnTransactionDetailsRequestArgumentsStruct >; /** - * Asserts that the given value is a valid {@link OnViewActivityItemRequestArguments} + * Asserts that the given value is a valid {@link OnTransactionDetailsRequestArguments} * object. * * @param value - The value to validate. - * @throws If the value is not a valid {@link OnViewActivityItemRequestArguments} + * @throws If the value is not a valid {@link OnTransactionDetailsRequestArguments} * object. */ -export function assertIsOnViewActivityItemRequestArguments( +export function assertIsOnTransactionDetailsRequestArguments( value: unknown, -): asserts value is OnViewActivityItemRequestArguments { - assertRequestArguments(value, OnViewActivityItemRequestArgumentsStruct); +): asserts value is OnTransactionDetailsRequestArguments { + assertRequestArguments(value, OnTransactionDetailsRequestArgumentsStruct); } export const OnSignatureRequestArgumentsStruct = object({ diff --git a/packages/snaps-rpc-methods/src/endowments/enum.ts b/packages/snaps-rpc-methods/src/endowments/enum.ts index f17eca912d..76aa0cd100 100644 --- a/packages/snaps-rpc-methods/src/endowments/enum.ts +++ b/packages/snaps-rpc-methods/src/endowments/enum.ts @@ -2,7 +2,7 @@ export enum SnapEndowments { NetworkAccess = 'endowment:network-access', SignatureInsight = 'endowment:signature-insight', TransactionInsight = 'endowment:transaction-insight', - ActivityItemInsight = 'endowment:activity-item-insight', + TransactionDetailsInsight = 'endowment:transaction-details-insight', Cronjob = 'endowment:cronjob', EthereumProvider = 'endowment:ethereum-provider', Rpc = 'endowment:rpc', diff --git a/packages/snaps-rpc-methods/src/endowments/index.ts b/packages/snaps-rpc-methods/src/endowments/index.ts index 3552b4e07d..6d47c444f6 100644 --- a/packages/snaps-rpc-methods/src/endowments/index.ts +++ b/packages/snaps-rpc-methods/src/endowments/index.ts @@ -3,10 +3,10 @@ import { HandlerType } from '@metamask/snaps-utils'; import type { Json } from '@metamask/utils'; import { - activityItemInsightCaveatSpecifications, - activityItemInsightEndowmentBuilder, - getActivityItemInsightCaveatMapper, -} from './activity-item-insight'; + transactionDetailsInsightCaveatSpecifications, + transactionDetailsInsightEndowmentBuilder, + getTransactionDetailsInsightCaveatMapper, +} from './transaction-details-insight'; import { assetsEndowmentBuilder, getAssetsCaveatMapper } from './assets'; import { createMaxRequestTimeMapper, @@ -59,8 +59,8 @@ export const endowmentPermissionBuilders = { [networkAccessEndowmentBuilder.targetName]: networkAccessEndowmentBuilder, [transactionInsightEndowmentBuilder.targetName]: transactionInsightEndowmentBuilder, - [activityItemInsightEndowmentBuilder.targetName]: - activityItemInsightEndowmentBuilder, + [transactionDetailsInsightEndowmentBuilder.targetName]: + transactionDetailsInsightEndowmentBuilder, [cronjobEndowmentBuilder.targetName]: cronjobEndowmentBuilder, [ethereumProviderEndowmentBuilder.targetName]: ethereumProviderEndowmentBuilder, @@ -80,7 +80,7 @@ export const endowmentPermissionBuilders = { export const endowmentCaveatSpecifications = { ...cronjobCaveatSpecifications, ...transactionInsightCaveatSpecifications, - ...activityItemInsightCaveatSpecifications, + ...transactionDetailsInsightCaveatSpecifications, ...rpcCaveatSpecifications, ...nameLookupCaveatSpecifications, ...keyringCaveatSpecifications, @@ -99,9 +99,8 @@ export const endowmentCaveatMappers: Record< [transactionInsightEndowmentBuilder.targetName]: createMaxRequestTimeMapper( getTransactionInsightCaveatMapper, ), - [activityItemInsightEndowmentBuilder.targetName]: createMaxRequestTimeMapper( - getActivityItemInsightCaveatMapper, - ), + [transactionDetailsInsightEndowmentBuilder.targetName]: + createMaxRequestTimeMapper(getTransactionDetailsInsightCaveatMapper), [rpcEndowmentBuilder.targetName]: createMaxRequestTimeMapper(getRpcCaveatMapper), [nameLookupEndowmentBuilder.targetName]: createMaxRequestTimeMapper( @@ -128,8 +127,8 @@ export const endowmentCaveatMappers: Record< export const handlerEndowments: Record = { [HandlerType.OnRpcRequest]: rpcEndowmentBuilder.targetName, [HandlerType.OnTransaction]: transactionInsightEndowmentBuilder.targetName, - [HandlerType.OnViewActivityItem]: - activityItemInsightEndowmentBuilder.targetName, + [HandlerType.OnTransactionDetails]: + transactionDetailsInsightEndowmentBuilder.targetName, [HandlerType.OnCronjob]: cronjobEndowmentBuilder.targetName, [HandlerType.OnNameLookup]: nameLookupEndowmentBuilder.targetName, [HandlerType.OnInstall]: lifecycleHooksEndowmentBuilder.targetName, @@ -153,7 +152,7 @@ export * from './enum'; export { getRpcCaveatOrigins } from './rpc'; export { getSignatureOriginCaveat } from './signature-insight'; export { getTransactionOriginCaveat } from './transaction-insight'; -export { getActivityItemOriginCaveat } from './activity-item-insight'; +export { getTransactionDetailsOriginCaveat } from './transaction-details-insight'; export { getChainIdsCaveat, getLookupMatchersCaveat } from './name-lookup'; export { getKeyringCaveatOrigins } from './keyring'; export { getMaxRequestTimeCaveat } from './caveats'; diff --git a/packages/snaps-rpc-methods/src/endowments/activity-item-insight.test.ts b/packages/snaps-rpc-methods/src/endowments/transaction-details-insight.test.ts similarity index 59% rename from packages/snaps-rpc-methods/src/endowments/activity-item-insight.test.ts rename to packages/snaps-rpc-methods/src/endowments/transaction-details-insight.test.ts index d84af262d7..1a788b7577 100644 --- a/packages/snaps-rpc-methods/src/endowments/activity-item-insight.test.ts +++ b/packages/snaps-rpc-methods/src/endowments/transaction-details-insight.test.ts @@ -2,22 +2,22 @@ import type { PermissionConstraint } from '@metamask/permission-controller'; import { PermissionType, SubjectType } from '@metamask/permission-controller'; import { SnapCaveatType } from '@metamask/snaps-utils'; -import { getActivityItemOriginCaveat, SnapEndowments } from '.'; +import { getTransactionDetailsOriginCaveat, SnapEndowments } from '.'; import { - activityItemInsightEndowmentBuilder, - activityItemInsightCaveatSpecifications, - getActivityItemInsightCaveatMapper, -} from './activity-item-insight'; + transactionDetailsInsightEndowmentBuilder, + transactionDetailsInsightCaveatSpecifications, + getTransactionDetailsInsightCaveatMapper, +} from './transaction-details-insight'; -describe('endowment:activity-item-insight-insight', () => { +describe('endowment:transaction-details-insight-insight', () => { const specification = - activityItemInsightEndowmentBuilder.specificationBuilder({}); + transactionDetailsInsightEndowmentBuilder.specificationBuilder({}); it('builds the expected permission specification', () => { expect(specification).toStrictEqual({ permissionType: PermissionType.Endowment, - targetName: SnapEndowments.ActivityItemInsight, + targetName: SnapEndowments.TransactionDetailsInsight, allowedCaveats: [ - SnapCaveatType.ActivityItemOrigin, + SnapCaveatType.TransactionDetailsOrigin, SnapCaveatType.MaxRequestTime, ], endowmentGetter: expect.any(Function), @@ -36,22 +36,22 @@ describe('endowment:activity-item-insight-insight', () => { ).not.toThrow(); }); - it('throws if the caveat is not a single "activityItemOrigin"', () => { + it('throws if the caveat is not a single "transactionDetailsOrigin"', () => { expect(() => // @ts-expect-error Missing other required permission types. specification.validator({ caveats: [{ type: 'foo', value: 'bar' }], }), ).toThrow( - 'Expected the following caveats: "activityItemOrigin", "maxRequestTime", received "foo".', + 'Expected the following caveats: "transactionDetailsOrigin", "maxRequestTime", received "foo".', ); expect(() => // @ts-expect-error Missing other required permission types. specification.validator({ caveats: [ - { type: 'activityItemOrigin', value: [] }, - { type: 'activityItemOrigin', value: [] }, + { type: 'transactionDetailsOrigin', value: [] }, + { type: 'transactionDetailsOrigin', value: [] }, ], }), ).toThrow('Duplicate caveats are not allowed.'); @@ -59,8 +59,8 @@ describe('endowment:activity-item-insight-insight', () => { }); }); -describe('getActivityItemOriginCaveat', () => { - it('returns the value from a activity item insight permission', () => { +describe('getTransactionDetailsOriginCaveat', () => { + it('returns the value from a transaction details insight permission', () => { const permission: PermissionConstraint = { date: 0, parentCapability: 'foo', @@ -68,17 +68,17 @@ describe('getActivityItemOriginCaveat', () => { id: 'baz', caveats: [ { - type: SnapCaveatType.ActivityItemOrigin, + type: SnapCaveatType.TransactionDetailsOrigin, value: true, }, ], }; - expect(getActivityItemOriginCaveat(permission)).toBe(true); + expect(getTransactionDetailsOriginCaveat(permission)).toBe(true); }); it('returns null if the input is undefined', () => { - expect(getActivityItemOriginCaveat(undefined)).toBeNull(); + expect(getTransactionDetailsOriginCaveat(undefined)).toBeNull(); }); it('returns null if the permission does not have caveats', () => { @@ -90,7 +90,7 @@ describe('getActivityItemOriginCaveat', () => { caveats: null, }; - expect(getActivityItemOriginCaveat(permission)).toBeNull(); + expect(getTransactionDetailsOriginCaveat(permission)).toBeNull(); }); it('throws if the permission does not have exactly one caveat', () => { @@ -101,22 +101,22 @@ describe('getActivityItemOriginCaveat', () => { id: 'baz', caveats: [ { - type: SnapCaveatType.ActivityItemOrigin, + type: SnapCaveatType.TransactionDetailsOrigin, value: true, }, { - type: SnapCaveatType.ActivityItemOrigin, + type: SnapCaveatType.TransactionDetailsOrigin, value: true, }, ], }; - expect(() => getActivityItemOriginCaveat(permission)).toThrow( + expect(() => getTransactionDetailsOriginCaveat(permission)).toThrow( 'Assertion failed', ); }); - it('throws if the first caveat is not a "activityItemOrigin" caveat', () => { + it('throws if the first caveat is not a "transactionDetailsOrigin" caveat', () => { const permission: PermissionConstraint = { date: 0, parentCapability: 'foo', @@ -130,22 +130,22 @@ describe('getActivityItemOriginCaveat', () => { ], }; - expect(() => getActivityItemOriginCaveat(permission)).toThrow( + expect(() => getTransactionDetailsOriginCaveat(permission)).toThrow( 'Assertion failed', ); }); }); -describe('getActivityItemInsightCaveatMapper', () => { +describe('getTransactionDetailsInsightCaveatMapper', () => { it('maps input to a caveat', () => { expect( - getActivityItemInsightCaveatMapper({ - allowActivityItemOrigin: true, + getTransactionDetailsInsightCaveatMapper({ + allowTransactionDetailsOrigin: true, }), ).toStrictEqual({ caveats: [ { - type: 'activityItemOrigin', + type: 'transactionDetailsOrigin', value: true, }, ], @@ -153,31 +153,31 @@ describe('getActivityItemInsightCaveatMapper', () => { }); it('does not include caveat if input is empty object', () => { - expect(getActivityItemInsightCaveatMapper({})).toStrictEqual({ + expect(getTransactionDetailsInsightCaveatMapper({})).toStrictEqual({ caveats: null, }); }); }); -describe('activityItemInsightCaveatSpecifications', () => { +describe('transactionDetailsInsightCaveatSpecifications', () => { describe('validator', () => { it('throws if the caveat values are invalid', () => { expect(() => - activityItemInsightCaveatSpecifications[ - SnapCaveatType.ActivityItemOrigin + transactionDetailsInsightCaveatSpecifications[ + SnapCaveatType.TransactionDetailsOrigin ].validator?.( // @ts-expect-error Missing value type. { - type: SnapCaveatType.ActivityItemOrigin, + type: SnapCaveatType.TransactionDetailsOrigin, }, ), ).toThrow('Expected a plain object.'); expect(() => - activityItemInsightCaveatSpecifications[ - SnapCaveatType.ActivityItemOrigin + transactionDetailsInsightCaveatSpecifications[ + SnapCaveatType.TransactionDetailsOrigin ].validator?.({ - type: SnapCaveatType.ActivityItemOrigin, + type: SnapCaveatType.TransactionDetailsOrigin, value: undefined, }), ).toThrow('Expected caveat value to have type "boolean"'); diff --git a/packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts b/packages/snaps-rpc-methods/src/endowments/transaction-details-insight.ts similarity index 70% rename from packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts rename to packages/snaps-rpc-methods/src/endowments/transaction-details-insight.ts index 7b163c1496..c19f0ff019 100644 --- a/packages/snaps-rpc-methods/src/endowments/activity-item-insight.ts +++ b/packages/snaps-rpc-methods/src/endowments/transaction-details-insight.ts @@ -16,18 +16,19 @@ import { assert, hasProperty, isObject, isPlainObject } from '@metamask/utils'; import { createGenericPermissionValidator } from './caveats'; import { SnapEndowments } from './enum'; -const permissionName = SnapEndowments.ActivityItemInsight; +const permissionName = SnapEndowments.TransactionDetailsInsight; -type ActivityItemInsightEndowmentSpecification = ValidPermissionSpecification<{ - permissionType: PermissionType.Endowment; - targetName: typeof permissionName; - endowmentGetter: (_options?: EndowmentGetterParams) => null; - allowedCaveats: Readonly> | null; - validator: PermissionValidatorConstraint; -}>; +type TransactionDetailsInsightEndowmentSpecification = + ValidPermissionSpecification<{ + permissionType: PermissionType.Endowment; + targetName: typeof permissionName; + endowmentGetter: (_options?: EndowmentGetterParams) => null; + allowedCaveats: Readonly> | null; + validator: PermissionValidatorConstraint; + }>; /** - * `endowment:activity-item-insight` returns nothing; it is intended to be used as a flag + * `endowment:transaction-details-insight` returns nothing; it is intended to be used as a flag * by the extension to detect whether the snap has the capability to show information on the transaction confirmation screen. * * @param _builderOptions - Optional specification builder options. @@ -36,25 +37,25 @@ type ActivityItemInsightEndowmentSpecification = ValidPermissionSpecification<{ const specificationBuilder: PermissionSpecificationBuilder< PermissionType.Endowment, any, - ActivityItemInsightEndowmentSpecification + TransactionDetailsInsightEndowmentSpecification > = (_builderOptions?: unknown) => { return { permissionType: PermissionType.Endowment, targetName: permissionName, allowedCaveats: [ SnapCaveatType.MaxRequestTime, - SnapCaveatType.ActivityItemOrigin, + SnapCaveatType.TransactionDetailsOrigin, ], endowmentGetter: (_getterOptions?: EndowmentGetterParams) => null, validator: createGenericPermissionValidator([ - { type: SnapCaveatType.ActivityItemOrigin, optional: true }, + { type: SnapCaveatType.TransactionDetailsOrigin, optional: true }, { type: SnapCaveatType.MaxRequestTime, optional: true }, ]), subjectTypes: [SubjectType.Snap], }; }; -export const activityItemInsightEndowmentBuilder = Object.freeze({ +export const transactionDetailsInsightEndowmentBuilder = Object.freeze({ targetName: permissionName, specificationBuilder, } as const); @@ -88,7 +89,7 @@ function validateCaveat(caveat: Caveat): void { * @param value - The raw value from the `initialPermissions`. * @returns The caveat specification. */ -export function getActivityItemInsightCaveatMapper( +export function getTransactionDetailsInsightCaveatMapper( value: Json, ): Pick { if ( @@ -101,17 +102,17 @@ export function getActivityItemInsightCaveatMapper( return { caveats: [ { - type: SnapCaveatType.ActivityItemOrigin, + type: SnapCaveatType.TransactionDetailsOrigin, value: - hasProperty(value, 'allowActivityItemOrigin') && - (value.allowActivityItemOrigin as boolean), + hasProperty(value, 'allowTransactionDetailsOrigin') && + (value.allowTransactionDetailsOrigin as boolean), }, ], }; } /** - * Getter function to get the activity item origin caveat from a permission. + * Getter function to get the transaction details origin caveat from a permission. * * This does basic validation of the caveat, but does not validate the type or * value of the namespaces object itself, as this is handled by the @@ -121,7 +122,7 @@ export function getActivityItemInsightCaveatMapper( * @returns The transaction origin, or `null` if the permission does not have a * transaction origin caveat. */ -export function getActivityItemOriginCaveat( +export function getTransactionDetailsOriginCaveat( permission?: PermissionConstraint, ): boolean | null { if (!permission?.caveats) { @@ -129,19 +130,21 @@ export function getActivityItemOriginCaveat( } assert(permission.caveats.length === 1); - assert(permission.caveats[0].type === SnapCaveatType.ActivityItemOrigin); + assert( + permission.caveats[0].type === SnapCaveatType.TransactionDetailsOrigin, + ); const caveat = permission.caveats[0] as Caveat; return caveat.value ?? null; } -export const activityItemInsightCaveatSpecifications: Record< - SnapCaveatType.ActivityItemOrigin, +export const transactionDetailsInsightCaveatSpecifications: Record< + SnapCaveatType.TransactionDetailsOrigin, CaveatSpecificationConstraint > = { - [SnapCaveatType.ActivityItemOrigin]: Object.freeze({ - type: SnapCaveatType.ActivityItemOrigin, + [SnapCaveatType.TransactionDetailsOrigin]: Object.freeze({ + type: SnapCaveatType.TransactionDetailsOrigin, validator: (caveat: Caveat) => validateCaveat(caveat), }), }; diff --git a/packages/snaps-sdk/src/types/handlers/index.ts b/packages/snaps-sdk/src/types/handlers/index.ts index d50d301cc6..8c073c96bb 100644 --- a/packages/snaps-sdk/src/types/handlers/index.ts +++ b/packages/snaps-sdk/src/types/handlers/index.ts @@ -15,4 +15,4 @@ export type * from './signature'; export * from './user-input'; export type * from './settings-page'; export type * from './web-socket-event'; -export type * from './activity-item'; +export type * from './transaction-details'; diff --git a/packages/snaps-sdk/src/types/handlers/activity-item.ts b/packages/snaps-sdk/src/types/handlers/transaction-details.ts similarity index 77% rename from packages/snaps-sdk/src/types/handlers/activity-item.ts rename to packages/snaps-sdk/src/types/handlers/transaction-details.ts index 047eac246a..05594bc496 100644 --- a/packages/snaps-sdk/src/types/handlers/activity-item.ts +++ b/packages/snaps-sdk/src/types/handlers/transaction-details.ts @@ -4,8 +4,8 @@ import type { ComponentOrElement } from '..'; * This event is called when a user clicks on a transaction to bring up the * transaction details modal * - * The `onViewActivityItem` handler returns a Snaps UI component, which is displayed - * in the activity item insights panel (transaction details modal). + * The `onTransactionDetails` handler returns a Snaps UI component, which is displayed + * in the transaction details insights panel (transaction details modal). * * @param params - The request parameters. * @param params.transactionMeta - The transaction object. This contains the @@ -15,15 +15,15 @@ import type { ComponentOrElement } from '..'; * @param params.chainId - The chain ID of the transaction. * @param params.selectedAddress - The address of the account that initiated the transaction. * @param params.selectedAccount - The account object of the account that initiated the transaction. - * @returns The activity item insights. + * @returns The transaction details insights. */ -export type OnViewActivityItemHandler = ( - params: OnViewActivityItemParams, -) => Promise; +export type OnTransactionDetailsHandler = ( + params: OnTransactionDetailsParams, +) => Promise; -export type OnViewActivityItemParams = { +export type OnTransactionDetailsParams = { /** - * The activity item data. + * The transaction details data. */ transactionMeta: { /** Unique transaction identifier */ @@ -66,14 +66,14 @@ export type OnViewActivityItemParams = { }; /** - * The response from a Snap's `onViewActivityItem` handler. + * The response from a Snap's `onTransactionDetails` handler. * * @property id - A unique identifier for the insight interface. * @property severity - The severity level of the insight. Currently only one * level is supported: `critical`. - * @property content - Optional content to display in the activity item view. + * @property content - Optional content to display in the transaction details view. */ -export type OnViewActivityItemResponse = { +export type OnTransactionDetailsResponse = { /** * A unique identifier for the insight interface. */ diff --git a/packages/snaps-sdk/src/types/permissions.ts b/packages/snaps-sdk/src/types/permissions.ts index 773acd0247..33c012fda7 100644 --- a/packages/snaps-sdk/src/types/permissions.ts +++ b/packages/snaps-sdk/src/types/permissions.ts @@ -81,8 +81,8 @@ export type InitialPermissions = Partial<{ allowTransactionOrigin?: boolean; maxRequestTime?: number; }; - 'endowment:activity-item-insight': { - allowActivityItemOrigin?: boolean; + 'endowment:transaction-details-insight': { + allowTransactionDetailsOrigin?: boolean; maxRequestTime?: number; }; 'endowment:webassembly': EmptyObject; diff --git a/packages/snaps-utils/src/caveats.ts b/packages/snaps-utils/src/caveats.ts index 1464bc9dc4..fabe7781a5 100644 --- a/packages/snaps-utils/src/caveats.ts +++ b/packages/snaps-utils/src/caveats.ts @@ -20,9 +20,9 @@ export enum SnapCaveatType { TransactionOrigin = 'transactionOrigin', /** - * Caveat specifying access to the activity item origin, used by `endowment:activity-item-insight`. + * Caveat specifying access to the transaction details origin, used by `endowment:transaction-details-insight`. */ - ActivityItemOrigin = 'activityItemOrigin', + TransactionDetailsOrigin = 'transactionDetailsOrigin', /** * Caveat specifying access to the signature origin, used by `endowment:signature-insight`. diff --git a/packages/snaps-utils/src/handlers/exports.ts b/packages/snaps-utils/src/handlers/exports.ts index 3d1759d3ad..8ef6a0ab4f 100644 --- a/packages/snaps-utils/src/handlers/exports.ts +++ b/packages/snaps-utils/src/handlers/exports.ts @@ -13,7 +13,7 @@ import type { OnRpcRequestHandler, OnSettingsPageHandler, OnSignatureHandler, - OnViewActivityItemHandler, + OnTransactionDetailsHandler, OnStartHandler, OnTransactionHandler, OnUpdateHandler, @@ -38,12 +38,12 @@ export const SNAP_EXPORTS = { return typeof snapExport === 'function'; }, }, - [HandlerType.OnViewActivityItem]: { - type: HandlerType.OnViewActivityItem, + [HandlerType.OnTransactionDetails]: { + type: HandlerType.OnTransactionDetails, required: true, validator: ( snapExport: unknown, - ): snapExport is OnViewActivityItemHandler => { + ): snapExport is OnTransactionDetailsHandler => { return typeof snapExport === 'function'; }, }, diff --git a/packages/snaps-utils/src/handlers/index.ts b/packages/snaps-utils/src/handlers/index.ts index 1787d89eeb..e7f90b3dab 100644 --- a/packages/snaps-utils/src/handlers/index.ts +++ b/packages/snaps-utils/src/handlers/index.ts @@ -1,4 +1,4 @@ -export * from './activity-item'; +export * from './transaction-details'; export * from './asset-historical-price'; export * from './assets-conversion'; export * from './assets-market-data'; diff --git a/packages/snaps-utils/src/handlers/activity-item.ts b/packages/snaps-utils/src/handlers/transaction-details.ts similarity index 58% rename from packages/snaps-utils/src/handlers/activity-item.ts rename to packages/snaps-utils/src/handlers/transaction-details.ts index 9277392272..bca6f3546d 100644 --- a/packages/snaps-utils/src/handlers/activity-item.ts +++ b/packages/snaps-utils/src/handlers/transaction-details.ts @@ -8,25 +8,25 @@ import { nullable, } from '@metamask/superstruct'; -export const OnViewActivityItemSeverityResponseStruct = object({ +export const OnTransactionDetailsSeverityResponseStruct = object({ severity: optional(literal(SeverityLevel.Critical)), }); -export const OnViewActivityItemResponseWithIdStruct = assign( - OnViewActivityItemSeverityResponseStruct, +export const OnTransactionDetailsResponseWithIdStruct = assign( + OnTransactionDetailsSeverityResponseStruct, object({ id: string(), }), ); -export const OnViewActivityItemResponseWithContentStruct = assign( - OnViewActivityItemSeverityResponseStruct, +export const OnTransactionDetailsResponseWithContentStruct = assign( + OnTransactionDetailsSeverityResponseStruct, object({ content: ComponentOrElementStruct, }), ); -export const OnViewActivityItemResponseStruct = nullable( +export const OnTransactionDetailsResponseStruct = nullable( object({ id: optional(string()), severity: optional(literal(SeverityLevel.Critical)), diff --git a/packages/snaps-utils/src/handlers/types.ts b/packages/snaps-utils/src/handlers/types.ts index 889fb1b71d..6a469bad31 100644 --- a/packages/snaps-utils/src/handlers/types.ts +++ b/packages/snaps-utils/src/handlers/types.ts @@ -32,7 +32,7 @@ export enum HandlerType { OnRpcRequest = 'onRpcRequest', OnSignature = 'onSignature', OnTransaction = 'onTransaction', - OnViewActivityItem = 'onViewActivityItem', + OnTransactionDetails = 'onTransactionDetails', OnCronjob = 'onCronjob', OnInstall = 'onInstall', OnUpdate = 'onUpdate', diff --git a/packages/snaps-utils/src/manifest/validation.ts b/packages/snaps-utils/src/manifest/validation.ts index 976e66585a..0601007020 100644 --- a/packages/snaps-utils/src/manifest/validation.ts +++ b/packages/snaps-utils/src/manifest/validation.ts @@ -243,11 +243,11 @@ export const PermissionsStruct: Describe = type({ }), ), ), - 'endowment:activity-item-insight': optional( + 'endowment:transaction-details-insight': optional( mergeStructs( HandlerCaveatsStruct, object({ - allowActivityItemOrigin: optional(boolean()), + allowTransactionDetailsOrigin: optional(boolean()), }), ), ), From 0fc4131e822ed0e4f5a6e6d936abec9ad65c3dc8 Mon Sep 17 00:00:00 2001 From: smilingkylan Date: Thu, 10 Jul 2025 17:41:48 -0700 Subject: [PATCH 16/18] Fix missing HandlerType.OnTransactionDetails causing Snaps connection error --- packages/snaps-controllers/src/snaps/constants.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/snaps-controllers/src/snaps/constants.ts b/packages/snaps-controllers/src/snaps/constants.ts index 412b7811c3..26a6eed02a 100644 --- a/packages/snaps-controllers/src/snaps/constants.ts +++ b/packages/snaps-controllers/src/snaps/constants.ts @@ -12,6 +12,7 @@ export const ALLOWED_PERMISSIONS = Object.freeze([ SnapEndowments.LifecycleHooks, SnapEndowments.EthereumProvider, SnapEndowments.TransactionInsight, + SnapEndowments.TransactionDetailsInsight, SnapEndowments.SignatureInsight, ]); @@ -35,6 +36,7 @@ export const CLIENT_ONLY_HANDLERS = Object.freeze([ HandlerType.OnClientRequest, HandlerType.OnSignature, HandlerType.OnTransaction, + HandlerType.OnTransactionDetails, HandlerType.OnCronjob, HandlerType.OnNameLookup, HandlerType.OnHomePage, From 9f48a04fa752f2917dc4f793dc0a4072de74eb2a Mon Sep 17 00:00:00 2001 From: Kylan Hurt Date: Tue, 8 Jul 2025 11:26:06 -0700 Subject: [PATCH 17/18] Switch package.jsons to local --- packages/snaps-cli/package.json | 10 +++++----- packages/snaps-controllers/package.json | 8 ++++---- packages/snaps-execution-environments/package.json | 4 ++-- packages/snaps-rpc-methods/package.json | 4 ++-- packages/snaps-utils/package.json | 2 +- packages/snaps-webpack-plugin/package.json | 6 +++--- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/snaps-cli/package.json b/packages/snaps-cli/package.json index 870cdf0065..f888ee184d 100644 --- a/packages/snaps-cli/package.json +++ b/packages/snaps-cli/package.json @@ -64,11 +64,11 @@ "test:watch": "jest --watch" }, "dependencies": { - "@metamask/snaps-rpc-methods": "workspace:^", - "@metamask/snaps-sandbox": "workspace:^", - "@metamask/snaps-sdk": "workspace:^", - "@metamask/snaps-utils": "workspace:^", - "@metamask/snaps-webpack-plugin": "workspace:^", + "@metamask/snaps-rpc-methods": "file:../snaps-rpc-methods", + "@metamask/snaps-sandbox": "file:../snaps-sandbox", + "@metamask/snaps-sdk": "file:../snaps-sdk", + "@metamask/snaps-utils": "file:../snaps-utils", + "@metamask/snaps-webpack-plugin": "file:../snaps-webpack-plugin", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.4.2", "@swc/core": "1.11.31", diff --git a/packages/snaps-controllers/package.json b/packages/snaps-controllers/package.json index e5b77e5e67..8b826a9d32 100644 --- a/packages/snaps-controllers/package.json +++ b/packages/snaps-controllers/package.json @@ -90,9 +90,9 @@ "@metamask/post-message-stream": "^10.0.0", "@metamask/rpc-errors": "^7.0.3", "@metamask/snaps-registry": "^3.2.3", - "@metamask/snaps-rpc-methods": "workspace:^", - "@metamask/snaps-sdk": "workspace:^", - "@metamask/snaps-utils": "workspace:^", + "@metamask/snaps-rpc-methods": "file:../snaps-rpc-methods", + "@metamask/snaps-sdk": "file:../snaps-sdk", + "@metamask/snaps-utils": "file:../snaps-utils", "@metamask/utils": "^11.4.2", "@xstate/fsm": "^2.0.0", "async-mutex": "^0.5.0", @@ -145,7 +145,7 @@ "vitest": "^3.1.1" }, "peerDependencies": { - "@metamask/snaps-execution-environments": "workspace:^" + "@metamask/snaps-execution-environments": "file:../snaps-execution-environments" }, "peerDependenciesMeta": { "@metamask/snaps-execution-environments": { diff --git a/packages/snaps-execution-environments/package.json b/packages/snaps-execution-environments/package.json index 1236759a52..5a9dfdc8ba 100644 --- a/packages/snaps-execution-environments/package.json +++ b/packages/snaps-execution-environments/package.json @@ -71,8 +71,8 @@ "@metamask/post-message-stream": "^10.0.0", "@metamask/providers": "^22.1.0", "@metamask/rpc-errors": "^7.0.3", - "@metamask/snaps-sdk": "workspace:^", - "@metamask/snaps-utils": "workspace:^", + "@metamask/snaps-sdk": "file:../snaps-sdk", + "@metamask/snaps-utils": "file:../snaps-utils", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.4.2", "readable-stream": "^3.6.2" diff --git a/packages/snaps-rpc-methods/package.json b/packages/snaps-rpc-methods/package.json index 4b835eddfa..9c2dfd36a8 100644 --- a/packages/snaps-rpc-methods/package.json +++ b/packages/snaps-rpc-methods/package.json @@ -58,8 +58,8 @@ "@metamask/key-tree": "^10.1.1", "@metamask/permission-controller": "^11.0.6", "@metamask/rpc-errors": "^7.0.3", - "@metamask/snaps-sdk": "workspace:^", - "@metamask/snaps-utils": "workspace:^", + "@metamask/snaps-sdk": "file:../snaps-sdk", + "@metamask/snaps-utils": "file:../snaps-utils", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.4.2", "@noble/hashes": "^1.7.1" diff --git a/packages/snaps-utils/package.json b/packages/snaps-utils/package.json index 45455ca083..fbabc6a4ee 100644 --- a/packages/snaps-utils/package.json +++ b/packages/snaps-utils/package.json @@ -86,7 +86,7 @@ "@metamask/rpc-errors": "^7.0.3", "@metamask/slip44": "^4.2.0", "@metamask/snaps-registry": "^3.2.3", - "@metamask/snaps-sdk": "workspace:^", + "@metamask/snaps-sdk": "file:../snaps-sdk", "@metamask/superstruct": "^3.2.1", "@metamask/utils": "^11.4.2", "@noble/hashes": "^1.7.1", diff --git a/packages/snaps-webpack-plugin/package.json b/packages/snaps-webpack-plugin/package.json index 9919bb15af..444816e824 100644 --- a/packages/snaps-webpack-plugin/package.json +++ b/packages/snaps-webpack-plugin/package.json @@ -57,9 +57,9 @@ "test:watch": "jest --watch" }, "dependencies": { - "@metamask/snaps-rpc-methods": "workspace:^", - "@metamask/snaps-sdk": "workspace:^", - "@metamask/snaps-utils": "workspace:^", + "@metamask/snaps-rpc-methods": "file:../snaps-rpc-methods", + "@metamask/snaps-sdk": "file:../snaps-sdk", + "@metamask/snaps-utils": "file:../snaps-utils", "@metamask/utils": "^11.4.2", "chalk": "^4.1.2", "webpack-sources": "^3.2.3" From e79c89081c6a5ad92da905c7522928b46383ecd6 Mon Sep 17 00:00:00 2001 From: smilingkylan Date: Thu, 10 Jul 2025 20:44:06 -0700 Subject: [PATCH 18/18] Adjust transaction details Snap example manifest and adjust package.json for controller --- .../snap.manifest.json | 8 +- packages/snaps-controllers/package.json | 2 +- yarn.lock | 1063 ++++++++++++++--- 3 files changed, 889 insertions(+), 184 deletions(-) diff --git a/packages/examples/packages/transaction-details-insights/snap.manifest.json b/packages/examples/packages/transaction-details-insights/snap.manifest.json index 156c643841..a082bcca31 100644 --- a/packages/examples/packages/transaction-details-insights/snap.manifest.json +++ b/packages/examples/packages/transaction-details-insights/snap.manifest.json @@ -7,17 +7,19 @@ "url": "https://github.com/MetaMask/snaps.git" }, "source": { - "shasum": "xtETCsV7ar+PvDWsk8dW9mLv5BvG+cHlMf4H5GsJ9sA=", + "shasum": "ipcyhQ+XfczweWeRiLVEZ3XD2Azji4ymGZYVNvK7qgs=", "location": { "npm": { "filePath": "dist/bundle.js", - "packageName": "@metamask/insights-example-snap", + "packageName": "@metamask/transaction-details-insights-example-snap", "registry": "https://registry.npmjs.org/" } } }, "initialPermissions": { - "endowment:transaction-insight": {} + "endowment:transaction-details": { + "allowTransactionDetailsOrigin": true + } }, "platformVersion": "9.1.0", "manifestVersion": "0.1" diff --git a/packages/snaps-controllers/package.json b/packages/snaps-controllers/package.json index 8b826a9d32..59e0cbdd77 100644 --- a/packages/snaps-controllers/package.json +++ b/packages/snaps-controllers/package.json @@ -145,7 +145,7 @@ "vitest": "^3.1.1" }, "peerDependencies": { - "@metamask/snaps-execution-environments": "file:../snaps-execution-environments" + "@metamask/snaps-execution-environments": "*" }, "peerDependenciesMeta": { "@metamask/snaps-execution-environments": { diff --git a/yarn.lock b/yarn.lock index 298783dd54..8d05ac9256 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4151,11 +4151,11 @@ __metadata: dependencies: "@lavamoat/allow-scripts": "npm:^3.3.4" "@metamask/auto-changelog": "npm:^5.0.2" - "@metamask/snaps-rpc-methods": "workspace:^" - "@metamask/snaps-sandbox": "workspace:^" - "@metamask/snaps-sdk": "workspace:^" - "@metamask/snaps-utils": "workspace:^" - "@metamask/snaps-webpack-plugin": "workspace:^" + "@metamask/snaps-rpc-methods": "file:../snaps-rpc-methods" + "@metamask/snaps-sandbox": "file:../snaps-sandbox" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/snaps-utils": "file:../snaps-utils" + "@metamask/snaps-webpack-plugin": "file:../snaps-webpack-plugin" "@metamask/superstruct": "npm:^3.2.1" "@metamask/utils": "npm:^11.4.2" "@swc/core": "npm:1.11.31" @@ -4236,9 +4236,9 @@ __metadata: "@metamask/post-message-stream": "npm:^10.0.0" "@metamask/rpc-errors": "npm:^7.0.3" "@metamask/snaps-registry": "npm:^3.2.3" - "@metamask/snaps-rpc-methods": "workspace:^" - "@metamask/snaps-sdk": "workspace:^" - "@metamask/snaps-utils": "workspace:^" + "@metamask/snaps-rpc-methods": "file:../snaps-rpc-methods" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/snaps-utils": "file:../snaps-utils" "@metamask/template-snap": "npm:^0.7.0" "@metamask/utils": "npm:^11.4.2" "@noble/hashes": "npm:^1.7.1" @@ -4285,7 +4285,7 @@ __metadata: vite-tsconfig-paths: "npm:^4.0.5" vitest: "npm:^3.1.1" peerDependencies: - "@metamask/snaps-execution-environments": "workspace:^" + "@metamask/snaps-execution-environments": "*" peerDependenciesMeta: "@metamask/snaps-execution-environments": optional: true @@ -4307,8 +4307,8 @@ __metadata: "@metamask/post-message-stream": "npm:^10.0.0" "@metamask/providers": "npm:^22.1.0" "@metamask/rpc-errors": "npm:^7.0.3" - "@metamask/snaps-sdk": "workspace:^" - "@metamask/snaps-utils": "workspace:^" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/snaps-utils": "file:../snaps-utils" "@metamask/superstruct": "npm:^3.2.1" "@metamask/utils": "npm:^11.4.2" "@swc/core": "npm:1.11.31" @@ -4421,6 +4421,70 @@ __metadata: languageName: unknown linkType: soft +"@metamask/snaps-rpc-methods@file:../snaps-rpc-methods::locator=%40metamask%2Fsnaps-cli%40workspace%3Apackages%2Fsnaps-cli": + version: 13.3.0 + resolution: "@metamask/snaps-rpc-methods@file:../snaps-rpc-methods#../snaps-rpc-methods::hash=81db32&locator=%40metamask%2Fsnaps-cli%40workspace%3Apackages%2Fsnaps-cli" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/snaps-utils": "file:../snaps-utils" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + checksum: 10/015b19bbd697210daf8dedcdba1ba5f21384f803ba6a2722f1fcdcd1d769a8a687c31f0c2c0b4e3ffcab8fa0d85076ab6041e18b311e661585b3b9cc4629a3a7 + languageName: node + linkType: hard + +"@metamask/snaps-rpc-methods@file:../snaps-rpc-methods::locator=%40metamask%2Fsnaps-controllers%40workspace%3Apackages%2Fsnaps-controllers": + version: 13.3.0 + resolution: "@metamask/snaps-rpc-methods@file:../snaps-rpc-methods#../snaps-rpc-methods::hash=81db32&locator=%40metamask%2Fsnaps-controllers%40workspace%3Apackages%2Fsnaps-controllers" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/snaps-utils": "file:../snaps-utils" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + checksum: 10/015b19bbd697210daf8dedcdba1ba5f21384f803ba6a2722f1fcdcd1d769a8a687c31f0c2c0b4e3ffcab8fa0d85076ab6041e18b311e661585b3b9cc4629a3a7 + languageName: node + linkType: hard + +"@metamask/snaps-rpc-methods@file:../snaps-rpc-methods::locator=%40metamask%2Fsnaps-webpack-plugin%40file%3A..%2Fsnaps-webpack-plugin%23..%2Fsnaps-webpack-plugin%3A%3Ahash%3D6d5d29%26locator%3D%2540metamask%252Fsnaps-cli%2540workspace%253Apackages%252Fsnaps-cli": + version: 13.3.0 + resolution: "@metamask/snaps-rpc-methods@file:../snaps-rpc-methods#../snaps-rpc-methods::hash=81db32&locator=%40metamask%2Fsnaps-webpack-plugin%40file%3A..%2Fsnaps-webpack-plugin%23..%2Fsnaps-webpack-plugin%3A%3Ahash%3D6d5d29%26locator%3D%2540metamask%252Fsnaps-cli%2540workspace%253Apackages%252Fsnaps-cli" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/snaps-utils": "file:../snaps-utils" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + checksum: 10/015b19bbd697210daf8dedcdba1ba5f21384f803ba6a2722f1fcdcd1d769a8a687c31f0c2c0b4e3ffcab8fa0d85076ab6041e18b311e661585b3b9cc4629a3a7 + languageName: node + linkType: hard + +"@metamask/snaps-rpc-methods@file:../snaps-rpc-methods::locator=%40metamask%2Fsnaps-webpack-plugin%40workspace%3Apackages%2Fsnaps-webpack-plugin": + version: 13.3.0 + resolution: "@metamask/snaps-rpc-methods@file:../snaps-rpc-methods#../snaps-rpc-methods::hash=81db32&locator=%40metamask%2Fsnaps-webpack-plugin%40workspace%3Apackages%2Fsnaps-webpack-plugin" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/snaps-utils": "file:../snaps-utils" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + checksum: 10/015b19bbd697210daf8dedcdba1ba5f21384f803ba6a2722f1fcdcd1d769a8a687c31f0c2c0b4e3ffcab8fa0d85076ab6041e18b311e661585b3b9cc4629a3a7 + languageName: node + linkType: hard + "@metamask/snaps-rpc-methods@workspace:^, @metamask/snaps-rpc-methods@workspace:packages/snaps-rpc-methods": version: 0.0.0-use.local resolution: "@metamask/snaps-rpc-methods@workspace:packages/snaps-rpc-methods" @@ -4431,8 +4495,8 @@ __metadata: "@metamask/key-tree": "npm:^10.1.1" "@metamask/permission-controller": "npm:^11.0.6" "@metamask/rpc-errors": "npm:^7.0.3" - "@metamask/snaps-sdk": "workspace:^" - "@metamask/snaps-utils": "workspace:^" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/snaps-utils": "file:../snaps-utils" "@metamask/superstruct": "npm:^3.2.1" "@metamask/utils": "npm:^11.4.2" "@noble/hashes": "npm:^1.7.1" @@ -4451,7 +4515,14 @@ __metadata: languageName: unknown linkType: soft -"@metamask/snaps-sandbox@workspace:^, @metamask/snaps-sandbox@workspace:packages/snaps-sandbox": +"@metamask/snaps-sandbox@file:../snaps-sandbox::locator=%40metamask%2Fsnaps-cli%40workspace%3Apackages%2Fsnaps-cli": + version: 1.0.0 + resolution: "@metamask/snaps-sandbox@file:../snaps-sandbox#../snaps-sandbox::hash=2fb77b&locator=%40metamask%2Fsnaps-cli%40workspace%3Apackages%2Fsnaps-cli" + checksum: 10/95bd3b8988b64a52942615fae6715f576ea505a927c4a4751e07c42acde7cf01cf663d54e54d344d5994cfb5347470fc47eea2aac4be786e0c13ca596f3f014a + languageName: node + linkType: hard + +"@metamask/snaps-sandbox@workspace:packages/snaps-sandbox": version: 0.0.0-use.local resolution: "@metamask/snaps-sandbox@workspace:packages/snaps-sandbox" dependencies: @@ -4484,200 +4555,807 @@ __metadata: languageName: unknown linkType: soft -"@metamask/snaps-sdk@workspace:^, @metamask/snaps-sdk@workspace:packages/snaps-sdk": - version: 0.0.0-use.local - resolution: "@metamask/snaps-sdk@workspace:packages/snaps-sdk" +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-cli%40workspace%3Apackages%2Fsnaps-cli": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-cli%40workspace%3Apackages%2Fsnaps-cli" dependencies: - "@lavamoat/allow-scripts": "npm:^3.3.4" - "@metamask/auto-changelog": "npm:^5.0.2" "@metamask/key-tree": "npm:^10.1.1" "@metamask/providers": "npm:^22.1.0" "@metamask/rpc-errors": "npm:^7.0.3" "@metamask/superstruct": "npm:^3.2.1" "@metamask/utils": "npm:^11.4.2" - "@ts-bridge/cli": "npm:^0.6.1" - "@types/jest": "npm:^27.5.1" - deepmerge: "npm:^4.2.2" - depcheck: "npm:^1.4.7" - eslint: "npm:^9.11.0" - expect-type: "npm:^0.17.3" - jest: "npm:^29.0.2" - jest-fetch-mock: "npm:^3.0.3" - jest-it-up: "npm:^2.0.0" - jest-silent-reporter: "npm:^0.6.0" - prettier: "npm:^3.3.3" - ts-jest: "npm:^29.1.1" - typescript: "npm:~5.3.3" - languageName: unknown - linkType: soft + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard -"@metamask/snaps-simulation@workspace:^, @metamask/snaps-simulation@workspace:packages/snaps-simulation": - version: 0.0.0-use.local - resolution: "@metamask/snaps-simulation@workspace:packages/snaps-simulation" +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-controllers%40workspace%3Apackages%2Fsnaps-controllers": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-controllers%40workspace%3Apackages%2Fsnaps-controllers" dependencies: - "@lavamoat/allow-scripts": "npm:^3.3.4" - "@metamask/auto-changelog": "npm:^5.0.2" - "@metamask/base-controller": "npm:^8.0.1" - "@metamask/eth-json-rpc-middleware": "npm:^17.0.1" - "@metamask/json-rpc-engine": "npm:^10.0.2" - "@metamask/json-rpc-middleware-stream": "npm:^8.0.7" "@metamask/key-tree": "npm:^10.1.1" - "@metamask/permission-controller": "npm:^11.0.6" - "@metamask/phishing-controller": "npm:^12.6.0" - "@metamask/snaps-controllers": "workspace:^" - "@metamask/snaps-execution-environments": "workspace:^" - "@metamask/snaps-rpc-methods": "workspace:^" - "@metamask/snaps-sdk": "workspace:^" - "@metamask/snaps-utils": "workspace:^" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" "@metamask/superstruct": "npm:^3.2.1" "@metamask/utils": "npm:^11.4.2" - "@reduxjs/toolkit": "npm:^1.9.5" - "@ts-bridge/cli": "npm:^0.6.1" - "@types/express": "npm:^5.0.1" - "@types/jest": "npm:^27.5.1" - "@types/mime": "npm:^3.0.0" - "@types/readable-stream": "npm:^4.0.15" - deepmerge: "npm:^4.2.2" - depcheck: "npm:^1.4.7" - eslint: "npm:^9.11.0" - express: "npm:^5.1.0" - fast-deep-equal: "npm:^3.1.3" - jest: "npm:^29.0.2" - jest-it-up: "npm:^2.0.0" - jest-silent-reporter: "npm:^0.6.0" - mime: "npm:^3.0.0" - prettier: "npm:^3.3.3" - readable-stream: "npm:^3.6.2" - redux-saga: "npm:^1.2.3" - ts-jest: "npm:^29.1.1" - typescript: "npm:~5.3.3" - languageName: unknown - linkType: soft + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard -"@metamask/snaps-utils@workspace:^, @metamask/snaps-utils@workspace:packages/snaps-utils": - version: 0.0.0-use.local - resolution: "@metamask/snaps-utils@workspace:packages/snaps-utils" +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-execution-environments%40workspace%3Apackages%2Fsnaps-execution-environments": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-execution-environments%40workspace%3Apackages%2Fsnaps-execution-environments" dependencies: - "@babel/core": "npm:^7.23.2" - "@babel/types": "npm:^7.23.0" - "@lavamoat/allow-scripts": "npm:^3.3.4" - "@metamask/auto-changelog": "npm:^5.0.2" - "@metamask/base-controller": "npm:^8.0.1" "@metamask/key-tree": "npm:^10.1.1" - "@metamask/permission-controller": "npm:^11.0.6" - "@metamask/post-message-stream": "npm:^10.0.0" + "@metamask/providers": "npm:^22.1.0" "@metamask/rpc-errors": "npm:^7.0.3" - "@metamask/slip44": "npm:^4.2.0" - "@metamask/snaps-registry": "npm:^3.2.3" - "@metamask/snaps-sdk": "workspace:^" "@metamask/superstruct": "npm:^3.2.1" "@metamask/utils": "npm:^11.4.2" - "@noble/hashes": "npm:^1.7.1" - "@scure/base": "npm:^1.1.1" - "@swc/core": "npm:1.11.31" - "@swc/jest": "npm:^0.2.38" - "@testing-library/dom": "npm:^10.4.0" - "@ts-bridge/cli": "npm:^0.6.1" - "@types/jest": "npm:^27.5.1" - "@types/luxon": "npm:^3" - "@types/node": "npm:18.14.2" - "@types/semver": "npm:^7.5.0" - "@types/validate-npm-package-name": "npm:^4.0.0" - "@vitest/browser": "npm:^3.1.1" - "@vitest/coverage-istanbul": "npm:3.1.1" - chalk: "npm:^4.1.2" - cron-parser: "npm:^4.5.0" - deepmerge: "npm:^4.2.2" - depcheck: "npm:^1.4.7" - eslint: "npm:^9.11.0" - fast-deep-equal: "npm:^3.1.3" - fast-json-stable-stringify: "npm:^2.1.0" - fast-xml-parser: "npm:^4.4.1" - jest: "npm:^29.0.2" - jest-fetch-mock: "npm:^3.0.3" - jest-silent-reporter: "npm:^0.6.0" - luxon: "npm:^3.5.0" - marked: "npm:^12.0.1" - memfs: "npm:^3.4.13" - prettier: "npm:^3.3.3" - rfdc: "npm:^1.3.0" - rimraf: "npm:^4.1.2" - semver: "npm:^7.5.4" - ses: "npm:^1.13.1" - tsx: "npm:^4.20.3" - typescript: "npm:~5.3.3" - validate-npm-package-name: "npm:^5.0.0" - vite: "npm:^6.2.7" - vite-plugin-node-polyfills: "npm:^0.23.0" - vite-tsconfig-paths: "npm:^4.0.5" - vitest: "npm:^3.1.1" - languageName: unknown - linkType: soft + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard -"@metamask/snaps-webpack-plugin@workspace:^, @metamask/snaps-webpack-plugin@workspace:packages/snaps-webpack-plugin": - version: 0.0.0-use.local - resolution: "@metamask/snaps-webpack-plugin@workspace:packages/snaps-webpack-plugin" +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-cli%2540workspace%253Apackages%252Fsnaps-cli": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-cli%2540workspace%253Apackages%252Fsnaps-cli" dependencies: - "@lavamoat/allow-scripts": "npm:^3.3.4" - "@metamask/auto-changelog": "npm:^5.0.2" - "@metamask/snaps-rpc-methods": "workspace:^" - "@metamask/snaps-sdk": "workspace:^" - "@metamask/snaps-utils": "workspace:^" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" "@metamask/utils": "npm:^11.4.2" - "@swc/core": "npm:1.11.31" - "@swc/jest": "npm:^0.2.38" - "@ts-bridge/cli": "npm:^0.6.1" - "@types/jest": "npm:^27.5.1" - "@types/webpack-sources": "npm:^3.2.0" - chalk: "npm:^4.1.2" - deepmerge: "npm:^4.2.2" - depcheck: "npm:^1.4.7" - eslint: "npm:^9.11.0" - jest: "npm:^29.0.2" - jest-it-up: "npm:^2.0.0" - jest-silent-reporter: "npm:^0.6.0" - memfs: "npm:^3.4.13" - prettier: "npm:^3.3.3" - typescript: "npm:~5.3.3" - webpack: "npm:^5.97.1" - webpack-sources: "npm:^3.2.3" - languageName: unknown - linkType: soft + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard -"@metamask/superstruct@npm:^3.1.0, @metamask/superstruct@npm:^3.2.1": - version: 3.2.1 - resolution: "@metamask/superstruct@npm:3.2.1" - checksum: 10/9e29380f2cf8b129283ccb2b568296d92682b705109ba62dbd7739ffd6a1982fe38c7228cdcf3cbee94dbcdd5fcc1c846ab9d1dd3582167154f914422fcff547 +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-controllers%2540workspace%253Apackages%252Fsnaps-controllers": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-controllers%2540workspace%253Apackages%252Fsnaps-controllers" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 languageName: node linkType: hard -"@metamask/template-snap@npm:^0.7.0": - version: 0.7.0 - resolution: "@metamask/template-snap@npm:0.7.0" - checksum: 10/70f11ec66945be906c22ea9f66e39624e5f7b7ae6b1e913bf2067e3278ed71ebe63953bb89146dcf7add21fc0815b895076c82d8a2af396029f06d2381eeacf9 +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-webpack-plugin%2540file%253A..%252Fsnaps-webpack-plugin%2523..%252Fsnaps-webpack-plugin%253A%253Ahash%253D6d5d29%2526locator%253D%252540metamask%25252Fsnaps-cli%252540workspace%25253Apackages%25252Fsnaps-cli": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-webpack-plugin%2540file%253A..%252Fsnaps-webpack-plugin%2523..%252Fsnaps-webpack-plugin%253A%253Ahash%253D6d5d29%2526locator%253D%252540metamask%25252Fsnaps-cli%252540workspace%25253Apackages%25252Fsnaps-cli" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 languageName: node linkType: hard -"@metamask/test-snaps@workspace:packages/test-snaps": - version: 0.0.0-use.local - resolution: "@metamask/test-snaps@workspace:packages/test-snaps" +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-webpack-plugin%2540workspace%253Apackages%252Fsnaps-webpack-plugin": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-webpack-plugin%2540workspace%253Apackages%252Fsnaps-webpack-plugin" dependencies: - "@metamask/auto-changelog": "npm:^5.0.2" - "@metamask/background-events-example-snap": "workspace:^" - "@metamask/bip32-example-snap": "workspace:^" - "@metamask/bip44-example-snap": "workspace:^" - "@metamask/client-status-example-snap": "workspace:^" - "@metamask/cronjob-duration-example-snap": "workspace:^" - "@metamask/cronjob-example-snap": "workspace:^" - "@metamask/dialog-example-snap": "workspace:^" - "@metamask/error-example-snap": "workspace:^" - "@metamask/ethereum-provider-example-snap": "workspace:^" - "@metamask/ethers-js-example-snap": "workspace:^" - "@metamask/file-upload-example-snap": "workspace:^" - "@metamask/get-entropy-example-snap": "workspace:^" - "@metamask/get-file-example-snap": "workspace:^" - "@metamask/home-page-example-snap": "workspace:^" - "@metamask/images-example-snap": "workspace:^" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-rpc-methods%40workspace%3Apackages%2Fsnaps-rpc-methods": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-rpc-methods%40workspace%3Apackages%2Fsnaps-rpc-methods" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-cli%2540workspace%253Apackages%252Fsnaps-cli": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-cli%2540workspace%253Apackages%252Fsnaps-cli" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-controllers%2540workspace%253Apackages%252Fsnaps-controllers": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-controllers%2540workspace%253Apackages%252Fsnaps-controllers" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-execution-environments%2540workspace%253Apackages%252Fsnaps-execution-environments": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-execution-environments%2540workspace%253Apackages%252Fsnaps-execution-environments" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-rpc-methods%2540file%253A..%252Fsnaps-rpc-methods%2523..%252Fsnaps-rpc-methods%253A%253Ahash%253D81db32%2526locator%253D%252540metamask%25252Fsnaps-cli%252540workspace%25253Apackages%25252Fsnaps-cli": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-rpc-methods%2540file%253A..%252Fsnaps-rpc-methods%2523..%252Fsnaps-rpc-methods%253A%253Ahash%253D81db32%2526locator%253D%252540metamask%25252Fsnaps-cli%252540workspace%25253Apackages%25252Fsnaps-cli" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-rpc-methods%2540file%253A..%252Fsnaps-rpc-methods%2523..%252Fsnaps-rpc-methods%253A%253Ahash%253D81db32%2526locator%253D%252540metamask%25252Fsnaps-controllers%252540workspace%25253Apackages%25252Fsnaps-controllers": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-rpc-methods%2540file%253A..%252Fsnaps-rpc-methods%2523..%252Fsnaps-rpc-methods%253A%253Ahash%253D81db32%2526locator%253D%252540metamask%25252Fsnaps-controllers%252540workspace%25253Apackages%25252Fsnaps-controllers" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-rpc-methods%2540file%253A..%252Fsnaps-rpc-methods%2523..%252Fsnaps-rpc-methods%253A%253Ahash%253D81db32%2526locator%253D%252540metamask%25252Fsnaps-webpack-plugin%252540file%25253A..%25252Fsnaps-webpack-plugin%252523..%25252Fsnaps-webpack-plugin%25253A%25253Ahash%25253D6d5d29%252526locator%25253D%25252540metamask%2525252Fsnaps-cli%25252540workspace%2525253Apackages%2525252Fsnaps-cli": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-rpc-methods%2540file%253A..%252Fsnaps-rpc-methods%2523..%252Fsnaps-rpc-methods%253A%253Ahash%253D81db32%2526locator%253D%252540metamask%25252Fsnaps-webpack-plugin%252540file%25253A..%25252Fsnaps-webpack-plugin%252523..%25252Fsnaps-webpack-plugin%25253A%25253Ahash%25253D6d5d29%252526locator%25253D%25252540metamask%2525252Fsnaps-cli%25252540workspace%2525253Apackages%2525252Fsnaps-cli" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-rpc-methods%2540file%253A..%252Fsnaps-rpc-methods%2523..%252Fsnaps-rpc-methods%253A%253Ahash%253D81db32%2526locator%253D%252540metamask%25252Fsnaps-webpack-plugin%252540workspace%25253Apackages%25252Fsnaps-webpack-plugin": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-rpc-methods%2540file%253A..%252Fsnaps-rpc-methods%2523..%252Fsnaps-rpc-methods%253A%253Ahash%253D81db32%2526locator%253D%252540metamask%25252Fsnaps-webpack-plugin%252540workspace%25253Apackages%25252Fsnaps-webpack-plugin" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-rpc-methods%2540workspace%253Apackages%252Fsnaps-rpc-methods": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-rpc-methods%2540workspace%253Apackages%252Fsnaps-rpc-methods" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-webpack-plugin%2540file%253A..%252Fsnaps-webpack-plugin%2523..%252Fsnaps-webpack-plugin%253A%253Ahash%253D6d5d29%2526locator%253D%252540metamask%25252Fsnaps-cli%252540workspace%25253Apackages%25252Fsnaps-cli": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-webpack-plugin%2540file%253A..%252Fsnaps-webpack-plugin%2523..%252Fsnaps-webpack-plugin%253A%253Ahash%253D6d5d29%2526locator%253D%252540metamask%25252Fsnaps-cli%252540workspace%25253Apackages%25252Fsnaps-cli" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-webpack-plugin%2540workspace%253Apackages%252Fsnaps-webpack-plugin": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-utils%40file%3A..%2Fsnaps-utils%23..%2Fsnaps-utils%3A%3Ahash%3D8f965c%26locator%3D%2540metamask%252Fsnaps-webpack-plugin%2540workspace%253Apackages%252Fsnaps-webpack-plugin" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-utils%40workspace%3Apackages%2Fsnaps-utils": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-utils%40workspace%3Apackages%2Fsnaps-utils" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-webpack-plugin%40file%3A..%2Fsnaps-webpack-plugin%23..%2Fsnaps-webpack-plugin%3A%3Ahash%3D6d5d29%26locator%3D%2540metamask%252Fsnaps-cli%2540workspace%253Apackages%252Fsnaps-cli": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-webpack-plugin%40file%3A..%2Fsnaps-webpack-plugin%23..%2Fsnaps-webpack-plugin%3A%3Ahash%3D6d5d29%26locator%3D%2540metamask%252Fsnaps-cli%2540workspace%253Apackages%252Fsnaps-cli" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@file:../snaps-sdk::locator=%40metamask%2Fsnaps-webpack-plugin%40workspace%3Apackages%2Fsnaps-webpack-plugin": + version: 9.1.0 + resolution: "@metamask/snaps-sdk@file:../snaps-sdk#../snaps-sdk::hash=5c73f1&locator=%40metamask%2Fsnaps-webpack-plugin%40workspace%3Apackages%2Fsnaps-webpack-plugin" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + checksum: 10/61d9604922a7b15ef5606e0f32498f1c4bb6e0fd6c29730c73baffb42ac2dccc6ee17e007099f9cb0232021efab7f2b8b4e802750b050925f3926f0244d23929 + languageName: node + linkType: hard + +"@metamask/snaps-sdk@workspace:^, @metamask/snaps-sdk@workspace:packages/snaps-sdk": + version: 0.0.0-use.local + resolution: "@metamask/snaps-sdk@workspace:packages/snaps-sdk" + dependencies: + "@lavamoat/allow-scripts": "npm:^3.3.4" + "@metamask/auto-changelog": "npm:^5.0.2" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@ts-bridge/cli": "npm:^0.6.1" + "@types/jest": "npm:^27.5.1" + deepmerge: "npm:^4.2.2" + depcheck: "npm:^1.4.7" + eslint: "npm:^9.11.0" + expect-type: "npm:^0.17.3" + jest: "npm:^29.0.2" + jest-fetch-mock: "npm:^3.0.3" + jest-it-up: "npm:^2.0.0" + jest-silent-reporter: "npm:^0.6.0" + prettier: "npm:^3.3.3" + ts-jest: "npm:^29.1.1" + typescript: "npm:~5.3.3" + languageName: unknown + linkType: soft + +"@metamask/snaps-simulation@workspace:^, @metamask/snaps-simulation@workspace:packages/snaps-simulation": + version: 0.0.0-use.local + resolution: "@metamask/snaps-simulation@workspace:packages/snaps-simulation" + dependencies: + "@lavamoat/allow-scripts": "npm:^3.3.4" + "@metamask/auto-changelog": "npm:^5.0.2" + "@metamask/base-controller": "npm:^8.0.1" + "@metamask/eth-json-rpc-middleware": "npm:^17.0.1" + "@metamask/json-rpc-engine": "npm:^10.0.2" + "@metamask/json-rpc-middleware-stream": "npm:^8.0.7" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/phishing-controller": "npm:^12.6.0" + "@metamask/snaps-controllers": "workspace:^" + "@metamask/snaps-execution-environments": "workspace:^" + "@metamask/snaps-rpc-methods": "workspace:^" + "@metamask/snaps-sdk": "workspace:^" + "@metamask/snaps-utils": "workspace:^" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@reduxjs/toolkit": "npm:^1.9.5" + "@ts-bridge/cli": "npm:^0.6.1" + "@types/express": "npm:^5.0.1" + "@types/jest": "npm:^27.5.1" + "@types/mime": "npm:^3.0.0" + "@types/readable-stream": "npm:^4.0.15" + deepmerge: "npm:^4.2.2" + depcheck: "npm:^1.4.7" + eslint: "npm:^9.11.0" + express: "npm:^5.1.0" + fast-deep-equal: "npm:^3.1.3" + jest: "npm:^29.0.2" + jest-it-up: "npm:^2.0.0" + jest-silent-reporter: "npm:^0.6.0" + mime: "npm:^3.0.0" + prettier: "npm:^3.3.3" + readable-stream: "npm:^3.6.2" + redux-saga: "npm:^1.2.3" + ts-jest: "npm:^29.1.1" + typescript: "npm:~5.3.3" + languageName: unknown + linkType: soft + +"@metamask/snaps-utils@file:../snaps-utils::locator=%40metamask%2Fsnaps-cli%40workspace%3Apackages%2Fsnaps-cli": + version: 11.0.0 + resolution: "@metamask/snaps-utils@file:../snaps-utils#../snaps-utils::hash=8f965c&locator=%40metamask%2Fsnaps-cli%40workspace%3Apackages%2Fsnaps-cli" + dependencies: + "@babel/core": "npm:^7.23.2" + "@babel/types": "npm:^7.23.0" + "@metamask/base-controller": "npm:^8.0.1" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/slip44": "npm:^4.2.0" + "@metamask/snaps-registry": "npm:^3.2.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + "@scure/base": "npm:^1.1.1" + chalk: "npm:^4.1.2" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + fast-json-stable-stringify: "npm:^2.1.0" + fast-xml-parser: "npm:^4.4.1" + luxon: "npm:^3.5.0" + marked: "npm:^12.0.1" + rfdc: "npm:^1.3.0" + semver: "npm:^7.5.4" + ses: "npm:^1.13.1" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/7e9355dba4fcaab9ef4b720effea01d842e71801fbdca844016b6427beee728a0bcbd140265da0121d40b3d038530d1e9264ee94edff3a9ca7a5393a2f8e60fa + languageName: node + linkType: hard + +"@metamask/snaps-utils@file:../snaps-utils::locator=%40metamask%2Fsnaps-controllers%40workspace%3Apackages%2Fsnaps-controllers": + version: 11.0.0 + resolution: "@metamask/snaps-utils@file:../snaps-utils#../snaps-utils::hash=8f965c&locator=%40metamask%2Fsnaps-controllers%40workspace%3Apackages%2Fsnaps-controllers" + dependencies: + "@babel/core": "npm:^7.23.2" + "@babel/types": "npm:^7.23.0" + "@metamask/base-controller": "npm:^8.0.1" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/slip44": "npm:^4.2.0" + "@metamask/snaps-registry": "npm:^3.2.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + "@scure/base": "npm:^1.1.1" + chalk: "npm:^4.1.2" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + fast-json-stable-stringify: "npm:^2.1.0" + fast-xml-parser: "npm:^4.4.1" + luxon: "npm:^3.5.0" + marked: "npm:^12.0.1" + rfdc: "npm:^1.3.0" + semver: "npm:^7.5.4" + ses: "npm:^1.13.1" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/7e9355dba4fcaab9ef4b720effea01d842e71801fbdca844016b6427beee728a0bcbd140265da0121d40b3d038530d1e9264ee94edff3a9ca7a5393a2f8e60fa + languageName: node + linkType: hard + +"@metamask/snaps-utils@file:../snaps-utils::locator=%40metamask%2Fsnaps-execution-environments%40workspace%3Apackages%2Fsnaps-execution-environments": + version: 11.0.0 + resolution: "@metamask/snaps-utils@file:../snaps-utils#../snaps-utils::hash=8f965c&locator=%40metamask%2Fsnaps-execution-environments%40workspace%3Apackages%2Fsnaps-execution-environments" + dependencies: + "@babel/core": "npm:^7.23.2" + "@babel/types": "npm:^7.23.0" + "@metamask/base-controller": "npm:^8.0.1" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/slip44": "npm:^4.2.0" + "@metamask/snaps-registry": "npm:^3.2.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + "@scure/base": "npm:^1.1.1" + chalk: "npm:^4.1.2" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + fast-json-stable-stringify: "npm:^2.1.0" + fast-xml-parser: "npm:^4.4.1" + luxon: "npm:^3.5.0" + marked: "npm:^12.0.1" + rfdc: "npm:^1.3.0" + semver: "npm:^7.5.4" + ses: "npm:^1.13.1" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/7e9355dba4fcaab9ef4b720effea01d842e71801fbdca844016b6427beee728a0bcbd140265da0121d40b3d038530d1e9264ee94edff3a9ca7a5393a2f8e60fa + languageName: node + linkType: hard + +"@metamask/snaps-utils@file:../snaps-utils::locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-cli%2540workspace%253Apackages%252Fsnaps-cli": + version: 11.0.0 + resolution: "@metamask/snaps-utils@file:../snaps-utils#../snaps-utils::hash=8f965c&locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-cli%2540workspace%253Apackages%252Fsnaps-cli" + dependencies: + "@babel/core": "npm:^7.23.2" + "@babel/types": "npm:^7.23.0" + "@metamask/base-controller": "npm:^8.0.1" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/slip44": "npm:^4.2.0" + "@metamask/snaps-registry": "npm:^3.2.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + "@scure/base": "npm:^1.1.1" + chalk: "npm:^4.1.2" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + fast-json-stable-stringify: "npm:^2.1.0" + fast-xml-parser: "npm:^4.4.1" + luxon: "npm:^3.5.0" + marked: "npm:^12.0.1" + rfdc: "npm:^1.3.0" + semver: "npm:^7.5.4" + ses: "npm:^1.13.1" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/7e9355dba4fcaab9ef4b720effea01d842e71801fbdca844016b6427beee728a0bcbd140265da0121d40b3d038530d1e9264ee94edff3a9ca7a5393a2f8e60fa + languageName: node + linkType: hard + +"@metamask/snaps-utils@file:../snaps-utils::locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-controllers%2540workspace%253Apackages%252Fsnaps-controllers": + version: 11.0.0 + resolution: "@metamask/snaps-utils@file:../snaps-utils#../snaps-utils::hash=8f965c&locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-controllers%2540workspace%253Apackages%252Fsnaps-controllers" + dependencies: + "@babel/core": "npm:^7.23.2" + "@babel/types": "npm:^7.23.0" + "@metamask/base-controller": "npm:^8.0.1" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/slip44": "npm:^4.2.0" + "@metamask/snaps-registry": "npm:^3.2.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + "@scure/base": "npm:^1.1.1" + chalk: "npm:^4.1.2" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + fast-json-stable-stringify: "npm:^2.1.0" + fast-xml-parser: "npm:^4.4.1" + luxon: "npm:^3.5.0" + marked: "npm:^12.0.1" + rfdc: "npm:^1.3.0" + semver: "npm:^7.5.4" + ses: "npm:^1.13.1" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/7e9355dba4fcaab9ef4b720effea01d842e71801fbdca844016b6427beee728a0bcbd140265da0121d40b3d038530d1e9264ee94edff3a9ca7a5393a2f8e60fa + languageName: node + linkType: hard + +"@metamask/snaps-utils@file:../snaps-utils::locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-webpack-plugin%2540file%253A..%252Fsnaps-webpack-plugin%2523..%252Fsnaps-webpack-plugin%253A%253Ahash%253D6d5d29%2526locator%253D%252540metamask%25252Fsnaps-cli%252540workspace%25253Apackages%25252Fsnaps-cli": + version: 11.0.0 + resolution: "@metamask/snaps-utils@file:../snaps-utils#../snaps-utils::hash=8f965c&locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-webpack-plugin%2540file%253A..%252Fsnaps-webpack-plugin%2523..%252Fsnaps-webpack-plugin%253A%253Ahash%253D6d5d29%2526locator%253D%252540metamask%25252Fsnaps-cli%252540workspace%25253Apackages%25252Fsnaps-cli" + dependencies: + "@babel/core": "npm:^7.23.2" + "@babel/types": "npm:^7.23.0" + "@metamask/base-controller": "npm:^8.0.1" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/slip44": "npm:^4.2.0" + "@metamask/snaps-registry": "npm:^3.2.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + "@scure/base": "npm:^1.1.1" + chalk: "npm:^4.1.2" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + fast-json-stable-stringify: "npm:^2.1.0" + fast-xml-parser: "npm:^4.4.1" + luxon: "npm:^3.5.0" + marked: "npm:^12.0.1" + rfdc: "npm:^1.3.0" + semver: "npm:^7.5.4" + ses: "npm:^1.13.1" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/7e9355dba4fcaab9ef4b720effea01d842e71801fbdca844016b6427beee728a0bcbd140265da0121d40b3d038530d1e9264ee94edff3a9ca7a5393a2f8e60fa + languageName: node + linkType: hard + +"@metamask/snaps-utils@file:../snaps-utils::locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-webpack-plugin%2540workspace%253Apackages%252Fsnaps-webpack-plugin": + version: 11.0.0 + resolution: "@metamask/snaps-utils@file:../snaps-utils#../snaps-utils::hash=8f965c&locator=%40metamask%2Fsnaps-rpc-methods%40file%3A..%2Fsnaps-rpc-methods%23..%2Fsnaps-rpc-methods%3A%3Ahash%3D81db32%26locator%3D%2540metamask%252Fsnaps-webpack-plugin%2540workspace%253Apackages%252Fsnaps-webpack-plugin" + dependencies: + "@babel/core": "npm:^7.23.2" + "@babel/types": "npm:^7.23.0" + "@metamask/base-controller": "npm:^8.0.1" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/slip44": "npm:^4.2.0" + "@metamask/snaps-registry": "npm:^3.2.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + "@scure/base": "npm:^1.1.1" + chalk: "npm:^4.1.2" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + fast-json-stable-stringify: "npm:^2.1.0" + fast-xml-parser: "npm:^4.4.1" + luxon: "npm:^3.5.0" + marked: "npm:^12.0.1" + rfdc: "npm:^1.3.0" + semver: "npm:^7.5.4" + ses: "npm:^1.13.1" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/7e9355dba4fcaab9ef4b720effea01d842e71801fbdca844016b6427beee728a0bcbd140265da0121d40b3d038530d1e9264ee94edff3a9ca7a5393a2f8e60fa + languageName: node + linkType: hard + +"@metamask/snaps-utils@file:../snaps-utils::locator=%40metamask%2Fsnaps-rpc-methods%40workspace%3Apackages%2Fsnaps-rpc-methods": + version: 11.0.0 + resolution: "@metamask/snaps-utils@file:../snaps-utils#../snaps-utils::hash=8f965c&locator=%40metamask%2Fsnaps-rpc-methods%40workspace%3Apackages%2Fsnaps-rpc-methods" + dependencies: + "@babel/core": "npm:^7.23.2" + "@babel/types": "npm:^7.23.0" + "@metamask/base-controller": "npm:^8.0.1" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/slip44": "npm:^4.2.0" + "@metamask/snaps-registry": "npm:^3.2.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + "@scure/base": "npm:^1.1.1" + chalk: "npm:^4.1.2" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + fast-json-stable-stringify: "npm:^2.1.0" + fast-xml-parser: "npm:^4.4.1" + luxon: "npm:^3.5.0" + marked: "npm:^12.0.1" + rfdc: "npm:^1.3.0" + semver: "npm:^7.5.4" + ses: "npm:^1.13.1" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/7e9355dba4fcaab9ef4b720effea01d842e71801fbdca844016b6427beee728a0bcbd140265da0121d40b3d038530d1e9264ee94edff3a9ca7a5393a2f8e60fa + languageName: node + linkType: hard + +"@metamask/snaps-utils@file:../snaps-utils::locator=%40metamask%2Fsnaps-webpack-plugin%40file%3A..%2Fsnaps-webpack-plugin%23..%2Fsnaps-webpack-plugin%3A%3Ahash%3D6d5d29%26locator%3D%2540metamask%252Fsnaps-cli%2540workspace%253Apackages%252Fsnaps-cli": + version: 11.0.0 + resolution: "@metamask/snaps-utils@file:../snaps-utils#../snaps-utils::hash=8f965c&locator=%40metamask%2Fsnaps-webpack-plugin%40file%3A..%2Fsnaps-webpack-plugin%23..%2Fsnaps-webpack-plugin%3A%3Ahash%3D6d5d29%26locator%3D%2540metamask%252Fsnaps-cli%2540workspace%253Apackages%252Fsnaps-cli" + dependencies: + "@babel/core": "npm:^7.23.2" + "@babel/types": "npm:^7.23.0" + "@metamask/base-controller": "npm:^8.0.1" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/slip44": "npm:^4.2.0" + "@metamask/snaps-registry": "npm:^3.2.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + "@scure/base": "npm:^1.1.1" + chalk: "npm:^4.1.2" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + fast-json-stable-stringify: "npm:^2.1.0" + fast-xml-parser: "npm:^4.4.1" + luxon: "npm:^3.5.0" + marked: "npm:^12.0.1" + rfdc: "npm:^1.3.0" + semver: "npm:^7.5.4" + ses: "npm:^1.13.1" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/7e9355dba4fcaab9ef4b720effea01d842e71801fbdca844016b6427beee728a0bcbd140265da0121d40b3d038530d1e9264ee94edff3a9ca7a5393a2f8e60fa + languageName: node + linkType: hard + +"@metamask/snaps-utils@file:../snaps-utils::locator=%40metamask%2Fsnaps-webpack-plugin%40workspace%3Apackages%2Fsnaps-webpack-plugin": + version: 11.0.0 + resolution: "@metamask/snaps-utils@file:../snaps-utils#../snaps-utils::hash=8f965c&locator=%40metamask%2Fsnaps-webpack-plugin%40workspace%3Apackages%2Fsnaps-webpack-plugin" + dependencies: + "@babel/core": "npm:^7.23.2" + "@babel/types": "npm:^7.23.0" + "@metamask/base-controller": "npm:^8.0.1" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/slip44": "npm:^4.2.0" + "@metamask/snaps-registry": "npm:^3.2.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + "@scure/base": "npm:^1.1.1" + chalk: "npm:^4.1.2" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + fast-json-stable-stringify: "npm:^2.1.0" + fast-xml-parser: "npm:^4.4.1" + luxon: "npm:^3.5.0" + marked: "npm:^12.0.1" + rfdc: "npm:^1.3.0" + semver: "npm:^7.5.4" + ses: "npm:^1.13.1" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/7e9355dba4fcaab9ef4b720effea01d842e71801fbdca844016b6427beee728a0bcbd140265da0121d40b3d038530d1e9264ee94edff3a9ca7a5393a2f8e60fa + languageName: node + linkType: hard + +"@metamask/snaps-utils@workspace:^, @metamask/snaps-utils@workspace:packages/snaps-utils": + version: 0.0.0-use.local + resolution: "@metamask/snaps-utils@workspace:packages/snaps-utils" + dependencies: + "@babel/core": "npm:^7.23.2" + "@babel/types": "npm:^7.23.0" + "@lavamoat/allow-scripts": "npm:^3.3.4" + "@metamask/auto-changelog": "npm:^5.0.2" + "@metamask/base-controller": "npm:^8.0.1" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/post-message-stream": "npm:^10.0.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/slip44": "npm:^4.2.0" + "@metamask/snaps-registry": "npm:^3.2.3" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.4.2" + "@noble/hashes": "npm:^1.7.1" + "@scure/base": "npm:^1.1.1" + "@swc/core": "npm:1.11.31" + "@swc/jest": "npm:^0.2.38" + "@testing-library/dom": "npm:^10.4.0" + "@ts-bridge/cli": "npm:^0.6.1" + "@types/jest": "npm:^27.5.1" + "@types/luxon": "npm:^3" + "@types/node": "npm:18.14.2" + "@types/semver": "npm:^7.5.0" + "@types/validate-npm-package-name": "npm:^4.0.0" + "@vitest/browser": "npm:^3.1.1" + "@vitest/coverage-istanbul": "npm:3.1.1" + chalk: "npm:^4.1.2" + cron-parser: "npm:^4.5.0" + deepmerge: "npm:^4.2.2" + depcheck: "npm:^1.4.7" + eslint: "npm:^9.11.0" + fast-deep-equal: "npm:^3.1.3" + fast-json-stable-stringify: "npm:^2.1.0" + fast-xml-parser: "npm:^4.4.1" + jest: "npm:^29.0.2" + jest-fetch-mock: "npm:^3.0.3" + jest-silent-reporter: "npm:^0.6.0" + luxon: "npm:^3.5.0" + marked: "npm:^12.0.1" + memfs: "npm:^3.4.13" + prettier: "npm:^3.3.3" + rfdc: "npm:^1.3.0" + rimraf: "npm:^4.1.2" + semver: "npm:^7.5.4" + ses: "npm:^1.13.1" + tsx: "npm:^4.20.3" + typescript: "npm:~5.3.3" + validate-npm-package-name: "npm:^5.0.0" + vite: "npm:^6.2.7" + vite-plugin-node-polyfills: "npm:^0.23.0" + vite-tsconfig-paths: "npm:^4.0.5" + vitest: "npm:^3.1.1" + languageName: unknown + linkType: soft + +"@metamask/snaps-webpack-plugin@file:../snaps-webpack-plugin::locator=%40metamask%2Fsnaps-cli%40workspace%3Apackages%2Fsnaps-cli": + version: 5.0.0 + resolution: "@metamask/snaps-webpack-plugin@file:../snaps-webpack-plugin#../snaps-webpack-plugin::hash=6d5d29&locator=%40metamask%2Fsnaps-cli%40workspace%3Apackages%2Fsnaps-cli" + dependencies: + "@metamask/snaps-rpc-methods": "file:../snaps-rpc-methods" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/snaps-utils": "file:../snaps-utils" + "@metamask/utils": "npm:^11.4.2" + chalk: "npm:^4.1.2" + webpack-sources: "npm:^3.2.3" + checksum: 10/ceb364c344512a2614048bced9f10c555cab6c803726f25835d635487793e0881e4c032321ce9bc55057c1dbdddd9aa0ca6031930c7e646d20d99b4812eae882 + languageName: node + linkType: hard + +"@metamask/snaps-webpack-plugin@workspace:^, @metamask/snaps-webpack-plugin@workspace:packages/snaps-webpack-plugin": + version: 0.0.0-use.local + resolution: "@metamask/snaps-webpack-plugin@workspace:packages/snaps-webpack-plugin" + dependencies: + "@lavamoat/allow-scripts": "npm:^3.3.4" + "@metamask/auto-changelog": "npm:^5.0.2" + "@metamask/snaps-rpc-methods": "file:../snaps-rpc-methods" + "@metamask/snaps-sdk": "file:../snaps-sdk" + "@metamask/snaps-utils": "file:../snaps-utils" + "@metamask/utils": "npm:^11.4.2" + "@swc/core": "npm:1.11.31" + "@swc/jest": "npm:^0.2.38" + "@ts-bridge/cli": "npm:^0.6.1" + "@types/jest": "npm:^27.5.1" + "@types/webpack-sources": "npm:^3.2.0" + chalk: "npm:^4.1.2" + deepmerge: "npm:^4.2.2" + depcheck: "npm:^1.4.7" + eslint: "npm:^9.11.0" + jest: "npm:^29.0.2" + jest-it-up: "npm:^2.0.0" + jest-silent-reporter: "npm:^0.6.0" + memfs: "npm:^3.4.13" + prettier: "npm:^3.3.3" + typescript: "npm:~5.3.3" + webpack: "npm:^5.97.1" + webpack-sources: "npm:^3.2.3" + languageName: unknown + linkType: soft + +"@metamask/superstruct@npm:^3.1.0, @metamask/superstruct@npm:^3.2.1": + version: 3.2.1 + resolution: "@metamask/superstruct@npm:3.2.1" + checksum: 10/9e29380f2cf8b129283ccb2b568296d92682b705109ba62dbd7739ffd6a1982fe38c7228cdcf3cbee94dbcdd5fcc1c846ab9d1dd3582167154f914422fcff547 + languageName: node + linkType: hard + +"@metamask/template-snap@npm:^0.7.0": + version: 0.7.0 + resolution: "@metamask/template-snap@npm:0.7.0" + checksum: 10/70f11ec66945be906c22ea9f66e39624e5f7b7ae6b1e913bf2067e3278ed71ebe63953bb89146dcf7add21fc0815b895076c82d8a2af396029f06d2381eeacf9 + languageName: node + linkType: hard + +"@metamask/test-snaps@workspace:packages/test-snaps": + version: 0.0.0-use.local + resolution: "@metamask/test-snaps@workspace:packages/test-snaps" + dependencies: + "@metamask/auto-changelog": "npm:^5.0.2" + "@metamask/background-events-example-snap": "workspace:^" + "@metamask/bip32-example-snap": "workspace:^" + "@metamask/bip44-example-snap": "workspace:^" + "@metamask/client-status-example-snap": "workspace:^" + "@metamask/cronjob-duration-example-snap": "workspace:^" + "@metamask/cronjob-example-snap": "workspace:^" + "@metamask/dialog-example-snap": "workspace:^" + "@metamask/error-example-snap": "workspace:^" + "@metamask/ethereum-provider-example-snap": "workspace:^" + "@metamask/ethers-js-example-snap": "workspace:^" + "@metamask/file-upload-example-snap": "workspace:^" + "@metamask/get-entropy-example-snap": "workspace:^" + "@metamask/get-file-example-snap": "workspace:^" + "@metamask/home-page-example-snap": "workspace:^" + "@metamask/images-example-snap": "workspace:^" "@metamask/insights-example-snap": "workspace:^" "@metamask/interactive-ui-example-snap": "workspace:^" "@metamask/json-rpc-example-snap": "workspace:^" @@ -4738,6 +5416,31 @@ __metadata: languageName: unknown linkType: soft +"@metamask/transaction-details-insights-example-snap@workspace:packages/examples/packages/transaction-details-insights": + version: 0.0.0-use.local + resolution: "@metamask/transaction-details-insights-example-snap@workspace:packages/examples/packages/transaction-details-insights" + dependencies: + "@jest/globals": "npm:^29.5.0" + "@lavamoat/allow-scripts": "npm:^3.3.4" + "@metamask/auto-changelog": "npm:^5.0.2" + "@metamask/snaps-cli": "workspace:^" + "@metamask/snaps-jest": "workspace:^" + "@metamask/snaps-sdk": "workspace:^" + "@metamask/utils": "npm:^11.4.2" + "@swc/core": "npm:1.11.31" + "@swc/jest": "npm:^0.2.38" + "@types/node": "npm:18.14.2" + deepmerge: "npm:^4.2.2" + depcheck: "npm:^1.4.7" + eslint: "npm:^9.11.0" + jest: "npm:^29.0.2" + jest-silent-reporter: "npm:^0.6.0" + prettier: "npm:^3.3.3" + ts-node: "npm:^10.9.1" + typescript: "npm:~5.3.3" + languageName: unknown + linkType: soft + "@metamask/utils@npm:^11.0.1, @metamask/utils@npm:^11.1.0, @metamask/utils@npm:^11.2.0, @metamask/utils@npm:^11.4.0, @metamask/utils@npm:^11.4.2": version: 11.4.2 resolution: "@metamask/utils@npm:11.4.2"