@metamask/snaps-simulation 4.0.0 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -1
- package/dist/methods/hooks/get-snap.cjs +0 -1
- package/dist/methods/hooks/get-snap.cjs.map +1 -1
- package/dist/methods/hooks/get-snap.d.cts.map +1 -1
- package/dist/methods/hooks/get-snap.d.mts.map +1 -1
- package/dist/methods/hooks/get-snap.mjs +0 -1
- package/dist/methods/hooks/get-snap.mjs.map +1 -1
- package/dist/methods/hooks/interface.cjs +11 -1
- package/dist/methods/hooks/interface.cjs.map +1 -1
- package/dist/methods/hooks/interface.d.cts +7 -0
- package/dist/methods/hooks/interface.d.cts.map +1 -1
- package/dist/methods/hooks/interface.d.mts +7 -0
- package/dist/methods/hooks/interface.d.mts.map +1 -1
- package/dist/methods/hooks/interface.mjs +9 -0
- package/dist/methods/hooks/interface.mjs.map +1 -1
- package/dist/methods/specifications.cjs +1 -0
- package/dist/methods/specifications.cjs.map +1 -1
- package/dist/methods/specifications.d.cts.map +1 -1
- package/dist/methods/specifications.d.mts.map +1 -1
- package/dist/methods/specifications.mjs +2 -1
- package/dist/methods/specifications.mjs.map +1 -1
- package/dist/request.cjs +7 -0
- package/dist/request.cjs.map +1 -1
- package/dist/request.d.cts.map +1 -1
- package/dist/request.d.mts.map +1 -1
- package/dist/request.mjs +7 -0
- package/dist/request.mjs.map +1 -1
- package/dist/simulation.cjs +2 -3
- package/dist/simulation.cjs.map +1 -1
- package/dist/simulation.d.cts.map +1 -1
- package/dist/simulation.d.mts.map +1 -1
- package/dist/simulation.mjs +2 -3
- package/dist/simulation.mjs.map +1 -1
- package/package.json +10 -11
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [4.1.1]
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Track whether interface has been displayed before allowing `snap_getInterfaceState` ([#3888](https://github.com/MetaMask/snaps/pull/3888))
|
|
15
|
+
|
|
16
|
+
## [4.1.0]
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Remove `sourceCode` from `getSnap` implementation ([#3777](https://github.com/MetaMask/snaps/pull/3777))
|
|
21
|
+
|
|
10
22
|
## [4.0.0]
|
|
11
23
|
|
|
12
24
|
### Added
|
|
@@ -275,7 +287,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
275
287
|
|
|
276
288
|
- Initial release of `@metamask/snaps-simulation` package ([#2727](https://github.com/MetaMask/snaps/pull/2727))
|
|
277
289
|
|
|
278
|
-
[Unreleased]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-simulation@4.
|
|
290
|
+
[Unreleased]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-simulation@4.1.1...HEAD
|
|
291
|
+
[4.1.1]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-simulation@4.1.0...@metamask/snaps-simulation@4.1.1
|
|
292
|
+
[4.1.0]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-simulation@4.0.0...@metamask/snaps-simulation@4.1.0
|
|
279
293
|
[4.0.0]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-simulation@3.8.0...@metamask/snaps-simulation@4.0.0
|
|
280
294
|
[3.8.0]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-simulation@3.7.0...@metamask/snaps-simulation@3.8.0
|
|
281
295
|
[3.7.0]: https://github.com/MetaMask/snaps/compare/@metamask/snaps-simulation@3.6.0...@metamask/snaps-simulation@3.7.0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-snap.cjs","sourceRoot":"","sources":["../../../src/methods/hooks/get-snap.ts"],"names":[],"mappings":";;;AAEA,uDAAmD;AAGnD;;;;;;;GAOG;AACH,SAAgB,wBAAwB,CAAC,eAAwB,IAAI;IACnE,OAAO,CAAC,OAAe,EAAQ,EAAE;QAC/B,0EAA0E;QAC1E,oDAAoD;QACpD,OAAO;YACL,EAAE,EAAE,gCAA0C;YAC9C,OAAO,EAAE,OAAwB;YACjC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,wBAAU,CAAC,OAAO;YAC1B,cAAc,EAAE,EAAE;YAClB,kBAAkB,EAAE,EAAE;YACtB,
|
|
1
|
+
{"version":3,"file":"get-snap.cjs","sourceRoot":"","sources":["../../../src/methods/hooks/get-snap.ts"],"names":[],"mappings":";;;AAEA,uDAAmD;AAGnD;;;;;;;GAOG;AACH,SAAgB,wBAAwB,CAAC,eAAwB,IAAI;IACnE,OAAO,CAAC,OAAe,EAAQ,EAAE;QAC/B,0EAA0E;QAC1E,oDAAoD;QACpD,OAAO;YACL,EAAE,EAAE,gCAA0C;YAC9C,OAAO,EAAE,OAAwB;YACjC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,wBAAU,CAAC,OAAO;YAC1B,cAAc,EAAE,EAAE;YAClB,kBAAkB,EAAE,EAAE;YACtB,QAAQ,EAAE;gBACR,OAAO,EAAE,OAAwB;gBACjC,YAAY,EAAE,WAAW;gBACzB,WAAW,EAAE,sCAAsC;gBACnD,UAAU,EAAE;oBACV,IAAI,EAAE,KAAK;oBACX,GAAG,EAAE,uCAAuC;iBAC7C;gBACD,MAAM,EAAE;oBACN,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE;wBACR,GAAG,EAAE;4BACH,QAAQ,EAAE,eAAe;4BACzB,WAAW,EAAE,4BAA4B;4BACzC,QAAQ,EAAE,4BAA4B;yBACvC;qBACF;iBACF;gBACD,kBAAkB,EAAE,EAAE;gBACtB,eAAe,EAAE,KAAK;aACvB;YACD,YAAY;SACb,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AApCD,4DAoCC","sourcesContent":["import type { SnapId } from '@metamask/snaps-sdk';\nimport type { Snap } from '@metamask/snaps-utils';\nimport { SnapStatus } from '@metamask/snaps-utils';\nimport type { SemVerVersion } from '@metamask/utils';\n\n/**\n * Get a method that gets a Snap by its ID.\n *\n * @param preinstalled - Whether the Snap is preinstalled. If `true`, the Snap\n * will be returned as a preinstalled Snap.\n * @returns A method that gets a Snap by its ID. It will always return a mock\n * Snap for simulation purposes.\n */\nexport function getGetSnapImplementation(preinstalled: boolean = true) {\n return (_snapId: string): Snap => {\n // This is a mock Snap for simulation purposes. Most of the fields are not\n // actually used, but returned for type-safety sake.\n return {\n id: 'npm:@metamask/snaps-simulation' as SnapId,\n version: '0.1.0' as SemVerVersion,\n enabled: true,\n blocked: false,\n status: SnapStatus.Running,\n versionHistory: [],\n initialPermissions: {},\n manifest: {\n version: '0.1.0' as SemVerVersion,\n proposedName: 'Test Snap',\n description: 'A test Snap for simulation purposes.',\n repository: {\n type: 'git',\n url: 'https://github.com/MetaMask/snaps.git',\n },\n source: {\n shasum: 'unused',\n location: {\n npm: {\n filePath: 'dist/index.js',\n packageName: '@metamask/snaps-simulation',\n registry: 'https://registry.npmjs.org',\n },\n },\n },\n initialPermissions: {},\n manifestVersion: '0.1',\n },\n preinstalled,\n };\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-snap.d.cts","sourceRoot":"","sources":["../../../src/methods/hooks/get-snap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,8BAA8B;AAIlD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,GAAE,OAAc,aAClD,MAAM,KAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"get-snap.d.cts","sourceRoot":"","sources":["../../../src/methods/hooks/get-snap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,8BAA8B;AAIlD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,GAAE,OAAc,aAClD,MAAM,KAAG,IAAI,CAmC/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-snap.d.mts","sourceRoot":"","sources":["../../../src/methods/hooks/get-snap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,8BAA8B;AAIlD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,GAAE,OAAc,aAClD,MAAM,KAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"get-snap.d.mts","sourceRoot":"","sources":["../../../src/methods/hooks/get-snap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,8BAA8B;AAIlD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,GAAE,OAAc,aAClD,MAAM,KAAG,IAAI,CAmC/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-snap.mjs","sourceRoot":"","sources":["../../../src/methods/hooks/get-snap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,8BAA8B;AAGnD;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,eAAwB,IAAI;IACnE,OAAO,CAAC,OAAe,EAAQ,EAAE;QAC/B,0EAA0E;QAC1E,oDAAoD;QACpD,OAAO;YACL,EAAE,EAAE,gCAA0C;YAC9C,OAAO,EAAE,OAAwB;YACjC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,UAAU,CAAC,OAAO;YAC1B,cAAc,EAAE,EAAE;YAClB,kBAAkB,EAAE,EAAE;YACtB,
|
|
1
|
+
{"version":3,"file":"get-snap.mjs","sourceRoot":"","sources":["../../../src/methods/hooks/get-snap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,8BAA8B;AAGnD;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,eAAwB,IAAI;IACnE,OAAO,CAAC,OAAe,EAAQ,EAAE;QAC/B,0EAA0E;QAC1E,oDAAoD;QACpD,OAAO;YACL,EAAE,EAAE,gCAA0C;YAC9C,OAAO,EAAE,OAAwB;YACjC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,UAAU,CAAC,OAAO;YAC1B,cAAc,EAAE,EAAE;YAClB,kBAAkB,EAAE,EAAE;YACtB,QAAQ,EAAE;gBACR,OAAO,EAAE,OAAwB;gBACjC,YAAY,EAAE,WAAW;gBACzB,WAAW,EAAE,sCAAsC;gBACnD,UAAU,EAAE;oBACV,IAAI,EAAE,KAAK;oBACX,GAAG,EAAE,uCAAuC;iBAC7C;gBACD,MAAM,EAAE;oBACN,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE;wBACR,GAAG,EAAE;4BACH,QAAQ,EAAE,eAAe;4BACzB,WAAW,EAAE,4BAA4B;4BACzC,QAAQ,EAAE,4BAA4B;yBACvC;qBACF;iBACF;gBACD,kBAAkB,EAAE,EAAE;gBACtB,eAAe,EAAE,KAAK;aACvB;YACD,YAAY;SACb,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { SnapId } from '@metamask/snaps-sdk';\nimport type { Snap } from '@metamask/snaps-utils';\nimport { SnapStatus } from '@metamask/snaps-utils';\nimport type { SemVerVersion } from '@metamask/utils';\n\n/**\n * Get a method that gets a Snap by its ID.\n *\n * @param preinstalled - Whether the Snap is preinstalled. If `true`, the Snap\n * will be returned as a preinstalled Snap.\n * @returns A method that gets a Snap by its ID. It will always return a mock\n * Snap for simulation purposes.\n */\nexport function getGetSnapImplementation(preinstalled: boolean = true) {\n return (_snapId: string): Snap => {\n // This is a mock Snap for simulation purposes. Most of the fields are not\n // actually used, but returned for type-safety sake.\n return {\n id: 'npm:@metamask/snaps-simulation' as SnapId,\n version: '0.1.0' as SemVerVersion,\n enabled: true,\n blocked: false,\n status: SnapStatus.Running,\n versionHistory: [],\n initialPermissions: {},\n manifest: {\n version: '0.1.0' as SemVerVersion,\n proposedName: 'Test Snap',\n description: 'A test Snap for simulation purposes.',\n repository: {\n type: 'git',\n url: 'https://github.com/MetaMask/snaps.git',\n },\n source: {\n shasum: 'unused',\n location: {\n npm: {\n filePath: 'dist/index.js',\n packageName: '@metamask/snaps-simulation',\n registry: 'https://registry.npmjs.org',\n },\n },\n },\n initialPermissions: {},\n manifestVersion: '0.1',\n },\n preinstalled,\n };\n };\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getGetInterfaceImplementation = exports.getCreateInterfaceImplementation = void 0;
|
|
3
|
+
exports.getSetInterfaceDisplayedImplementation = exports.getGetInterfaceImplementation = exports.getCreateInterfaceImplementation = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Get the implementation of the `createInterface` hook.
|
|
6
6
|
*
|
|
@@ -21,4 +21,14 @@ function getGetInterfaceImplementation(controllerMessenger) {
|
|
|
21
21
|
return (snapId, id) => controllerMessenger.call('SnapInterfaceController:getInterface', snapId, id);
|
|
22
22
|
}
|
|
23
23
|
exports.getGetInterfaceImplementation = getGetInterfaceImplementation;
|
|
24
|
+
/**
|
|
25
|
+
* Get the implementation of the `setInterfaceDisplayed` hook.
|
|
26
|
+
*
|
|
27
|
+
* @param controllerMessenger - The controller messenger used to call actions.
|
|
28
|
+
* @returns The implementation of the `setInterfaceDisplayed` hook.
|
|
29
|
+
*/
|
|
30
|
+
function getSetInterfaceDisplayedImplementation(controllerMessenger) {
|
|
31
|
+
return (snapId, id) => controllerMessenger.call('SnapInterfaceController:setInterfaceDisplayed', snapId, id);
|
|
32
|
+
}
|
|
33
|
+
exports.getSetInterfaceDisplayedImplementation = getSetInterfaceDisplayedImplementation;
|
|
24
34
|
//# sourceMappingURL=interface.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.cjs","sourceRoot":"","sources":["../../../src/methods/hooks/interface.ts"],"names":[],"mappings":";;;AASA;;;;;GAKG;AACH,SAAgB,gCAAgC,CAC9C,mBAA4C;IAE5C,OAAO,KAAK,EACV,MAAc,EACd,OAAkB,EAClB,OAA0B,EAC1B,WAAyB,EACzB,EAAE,CACF,mBAAmB,CAAC,IAAI,CACtB,yCAAyC,EACzC,MAAM,EACN,OAAO,EACP,OAAO,EACP,WAAW,CACZ,CAAC;AACN,CAAC;AAhBD,4EAgBC;AAED;;;;;GAKG;AACH,SAAgB,6BAA6B,CAC3C,mBAA4C;IAE5C,OAAO,CAAC,MAAc,EAAE,EAAU,EAAE,EAAE,CACpC,mBAAmB,CAAC,IAAI,CACtB,sCAAsC,EACtC,MAAM,EACN,EAAE,CACH,CAAC;AACN,CAAC;AATD,sEASC","sourcesContent":["import type {\n Component,\n ContentType,\n InterfaceContext,\n SnapId,\n} from '@metamask/snaps-sdk';\n\nimport type { RootControllerMessenger } from '../../controllers';\n\n/**\n * Get the implementation of the `createInterface` hook.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @returns The implementation of the `createInterface` hook.\n */\nexport function getCreateInterfaceImplementation(\n controllerMessenger: RootControllerMessenger,\n) {\n return async (\n snapId: SnapId,\n content: Component,\n context?: InterfaceContext,\n contentType?: ContentType,\n ) =>\n controllerMessenger.call(\n 'SnapInterfaceController:createInterface',\n snapId,\n content,\n context,\n contentType,\n );\n}\n\n/**\n * Get the implementation of the `getInterface` hook.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @returns The implementation of the `getInterface` hook.\n */\nexport function getGetInterfaceImplementation(\n controllerMessenger: RootControllerMessenger,\n) {\n return (snapId: SnapId, id: string) =>\n controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"interface.cjs","sourceRoot":"","sources":["../../../src/methods/hooks/interface.ts"],"names":[],"mappings":";;;AASA;;;;;GAKG;AACH,SAAgB,gCAAgC,CAC9C,mBAA4C;IAE5C,OAAO,KAAK,EACV,MAAc,EACd,OAAkB,EAClB,OAA0B,EAC1B,WAAyB,EACzB,EAAE,CACF,mBAAmB,CAAC,IAAI,CACtB,yCAAyC,EACzC,MAAM,EACN,OAAO,EACP,OAAO,EACP,WAAW,CACZ,CAAC;AACN,CAAC;AAhBD,4EAgBC;AAED;;;;;GAKG;AACH,SAAgB,6BAA6B,CAC3C,mBAA4C;IAE5C,OAAO,CAAC,MAAc,EAAE,EAAU,EAAE,EAAE,CACpC,mBAAmB,CAAC,IAAI,CACtB,sCAAsC,EACtC,MAAM,EACN,EAAE,CACH,CAAC;AACN,CAAC;AATD,sEASC;AAED;;;;;GAKG;AACH,SAAgB,sCAAsC,CACpD,mBAA4C;IAE5C,OAAO,CAAC,MAAc,EAAE,EAAU,EAAE,EAAE,CACpC,mBAAmB,CAAC,IAAI,CACtB,+CAA+C,EAC/C,MAAM,EACN,EAAE,CACH,CAAC;AACN,CAAC;AATD,wFASC","sourcesContent":["import type {\n Component,\n ContentType,\n InterfaceContext,\n SnapId,\n} from '@metamask/snaps-sdk';\n\nimport type { RootControllerMessenger } from '../../controllers';\n\n/**\n * Get the implementation of the `createInterface` hook.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @returns The implementation of the `createInterface` hook.\n */\nexport function getCreateInterfaceImplementation(\n controllerMessenger: RootControllerMessenger,\n) {\n return async (\n snapId: SnapId,\n content: Component,\n context?: InterfaceContext,\n contentType?: ContentType,\n ) =>\n controllerMessenger.call(\n 'SnapInterfaceController:createInterface',\n snapId,\n content,\n context,\n contentType,\n );\n}\n\n/**\n * Get the implementation of the `getInterface` hook.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @returns The implementation of the `getInterface` hook.\n */\nexport function getGetInterfaceImplementation(\n controllerMessenger: RootControllerMessenger,\n) {\n return (snapId: SnapId, id: string) =>\n controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n}\n\n/**\n * Get the implementation of the `setInterfaceDisplayed` hook.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @returns The implementation of the `setInterfaceDisplayed` hook.\n */\nexport function getSetInterfaceDisplayedImplementation(\n controllerMessenger: RootControllerMessenger,\n) {\n return (snapId: SnapId, id: string) =>\n controllerMessenger.call(\n 'SnapInterfaceController:setInterfaceDisplayed',\n snapId,\n id,\n );\n}\n"]}
|
|
@@ -14,4 +14,11 @@ export declare function getCreateInterfaceImplementation(controllerMessenger: Ro
|
|
|
14
14
|
* @returns The implementation of the `getInterface` hook.
|
|
15
15
|
*/
|
|
16
16
|
export declare function getGetInterfaceImplementation(controllerMessenger: RootControllerMessenger): (snapId: SnapId, id: string) => import("@metamask/snaps-controllers").StoredInterface;
|
|
17
|
+
/**
|
|
18
|
+
* Get the implementation of the `setInterfaceDisplayed` hook.
|
|
19
|
+
*
|
|
20
|
+
* @param controllerMessenger - The controller messenger used to call actions.
|
|
21
|
+
* @returns The implementation of the `setInterfaceDisplayed` hook.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getSetInterfaceDisplayedImplementation(controllerMessenger: RootControllerMessenger): (snapId: SnapId, id: string) => void;
|
|
17
24
|
//# sourceMappingURL=interface.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.cts","sourceRoot":"","sources":["../../../src/methods/hooks/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,MAAM,EACP,4BAA4B;AAE7B,OAAO,KAAK,EAAE,uBAAuB,EAAE,8BAA0B;AAEjE;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,mBAAmB,EAAE,uBAAuB,YAGlC,MAAM,WACL,SAAS,YACR,gBAAgB,gBACZ,WAAW,qBAS5B;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,mBAAmB,EAAE,uBAAuB,YAE5B,MAAM,MAAM,MAAM,2DAMnC"}
|
|
1
|
+
{"version":3,"file":"interface.d.cts","sourceRoot":"","sources":["../../../src/methods/hooks/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,MAAM,EACP,4BAA4B;AAE7B,OAAO,KAAK,EAAE,uBAAuB,EAAE,8BAA0B;AAEjE;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,mBAAmB,EAAE,uBAAuB,YAGlC,MAAM,WACL,SAAS,YACR,gBAAgB,gBACZ,WAAW,qBAS5B;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,mBAAmB,EAAE,uBAAuB,YAE5B,MAAM,MAAM,MAAM,2DAMnC;AAED;;;;;GAKG;AACH,wBAAgB,sCAAsC,CACpD,mBAAmB,EAAE,uBAAuB,YAE5B,MAAM,MAAM,MAAM,UAMnC"}
|
|
@@ -14,4 +14,11 @@ export declare function getCreateInterfaceImplementation(controllerMessenger: Ro
|
|
|
14
14
|
* @returns The implementation of the `getInterface` hook.
|
|
15
15
|
*/
|
|
16
16
|
export declare function getGetInterfaceImplementation(controllerMessenger: RootControllerMessenger): (snapId: SnapId, id: string) => import("@metamask/snaps-controllers").StoredInterface;
|
|
17
|
+
/**
|
|
18
|
+
* Get the implementation of the `setInterfaceDisplayed` hook.
|
|
19
|
+
*
|
|
20
|
+
* @param controllerMessenger - The controller messenger used to call actions.
|
|
21
|
+
* @returns The implementation of the `setInterfaceDisplayed` hook.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getSetInterfaceDisplayedImplementation(controllerMessenger: RootControllerMessenger): (snapId: SnapId, id: string) => void;
|
|
17
24
|
//# sourceMappingURL=interface.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.mts","sourceRoot":"","sources":["../../../src/methods/hooks/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,MAAM,EACP,4BAA4B;AAE7B,OAAO,KAAK,EAAE,uBAAuB,EAAE,8BAA0B;AAEjE;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,mBAAmB,EAAE,uBAAuB,YAGlC,MAAM,WACL,SAAS,YACR,gBAAgB,gBACZ,WAAW,qBAS5B;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,mBAAmB,EAAE,uBAAuB,YAE5B,MAAM,MAAM,MAAM,2DAMnC"}
|
|
1
|
+
{"version":3,"file":"interface.d.mts","sourceRoot":"","sources":["../../../src/methods/hooks/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,MAAM,EACP,4BAA4B;AAE7B,OAAO,KAAK,EAAE,uBAAuB,EAAE,8BAA0B;AAEjE;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,mBAAmB,EAAE,uBAAuB,YAGlC,MAAM,WACL,SAAS,YACR,gBAAgB,gBACZ,WAAW,qBAS5B;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,mBAAmB,EAAE,uBAAuB,YAE5B,MAAM,MAAM,MAAM,2DAMnC;AAED;;;;;GAKG;AACH,wBAAgB,sCAAsC,CACpD,mBAAmB,EAAE,uBAAuB,YAE5B,MAAM,MAAM,MAAM,UAMnC"}
|
|
@@ -16,4 +16,13 @@ export function getCreateInterfaceImplementation(controllerMessenger) {
|
|
|
16
16
|
export function getGetInterfaceImplementation(controllerMessenger) {
|
|
17
17
|
return (snapId, id) => controllerMessenger.call('SnapInterfaceController:getInterface', snapId, id);
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Get the implementation of the `setInterfaceDisplayed` hook.
|
|
21
|
+
*
|
|
22
|
+
* @param controllerMessenger - The controller messenger used to call actions.
|
|
23
|
+
* @returns The implementation of the `setInterfaceDisplayed` hook.
|
|
24
|
+
*/
|
|
25
|
+
export function getSetInterfaceDisplayedImplementation(controllerMessenger) {
|
|
26
|
+
return (snapId, id) => controllerMessenger.call('SnapInterfaceController:setInterfaceDisplayed', snapId, id);
|
|
27
|
+
}
|
|
19
28
|
//# sourceMappingURL=interface.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.mjs","sourceRoot":"","sources":["../../../src/methods/hooks/interface.ts"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,MAAM,UAAU,gCAAgC,CAC9C,mBAA4C;IAE5C,OAAO,KAAK,EACV,MAAc,EACd,OAAkB,EAClB,OAA0B,EAC1B,WAAyB,EACzB,EAAE,CACF,mBAAmB,CAAC,IAAI,CACtB,yCAAyC,EACzC,MAAM,EACN,OAAO,EACP,OAAO,EACP,WAAW,CACZ,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAC3C,mBAA4C;IAE5C,OAAO,CAAC,MAAc,EAAE,EAAU,EAAE,EAAE,CACpC,mBAAmB,CAAC,IAAI,CACtB,sCAAsC,EACtC,MAAM,EACN,EAAE,CACH,CAAC;AACN,CAAC","sourcesContent":["import type {\n Component,\n ContentType,\n InterfaceContext,\n SnapId,\n} from '@metamask/snaps-sdk';\n\nimport type { RootControllerMessenger } from '../../controllers';\n\n/**\n * Get the implementation of the `createInterface` hook.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @returns The implementation of the `createInterface` hook.\n */\nexport function getCreateInterfaceImplementation(\n controllerMessenger: RootControllerMessenger,\n) {\n return async (\n snapId: SnapId,\n content: Component,\n context?: InterfaceContext,\n contentType?: ContentType,\n ) =>\n controllerMessenger.call(\n 'SnapInterfaceController:createInterface',\n snapId,\n content,\n context,\n contentType,\n );\n}\n\n/**\n * Get the implementation of the `getInterface` hook.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @returns The implementation of the `getInterface` hook.\n */\nexport function getGetInterfaceImplementation(\n controllerMessenger: RootControllerMessenger,\n) {\n return (snapId: SnapId, id: string) =>\n controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"interface.mjs","sourceRoot":"","sources":["../../../src/methods/hooks/interface.ts"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,MAAM,UAAU,gCAAgC,CAC9C,mBAA4C;IAE5C,OAAO,KAAK,EACV,MAAc,EACd,OAAkB,EAClB,OAA0B,EAC1B,WAAyB,EACzB,EAAE,CACF,mBAAmB,CAAC,IAAI,CACtB,yCAAyC,EACzC,MAAM,EACN,OAAO,EACP,OAAO,EACP,WAAW,CACZ,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAC3C,mBAA4C;IAE5C,OAAO,CAAC,MAAc,EAAE,EAAU,EAAE,EAAE,CACpC,mBAAmB,CAAC,IAAI,CACtB,sCAAsC,EACtC,MAAM,EACN,EAAE,CACH,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sCAAsC,CACpD,mBAA4C;IAE5C,OAAO,CAAC,MAAc,EAAE,EAAU,EAAE,EAAE,CACpC,mBAAmB,CAAC,IAAI,CACtB,+CAA+C,EAC/C,MAAM,EACN,EAAE,CACH,CAAC;AACN,CAAC","sourcesContent":["import type {\n Component,\n ContentType,\n InterfaceContext,\n SnapId,\n} from '@metamask/snaps-sdk';\n\nimport type { RootControllerMessenger } from '../../controllers';\n\n/**\n * Get the implementation of the `createInterface` hook.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @returns The implementation of the `createInterface` hook.\n */\nexport function getCreateInterfaceImplementation(\n controllerMessenger: RootControllerMessenger,\n) {\n return async (\n snapId: SnapId,\n content: Component,\n context?: InterfaceContext,\n contentType?: ContentType,\n ) =>\n controllerMessenger.call(\n 'SnapInterfaceController:createInterface',\n snapId,\n content,\n context,\n contentType,\n );\n}\n\n/**\n * Get the implementation of the `getInterface` hook.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @returns The implementation of the `getInterface` hook.\n */\nexport function getGetInterfaceImplementation(\n controllerMessenger: RootControllerMessenger,\n) {\n return (snapId: SnapId, id: string) =>\n controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n}\n\n/**\n * Get the implementation of the `setInterfaceDisplayed` hook.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @returns The implementation of the `setInterfaceDisplayed` hook.\n */\nexport function getSetInterfaceDisplayedImplementation(\n controllerMessenger: RootControllerMessenger,\n) {\n return (snapId: SnapId, id: string) =>\n controllerMessenger.call(\n 'SnapInterfaceController:setInterfaceDisplayed',\n snapId,\n id,\n );\n}\n"]}
|
|
@@ -59,6 +59,7 @@ function getPermissionSpecifications({ controllerMessenger, hooks, runSaga, opti
|
|
|
59
59
|
updateSnapState: (0, hooks_1.getUpdateSnapStateMethodImplementation)(runSaga),
|
|
60
60
|
createInterface: (0, hooks_1.getCreateInterfaceImplementation)(controllerMessenger),
|
|
61
61
|
getInterface: (0, hooks_1.getGetInterfaceImplementation)(controllerMessenger),
|
|
62
|
+
setInterfaceDisplayed: (0, hooks_1.getSetInterfaceDisplayedImplementation)(controllerMessenger),
|
|
62
63
|
}),
|
|
63
64
|
};
|
|
64
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specifications.cjs","sourceRoot":"","sources":["../../src/methods/specifications.ts"],"names":[],"mappings":";;;AAAA,mFAA6E;AAE7E,mEAIqC;AAErC,uDAA2D;AAE3D,+CAGqB;AACrB,
|
|
1
|
+
{"version":3,"file":"specifications.cjs","sourceRoot":"","sources":["../../src/methods/specifications.ts"],"names":[],"mappings":";;;AAAA,mFAA6E;AAE7E,mEAIqC;AAErC,uDAA2D;AAE3D,+CAGqB;AACrB,6CAWiB;AAqBjB;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,MAAe;IACrC,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC;AACtB,CAAC;AAFD,0BAEC;AAED;;;;;;GAMG;AACH,SAAgB,YAAY,CAAO,MAAa;IAC9C,OAAO,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC;AAC5B,CAAC;AAFD,oCAEC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,2BAA2B,CAAC,EAC1C,mBAAmB,EACnB,KAAK,EACL,OAAO,EACP,OAAO,GAC4B;IACnC,OAAO;QACL,CAAC,kDAAsB,CAAC,UAAU,CAAC,EACjC,kDAAsB,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACjD,GAAG,IAAA,oDAAgC,EAAC,oCAAwB,CAAC;QAC7D,GAAG,IAAA,2DAAuC,EAAC,qCAAyB,EAAE;YACpE,gBAAgB;YAChB,GAAG,KAAK;YAER,wBAAwB;YACxB,cAAc,EAAE,IAAA,6CAAqC,EAAC,OAAO,CAAC;YAC9D,cAAc,EAAE,IAAA,6CAAqC,EAAC,OAAO,CAAC;YAC9D,YAAY,EAAE,IAAA,2CAAmC,EAAC,OAAO,CAAC;YAC1D,gBAAgB,EAAE,YAAY,CAAC,IAAI,CAAC;YAEpC,+DAA+D;YAC/D,gBAAgB,EAAE,OAAO,CAAC,KAAK,CAAC;YAEhC,uBAAuB,EAAE,YAAY,EAAE;YACvC,mBAAmB,EAAE,IAAA,4CAAoC,EAAC,OAAO,CAAC;YAClE,qBAAqB,EAAE,IAAA,8CAAsC,EAAC,OAAO,CAAC;YACtE,sBAAsB,EAAE,IAAA,+CAAuC,EAAC,OAAO,CAAC;YACxE,eAAe,EAAE,IAAA,8CAAsC,EAAC,OAAO,CAAC;YAChE,eAAe,EAAE,IAAA,wCAAgC,EAAC,mBAAmB,CAAC;YACtE,YAAY,EAAE,IAAA,qCAA6B,EAAC,mBAAmB,CAAC;YAChE,qBAAqB,EACnB,IAAA,8CAAsC,EAAC,mBAAmB,CAAC;SAC9D,CAAC;KACH,CAAC;AACJ,CAAC;AAlCD,kEAkCC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,aAAa,CACjC,oBAAiD,EACjD,MAAc;IAEd,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,+CAA2B,CAAC,CAAC,MAAM,CAEzE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE;QAClC,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC;QAClC,IAAI,oBAAoB,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC;YAC/D,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,aAAa,CACzD,MAAM,EACN,cAAc,CACf,CAAC;YAEF,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,WAAW,CAAC,MAAM,CAAC,UAAsB,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAExB,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,gCAAkB,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAvBD,sCAuBC","sourcesContent":["import { caip25EndowmentBuilder } from '@metamask/chain-agnostic-permission';\nimport type { GenericPermissionController } from '@metamask/permission-controller';\nimport {\n endowmentPermissionBuilders,\n buildSnapEndowmentSpecifications,\n buildSnapRestrictedMethodSpecifications,\n} from '@metamask/snaps-rpc-methods';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport { DEFAULT_ENDOWMENTS } from '@metamask/snaps-utils';\n\nimport {\n EXCLUDED_SNAP_ENDOWMENTS,\n EXCLUDED_SNAP_PERMISSIONS,\n} from './constants';\nimport {\n getGetPreferencesMethodImplementation,\n getClearSnapStateMethodImplementation,\n getGetSnapStateMethodImplementation,\n getUpdateSnapStateMethodImplementation,\n getShowInAppNotificationImplementation,\n getShowNativeNotificationImplementation,\n getCreateInterfaceImplementation,\n getGetInterfaceImplementation,\n getRequestUserApprovalImplementation,\n getSetInterfaceDisplayedImplementation,\n} from './hooks';\nimport type { RootControllerMessenger } from '../controllers';\nimport type { SimulationOptions } from '../options';\nimport type { RunSagaFunction } from '../store';\n\nexport type PermissionSpecificationsHooks = {\n /**\n * A hook that returns the user's secret recovery phrase.\n *\n * @returns The user's secret recovery phrase.\n */\n getMnemonic: () => Promise<Uint8Array>;\n};\n\nexport type GetPermissionSpecificationsOptions = {\n controllerMessenger: RootControllerMessenger;\n hooks: PermissionSpecificationsHooks;\n runSaga: RunSagaFunction;\n options: SimulationOptions;\n};\n\n/**\n * Get a function which resolves with the specified result.\n *\n * @param result - The result to return.\n * @returns The function implementation.\n */\nexport function resolve(result: unknown) {\n return () => result;\n}\n\n/**\n * Get a function which resolves with the specified result.\n *\n * @param result - The result to return. If not specified, the function will\n * resolve with `undefined`.\n * @returns The function implementation.\n */\nexport function asyncResolve<Type>(result?: Type) {\n return async () => result;\n}\n\n/**\n * Get the permission specifications for the Snap.\n *\n * @param options - The options.\n * @param options.controllerMessenger - The controller messenger.\n * @param options.hooks - The hooks.\n * @param options.runSaga - The function to run a saga outside the usual Redux\n * flow.\n * @param options.options - The simulation options.\n * @returns The permission specifications for the Snap.\n */\nexport function getPermissionSpecifications({\n controllerMessenger,\n hooks,\n runSaga,\n options,\n}: GetPermissionSpecificationsOptions) {\n return {\n [caip25EndowmentBuilder.targetName]:\n caip25EndowmentBuilder.specificationBuilder({}),\n ...buildSnapEndowmentSpecifications(EXCLUDED_SNAP_ENDOWMENTS),\n ...buildSnapRestrictedMethodSpecifications(EXCLUDED_SNAP_PERMISSIONS, {\n // Shared hooks.\n ...hooks,\n\n // Snaps-specific hooks.\n clearSnapState: getClearSnapStateMethodImplementation(runSaga),\n getPreferences: getGetPreferencesMethodImplementation(options),\n getSnapState: getGetSnapStateMethodImplementation(runSaga),\n getUnlockPromise: asyncResolve(true),\n\n // TODO: Allow the user to specify the result of this function.\n isOnPhishingList: resolve(false),\n\n maybeUpdatePhishingList: asyncResolve(),\n requestUserApproval: getRequestUserApprovalImplementation(runSaga),\n showInAppNotification: getShowInAppNotificationImplementation(runSaga),\n showNativeNotification: getShowNativeNotificationImplementation(runSaga),\n updateSnapState: getUpdateSnapStateMethodImplementation(runSaga),\n createInterface: getCreateInterfaceImplementation(controllerMessenger),\n getInterface: getGetInterfaceImplementation(controllerMessenger),\n setInterfaceDisplayed:\n getSetInterfaceDisplayedImplementation(controllerMessenger),\n }),\n };\n}\n\n/**\n * Get the endowments for the Snap.\n *\n * @param permissionController - The permission controller.\n * @param snapId - The ID of the Snap.\n * @returns The endowments for the Snap.\n */\nexport async function getEndowments(\n permissionController: GenericPermissionController,\n snapId: SnapId,\n) {\n const allEndowments = await Object.keys(endowmentPermissionBuilders).reduce<\n Promise<string[]>\n >(async (promise, permissionName) => {\n const accumulator = await promise;\n if (permissionController.hasPermission(snapId, permissionName)) {\n const endowments = await permissionController.getEndowments(\n snapId,\n permissionName,\n );\n\n if (endowments) {\n return accumulator.concat(endowments as string[]);\n }\n }\n\n return accumulator;\n }, Promise.resolve([]));\n\n return [...new Set([...DEFAULT_ENDOWMENTS, ...allEndowments])];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specifications.d.cts","sourceRoot":"","sources":["../../src/methods/specifications.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,2BAA2B,EAAE,wCAAwC;AAMnF,OAAO,KAAK,EAAE,MAAM,EAAE,4BAA4B;
|
|
1
|
+
{"version":3,"file":"specifications.d.cts","sourceRoot":"","sources":["../../src/methods/specifications.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,2BAA2B,EAAE,wCAAwC;AAMnF,OAAO,KAAK,EAAE,MAAM,EAAE,4BAA4B;AAmBlD,OAAO,KAAK,EAAE,uBAAuB,EAAE,2BAAuB;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAmB;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,2BAAiB;AAEhD,MAAM,MAAM,6BAA6B,GAAG;IAC1C;;;;OAIG;IACH,WAAW,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,mBAAmB,EAAE,uBAAuB,CAAC;IAC7C,KAAK,EAAE,6BAA6B,CAAC;IACrC,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,iBAAiB,CAAC;CAC5B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,OAAO,iBAEtC;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,mCAE/C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,mBAAmB,EACnB,KAAK,EACL,OAAO,EACP,OAAO,GACR,EAAE,kCAAkC;;;;;;;;EA6BpC;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,oBAAoB,EAAE,2BAA2B,EACjD,MAAM,EAAE,MAAM,qBAqBf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specifications.d.mts","sourceRoot":"","sources":["../../src/methods/specifications.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,2BAA2B,EAAE,wCAAwC;AAMnF,OAAO,KAAK,EAAE,MAAM,EAAE,4BAA4B;
|
|
1
|
+
{"version":3,"file":"specifications.d.mts","sourceRoot":"","sources":["../../src/methods/specifications.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,2BAA2B,EAAE,wCAAwC;AAMnF,OAAO,KAAK,EAAE,MAAM,EAAE,4BAA4B;AAmBlD,OAAO,KAAK,EAAE,uBAAuB,EAAE,2BAAuB;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAmB;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,2BAAiB;AAEhD,MAAM,MAAM,6BAA6B,GAAG;IAC1C;;;;OAIG;IACH,WAAW,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,mBAAmB,EAAE,uBAAuB,CAAC;IAC7C,KAAK,EAAE,6BAA6B,CAAC;IACrC,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,iBAAiB,CAAC;CAC5B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,OAAO,iBAEtC;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,mCAE/C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,mBAAmB,EACnB,KAAK,EACL,OAAO,EACP,OAAO,GACR,EAAE,kCAAkC;;;;;;;;EA6BpC;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,oBAAoB,EAAE,2BAA2B,EACjD,MAAM,EAAE,MAAM,qBAqBf"}
|
|
@@ -2,7 +2,7 @@ import { caip25EndowmentBuilder } from "@metamask/chain-agnostic-permission";
|
|
|
2
2
|
import { endowmentPermissionBuilders, buildSnapEndowmentSpecifications, buildSnapRestrictedMethodSpecifications } from "@metamask/snaps-rpc-methods";
|
|
3
3
|
import { DEFAULT_ENDOWMENTS } from "@metamask/snaps-utils";
|
|
4
4
|
import { EXCLUDED_SNAP_ENDOWMENTS, EXCLUDED_SNAP_PERMISSIONS } from "./constants.mjs";
|
|
5
|
-
import { getGetPreferencesMethodImplementation, getClearSnapStateMethodImplementation, getGetSnapStateMethodImplementation, getUpdateSnapStateMethodImplementation, getShowInAppNotificationImplementation, getShowNativeNotificationImplementation, getCreateInterfaceImplementation, getGetInterfaceImplementation, getRequestUserApprovalImplementation } from "./hooks/index.mjs";
|
|
5
|
+
import { getGetPreferencesMethodImplementation, getClearSnapStateMethodImplementation, getGetSnapStateMethodImplementation, getUpdateSnapStateMethodImplementation, getShowInAppNotificationImplementation, getShowNativeNotificationImplementation, getCreateInterfaceImplementation, getGetInterfaceImplementation, getRequestUserApprovalImplementation, getSetInterfaceDisplayedImplementation } from "./hooks/index.mjs";
|
|
6
6
|
/**
|
|
7
7
|
* Get a function which resolves with the specified result.
|
|
8
8
|
*
|
|
@@ -54,6 +54,7 @@ export function getPermissionSpecifications({ controllerMessenger, hooks, runSag
|
|
|
54
54
|
updateSnapState: getUpdateSnapStateMethodImplementation(runSaga),
|
|
55
55
|
createInterface: getCreateInterfaceImplementation(controllerMessenger),
|
|
56
56
|
getInterface: getGetInterfaceImplementation(controllerMessenger),
|
|
57
|
+
setInterfaceDisplayed: getSetInterfaceDisplayedImplementation(controllerMessenger),
|
|
57
58
|
}),
|
|
58
59
|
};
|
|
59
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specifications.mjs","sourceRoot":"","sources":["../../src/methods/specifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,4CAA4C;AAE7E,OAAO,EACL,2BAA2B,EAC3B,gCAAgC,EAChC,uCAAuC,EACxC,oCAAoC;AAErC,OAAO,EAAE,kBAAkB,EAAE,8BAA8B;AAE3D,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EAC1B,wBAAoB;AACrB,OAAO,EACL,qCAAqC,EACrC,qCAAqC,EACrC,mCAAmC,EACnC,sCAAsC,EACtC,sCAAsC,EACtC,uCAAuC,EACvC,gCAAgC,EAChC,6BAA6B,EAC7B,oCAAoC,
|
|
1
|
+
{"version":3,"file":"specifications.mjs","sourceRoot":"","sources":["../../src/methods/specifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,4CAA4C;AAE7E,OAAO,EACL,2BAA2B,EAC3B,gCAAgC,EAChC,uCAAuC,EACxC,oCAAoC;AAErC,OAAO,EAAE,kBAAkB,EAAE,8BAA8B;AAE3D,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EAC1B,wBAAoB;AACrB,OAAO,EACL,qCAAqC,EACrC,qCAAqC,EACrC,mCAAmC,EACnC,sCAAsC,EACtC,sCAAsC,EACtC,uCAAuC,EACvC,gCAAgC,EAChC,6BAA6B,EAC7B,oCAAoC,EACpC,sCAAsC,EACvC,0BAAgB;AAqBjB;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,MAAe;IACrC,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC;AACtB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAO,MAAa;IAC9C,OAAO,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC;AAC5B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2BAA2B,CAAC,EAC1C,mBAAmB,EACnB,KAAK,EACL,OAAO,EACP,OAAO,GAC4B;IACnC,OAAO;QACL,CAAC,sBAAsB,CAAC,UAAU,CAAC,EACjC,sBAAsB,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACjD,GAAG,gCAAgC,CAAC,wBAAwB,CAAC;QAC7D,GAAG,uCAAuC,CAAC,yBAAyB,EAAE;YACpE,gBAAgB;YAChB,GAAG,KAAK;YAER,wBAAwB;YACxB,cAAc,EAAE,qCAAqC,CAAC,OAAO,CAAC;YAC9D,cAAc,EAAE,qCAAqC,CAAC,OAAO,CAAC;YAC9D,YAAY,EAAE,mCAAmC,CAAC,OAAO,CAAC;YAC1D,gBAAgB,EAAE,YAAY,CAAC,IAAI,CAAC;YAEpC,+DAA+D;YAC/D,gBAAgB,EAAE,OAAO,CAAC,KAAK,CAAC;YAEhC,uBAAuB,EAAE,YAAY,EAAE;YACvC,mBAAmB,EAAE,oCAAoC,CAAC,OAAO,CAAC;YAClE,qBAAqB,EAAE,sCAAsC,CAAC,OAAO,CAAC;YACtE,sBAAsB,EAAE,uCAAuC,CAAC,OAAO,CAAC;YACxE,eAAe,EAAE,sCAAsC,CAAC,OAAO,CAAC;YAChE,eAAe,EAAE,gCAAgC,CAAC,mBAAmB,CAAC;YACtE,YAAY,EAAE,6BAA6B,CAAC,mBAAmB,CAAC;YAChE,qBAAqB,EACnB,sCAAsC,CAAC,mBAAmB,CAAC;SAC9D,CAAC;KACH,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,oBAAiD,EACjD,MAAc;IAEd,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,MAAM,CAEzE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE;QAClC,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC;QAClC,IAAI,oBAAoB,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC;YAC/D,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,aAAa,CACzD,MAAM,EACN,cAAc,CACf,CAAC;YAEF,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,WAAW,CAAC,MAAM,CAAC,UAAsB,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAExB,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,kBAAkB,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC","sourcesContent":["import { caip25EndowmentBuilder } from '@metamask/chain-agnostic-permission';\nimport type { GenericPermissionController } from '@metamask/permission-controller';\nimport {\n endowmentPermissionBuilders,\n buildSnapEndowmentSpecifications,\n buildSnapRestrictedMethodSpecifications,\n} from '@metamask/snaps-rpc-methods';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport { DEFAULT_ENDOWMENTS } from '@metamask/snaps-utils';\n\nimport {\n EXCLUDED_SNAP_ENDOWMENTS,\n EXCLUDED_SNAP_PERMISSIONS,\n} from './constants';\nimport {\n getGetPreferencesMethodImplementation,\n getClearSnapStateMethodImplementation,\n getGetSnapStateMethodImplementation,\n getUpdateSnapStateMethodImplementation,\n getShowInAppNotificationImplementation,\n getShowNativeNotificationImplementation,\n getCreateInterfaceImplementation,\n getGetInterfaceImplementation,\n getRequestUserApprovalImplementation,\n getSetInterfaceDisplayedImplementation,\n} from './hooks';\nimport type { RootControllerMessenger } from '../controllers';\nimport type { SimulationOptions } from '../options';\nimport type { RunSagaFunction } from '../store';\n\nexport type PermissionSpecificationsHooks = {\n /**\n * A hook that returns the user's secret recovery phrase.\n *\n * @returns The user's secret recovery phrase.\n */\n getMnemonic: () => Promise<Uint8Array>;\n};\n\nexport type GetPermissionSpecificationsOptions = {\n controllerMessenger: RootControllerMessenger;\n hooks: PermissionSpecificationsHooks;\n runSaga: RunSagaFunction;\n options: SimulationOptions;\n};\n\n/**\n * Get a function which resolves with the specified result.\n *\n * @param result - The result to return.\n * @returns The function implementation.\n */\nexport function resolve(result: unknown) {\n return () => result;\n}\n\n/**\n * Get a function which resolves with the specified result.\n *\n * @param result - The result to return. If not specified, the function will\n * resolve with `undefined`.\n * @returns The function implementation.\n */\nexport function asyncResolve<Type>(result?: Type) {\n return async () => result;\n}\n\n/**\n * Get the permission specifications for the Snap.\n *\n * @param options - The options.\n * @param options.controllerMessenger - The controller messenger.\n * @param options.hooks - The hooks.\n * @param options.runSaga - The function to run a saga outside the usual Redux\n * flow.\n * @param options.options - The simulation options.\n * @returns The permission specifications for the Snap.\n */\nexport function getPermissionSpecifications({\n controllerMessenger,\n hooks,\n runSaga,\n options,\n}: GetPermissionSpecificationsOptions) {\n return {\n [caip25EndowmentBuilder.targetName]:\n caip25EndowmentBuilder.specificationBuilder({}),\n ...buildSnapEndowmentSpecifications(EXCLUDED_SNAP_ENDOWMENTS),\n ...buildSnapRestrictedMethodSpecifications(EXCLUDED_SNAP_PERMISSIONS, {\n // Shared hooks.\n ...hooks,\n\n // Snaps-specific hooks.\n clearSnapState: getClearSnapStateMethodImplementation(runSaga),\n getPreferences: getGetPreferencesMethodImplementation(options),\n getSnapState: getGetSnapStateMethodImplementation(runSaga),\n getUnlockPromise: asyncResolve(true),\n\n // TODO: Allow the user to specify the result of this function.\n isOnPhishingList: resolve(false),\n\n maybeUpdatePhishingList: asyncResolve(),\n requestUserApproval: getRequestUserApprovalImplementation(runSaga),\n showInAppNotification: getShowInAppNotificationImplementation(runSaga),\n showNativeNotification: getShowNativeNotificationImplementation(runSaga),\n updateSnapState: getUpdateSnapStateMethodImplementation(runSaga),\n createInterface: getCreateInterfaceImplementation(controllerMessenger),\n getInterface: getGetInterfaceImplementation(controllerMessenger),\n setInterfaceDisplayed:\n getSetInterfaceDisplayedImplementation(controllerMessenger),\n }),\n };\n}\n\n/**\n * Get the endowments for the Snap.\n *\n * @param permissionController - The permission controller.\n * @param snapId - The ID of the Snap.\n * @returns The endowments for the Snap.\n */\nexport async function getEndowments(\n permissionController: GenericPermissionController,\n snapId: SnapId,\n) {\n const allEndowments = await Object.keys(endowmentPermissionBuilders).reduce<\n Promise<string[]>\n >(async (promise, permissionName) => {\n const accumulator = await promise;\n if (permissionController.hasPermission(snapId, permissionName)) {\n const endowments = await permissionController.getEndowments(\n snapId,\n permissionName,\n );\n\n if (endowments) {\n return accumulator.concat(endowments as string[]);\n }\n }\n\n return accumulator;\n }, Promise.resolve([]));\n\n return [...new Set([...DEFAULT_ENDOWMENTS, ...allEndowments])];\n}\n"]}
|
package/dist/request.cjs
CHANGED
|
@@ -151,6 +151,13 @@ async function getInterfaceApi(result, snapId, controllerMessenger, options, con
|
|
|
151
151
|
const interfaceId = await getInterfaceFromResult(result, snapId, controllerMessenger);
|
|
152
152
|
const id = interfaceId ?? contentId;
|
|
153
153
|
if (id) {
|
|
154
|
+
try {
|
|
155
|
+
controllerMessenger.call('SnapInterfaceController:setInterfaceDisplayed', snapId, id);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// The call will fail for invalid interfaces, but we can just ignore that
|
|
159
|
+
// here.
|
|
160
|
+
}
|
|
154
161
|
return () => {
|
|
155
162
|
const { content } = controllerMessenger.call('SnapInterfaceController:getInterface', snapId, id);
|
|
156
163
|
const actions = (0, interface_1.getInterfaceActions)(snapId, controllerMessenger, options, {
|
package/dist/request.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.cjs","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AbstractExecutionService } from '@metamask/snaps-controllers';\nimport {\n type ComponentOrElement,\n ComponentOrElementStruct,\n type JsonRpcError,\n type SnapId,\n} from '@metamask/snaps-sdk';\nimport type { HandlerType } from '@metamask/snaps-utils';\nimport { unwrapError } from '@metamask/snaps-utils';\nimport { is } from '@metamask/superstruct';\nimport {\n assert,\n getSafeJson,\n hasProperty,\n isPlainObject,\n} from '@metamask/utils';\nimport { nanoid } from '@reduxjs/toolkit';\n\nimport type { RootControllerMessenger } from './controllers';\nimport { getInterface, getInterfaceActions } from './interface';\nimport type { SimulationOptions } from './options';\nimport type { RunSagaFunction, Store } from './store';\nimport {\n getTraces,\n getErrors,\n clearNotifications,\n getNotifications,\n getEvents,\n clearTrackables,\n} from './store';\nimport { SnapResponseStruct } from './structs';\nimport type {\n RequestOptions,\n SnapHandlerInterface,\n SnapRequest,\n} from './types';\n\nexport type HandleRequestOptions = {\n snapId: SnapId;\n store: Store;\n executionService: AbstractExecutionService<unknown>;\n handler: HandlerType;\n controllerMessenger: RootControllerMessenger;\n simulationOptions: SimulationOptions;\n runSaga: RunSagaFunction;\n request: RequestOptions;\n};\n\n/**\n * Send a JSON-RPC request to the Snap, and wrap the response in a\n * {@link SnapResponse} object.\n *\n * @param options - The request options.\n * @param options.snapId - The ID of the Snap to send the request to.\n * @param options.store - The Redux store.\n * @param options.executionService - The execution service to use to send the\n * request.\n * @param options.handler - The handler to use to send the request.\n * @param options.controllerMessenger - The controller messenger used to call actions.\n * @param options.simulationOptions - The simulation options.\n * @param options.runSaga - A function to run a saga outside the usual Redux\n * flow.\n * @param options.request - The request to send.\n * @param options.request.id - The ID of the request. If not provided, a random\n * ID will be generated.\n * @param options.request.origin - The origin of the request. Defaults to\n * `https://metamask.io`.\n * @returns The response, wrapped in a {@link SnapResponse} object.\n */\nexport function handleRequest({\n snapId,\n store,\n executionService,\n handler,\n controllerMessenger,\n simulationOptions,\n runSaga,\n request: { id = nanoid(), origin = 'https://metamask.io', ...options },\n}: HandleRequestOptions): SnapRequest {\n const getInterfaceError = () => {\n throw new Error(\n 'Unable to get the interface from the Snap: The request to the Snap failed.',\n );\n };\n\n const promise = executionService\n .handleRpcRequest(snapId, {\n origin,\n handler,\n request: {\n jsonrpc: '2.0',\n id: 1,\n ...options,\n },\n })\n .then(async (result) => {\n const state = store.getState();\n const notifications = getNotifications(state);\n const errors = getErrors(state);\n const events = getEvents(state);\n const traces = getTraces(state);\n const interfaceId = notifications[0]?.content;\n\n store.dispatch(clearNotifications());\n store.dispatch(clearTrackables());\n\n try {\n const getInterfaceFn = await getInterfaceApi(\n result,\n snapId,\n controllerMessenger,\n simulationOptions,\n interfaceId,\n );\n\n return {\n id: String(id),\n response: {\n result: getSafeJson(result),\n },\n notifications,\n tracked: {\n errors,\n events,\n traces,\n },\n ...(getInterfaceFn ? { getInterface: getInterfaceFn } : {}),\n };\n } catch (error) {\n const [unwrappedError] = unwrapError(error);\n return {\n id: String(id),\n response: {\n error: unwrappedError.serialize(),\n },\n notifications: [],\n tracked: {\n errors: [],\n events: [],\n traces: [],\n },\n getInterface: getInterfaceError,\n };\n }\n })\n .catch((error) => {\n const [unwrappedError] = unwrapError(error);\n\n return {\n id: String(id),\n response: {\n error: unwrappedError.serialize(),\n },\n notifications: [],\n tracked: {\n errors: [],\n events: [],\n traces: [],\n },\n getInterface: getInterfaceError,\n };\n }) as unknown as SnapRequest;\n\n promise.getInterface = async () => {\n const sagaPromise = runSaga(\n getInterface,\n runSaga,\n snapId,\n controllerMessenger,\n simulationOptions,\n ).toPromise();\n const result = await Promise.race([promise, sagaPromise]);\n\n // If the request promise has resolved to an error, we should throw\n // instead of waiting for an interface that likely will never be displayed\n if (\n is(result, SnapResponseStruct) &&\n hasProperty(result.response, 'error')\n ) {\n throw new Error(\n `Unable to get the interface from the Snap: The returned interface may be invalid. The error message received was: ${\n (result.response.error as JsonRpcError).message\n }`,\n );\n }\n\n return await sagaPromise;\n };\n\n return promise;\n}\n\n/**\n * Get the interface ID from the result if it's available or create a new interface if the result contains static components.\n *\n * @param result - The handler result object.\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger.\n * @returns The interface ID or undefined if the result doesn't include content.\n */\nexport async function getInterfaceFromResult(\n result: unknown,\n snapId: SnapId,\n controllerMessenger: RootControllerMessenger,\n) {\n if (isPlainObject(result) && hasProperty(result, 'id')) {\n return result.id as string;\n }\n\n if (isPlainObject(result) && hasProperty(result, 'content')) {\n assert(\n is(result.content, ComponentOrElementStruct),\n 'The Snap returned an invalid interface.',\n );\n\n const id = controllerMessenger.call(\n 'SnapInterfaceController:createInterface',\n snapId,\n result.content as ComponentOrElement,\n );\n\n return id;\n }\n\n return undefined;\n}\n\n/**\n * Get the response content from the `SnapInterfaceController` and include the\n * interaction methods.\n *\n * @param result - The handler result object.\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger.\n * @param options - The simulation options.\n * @param contentId - The id of the interface if it exists outside of the result.\n * @returns The content components if any.\n */\nexport async function getInterfaceApi(\n result: unknown,\n snapId: SnapId,\n controllerMessenger: RootControllerMessenger,\n options: SimulationOptions,\n contentId?: string,\n): Promise<(() => SnapHandlerInterface) | undefined> {\n const interfaceId = await getInterfaceFromResult(\n result,\n snapId,\n controllerMessenger,\n );\n\n const id = interfaceId ?? contentId;\n\n if (id) {\n return () => {\n const { content } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const actions = getInterfaceActions(\n snapId,\n controllerMessenger,\n options,\n {\n id,\n content,\n },\n );\n\n return {\n content,\n ...actions,\n };\n };\n }\n\n return undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"request.cjs","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AbstractExecutionService } from '@metamask/snaps-controllers';\nimport {\n type ComponentOrElement,\n ComponentOrElementStruct,\n type JsonRpcError,\n type SnapId,\n} from '@metamask/snaps-sdk';\nimport type { HandlerType } from '@metamask/snaps-utils';\nimport { unwrapError } from '@metamask/snaps-utils';\nimport { is } from '@metamask/superstruct';\nimport {\n assert,\n getSafeJson,\n hasProperty,\n isPlainObject,\n} from '@metamask/utils';\nimport { nanoid } from '@reduxjs/toolkit';\n\nimport type { RootControllerMessenger } from './controllers';\nimport { getInterface, getInterfaceActions } from './interface';\nimport type { SimulationOptions } from './options';\nimport type { RunSagaFunction, Store } from './store';\nimport {\n getTraces,\n getErrors,\n clearNotifications,\n getNotifications,\n getEvents,\n clearTrackables,\n} from './store';\nimport { SnapResponseStruct } from './structs';\nimport type {\n RequestOptions,\n SnapHandlerInterface,\n SnapRequest,\n} from './types';\n\nexport type HandleRequestOptions = {\n snapId: SnapId;\n store: Store;\n executionService: AbstractExecutionService<unknown>;\n handler: HandlerType;\n controllerMessenger: RootControllerMessenger;\n simulationOptions: SimulationOptions;\n runSaga: RunSagaFunction;\n request: RequestOptions;\n};\n\n/**\n * Send a JSON-RPC request to the Snap, and wrap the response in a\n * {@link SnapResponse} object.\n *\n * @param options - The request options.\n * @param options.snapId - The ID of the Snap to send the request to.\n * @param options.store - The Redux store.\n * @param options.executionService - The execution service to use to send the\n * request.\n * @param options.handler - The handler to use to send the request.\n * @param options.controllerMessenger - The controller messenger used to call actions.\n * @param options.simulationOptions - The simulation options.\n * @param options.runSaga - A function to run a saga outside the usual Redux\n * flow.\n * @param options.request - The request to send.\n * @param options.request.id - The ID of the request. If not provided, a random\n * ID will be generated.\n * @param options.request.origin - The origin of the request. Defaults to\n * `https://metamask.io`.\n * @returns The response, wrapped in a {@link SnapResponse} object.\n */\nexport function handleRequest({\n snapId,\n store,\n executionService,\n handler,\n controllerMessenger,\n simulationOptions,\n runSaga,\n request: { id = nanoid(), origin = 'https://metamask.io', ...options },\n}: HandleRequestOptions): SnapRequest {\n const getInterfaceError = () => {\n throw new Error(\n 'Unable to get the interface from the Snap: The request to the Snap failed.',\n );\n };\n\n const promise = executionService\n .handleRpcRequest(snapId, {\n origin,\n handler,\n request: {\n jsonrpc: '2.0',\n id: 1,\n ...options,\n },\n })\n .then(async (result) => {\n const state = store.getState();\n const notifications = getNotifications(state);\n const errors = getErrors(state);\n const events = getEvents(state);\n const traces = getTraces(state);\n const interfaceId = notifications[0]?.content;\n\n store.dispatch(clearNotifications());\n store.dispatch(clearTrackables());\n\n try {\n const getInterfaceFn = await getInterfaceApi(\n result,\n snapId,\n controllerMessenger,\n simulationOptions,\n interfaceId,\n );\n\n return {\n id: String(id),\n response: {\n result: getSafeJson(result),\n },\n notifications,\n tracked: {\n errors,\n events,\n traces,\n },\n ...(getInterfaceFn ? { getInterface: getInterfaceFn } : {}),\n };\n } catch (error) {\n const [unwrappedError] = unwrapError(error);\n return {\n id: String(id),\n response: {\n error: unwrappedError.serialize(),\n },\n notifications: [],\n tracked: {\n errors: [],\n events: [],\n traces: [],\n },\n getInterface: getInterfaceError,\n };\n }\n })\n .catch((error) => {\n const [unwrappedError] = unwrapError(error);\n\n return {\n id: String(id),\n response: {\n error: unwrappedError.serialize(),\n },\n notifications: [],\n tracked: {\n errors: [],\n events: [],\n traces: [],\n },\n getInterface: getInterfaceError,\n };\n }) as unknown as SnapRequest;\n\n promise.getInterface = async () => {\n const sagaPromise = runSaga(\n getInterface,\n runSaga,\n snapId,\n controllerMessenger,\n simulationOptions,\n ).toPromise();\n const result = await Promise.race([promise, sagaPromise]);\n\n // If the request promise has resolved to an error, we should throw\n // instead of waiting for an interface that likely will never be displayed\n if (\n is(result, SnapResponseStruct) &&\n hasProperty(result.response, 'error')\n ) {\n throw new Error(\n `Unable to get the interface from the Snap: The returned interface may be invalid. The error message received was: ${\n (result.response.error as JsonRpcError).message\n }`,\n );\n }\n\n return await sagaPromise;\n };\n\n return promise;\n}\n\n/**\n * Get the interface ID from the result if it's available or create a new interface if the result contains static components.\n *\n * @param result - The handler result object.\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger.\n * @returns The interface ID or undefined if the result doesn't include content.\n */\nexport async function getInterfaceFromResult(\n result: unknown,\n snapId: SnapId,\n controllerMessenger: RootControllerMessenger,\n) {\n if (isPlainObject(result) && hasProperty(result, 'id')) {\n return result.id as string;\n }\n\n if (isPlainObject(result) && hasProperty(result, 'content')) {\n assert(\n is(result.content, ComponentOrElementStruct),\n 'The Snap returned an invalid interface.',\n );\n\n const id = controllerMessenger.call(\n 'SnapInterfaceController:createInterface',\n snapId,\n result.content as ComponentOrElement,\n );\n\n return id;\n }\n\n return undefined;\n}\n\n/**\n * Get the response content from the `SnapInterfaceController` and include the\n * interaction methods.\n *\n * @param result - The handler result object.\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger.\n * @param options - The simulation options.\n * @param contentId - The id of the interface if it exists outside of the result.\n * @returns The content components if any.\n */\nexport async function getInterfaceApi(\n result: unknown,\n snapId: SnapId,\n controllerMessenger: RootControllerMessenger,\n options: SimulationOptions,\n contentId?: string,\n): Promise<(() => SnapHandlerInterface) | undefined> {\n const interfaceId = await getInterfaceFromResult(\n result,\n snapId,\n controllerMessenger,\n );\n\n const id = interfaceId ?? contentId;\n\n if (id) {\n try {\n controllerMessenger.call(\n 'SnapInterfaceController:setInterfaceDisplayed',\n snapId,\n id,\n );\n } catch {\n // The call will fail for invalid interfaces, but we can just ignore that\n // here.\n }\n\n return () => {\n const { content } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const actions = getInterfaceActions(\n snapId,\n controllerMessenger,\n options,\n {\n id,\n content,\n },\n );\n\n return {\n content,\n ...actions,\n };\n };\n }\n\n return undefined;\n}\n"]}
|
package/dist/request.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.cts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,oCAAoC;AAC5E,OAAO,EAIL,KAAK,MAAM,EACZ,4BAA4B;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,8BAA8B;AAWzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,0BAAsB;AAE7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAkB;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,0BAAgB;AAUtD,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,WAAW,EACZ,oBAAgB;AAEjB,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,gBAAgB,EAAE,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,EAAE,WAAW,CAAC;IACrB,mBAAmB,EAAE,uBAAuB,CAAC;IAC7C,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,OAAO,EACP,mBAAmB,EACnB,iBAAiB,EACjB,OAAO,EACP,OAAO,EAAE,EAAE,EAAa,EAAE,MAA8B,EAAE,GAAG,OAAO,EAAE,GACvE,EAAE,oBAAoB,GAAG,WAAW,CAgHpC;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,uBAAuB,+BAsB7C;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,uBAAuB,EAC5C,OAAO,EAAE,iBAAiB,EAC1B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,MAAM,oBAAoB,CAAC,GAAG,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"request.d.cts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,oCAAoC;AAC5E,OAAO,EAIL,KAAK,MAAM,EACZ,4BAA4B;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,8BAA8B;AAWzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,0BAAsB;AAE7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAkB;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,0BAAgB;AAUtD,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,WAAW,EACZ,oBAAgB;AAEjB,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,gBAAgB,EAAE,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,EAAE,WAAW,CAAC;IACrB,mBAAmB,EAAE,uBAAuB,CAAC;IAC7C,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,OAAO,EACP,mBAAmB,EACnB,iBAAiB,EACjB,OAAO,EACP,OAAO,EAAE,EAAE,EAAa,EAAE,MAA8B,EAAE,GAAG,OAAO,EAAE,GACvE,EAAE,oBAAoB,GAAG,WAAW,CAgHpC;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,uBAAuB,+BAsB7C;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,uBAAuB,EAC5C,OAAO,EAAE,iBAAiB,EAC1B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,MAAM,oBAAoB,CAAC,GAAG,SAAS,CAAC,CA8CnD"}
|
package/dist/request.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.mts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,oCAAoC;AAC5E,OAAO,EAIL,KAAK,MAAM,EACZ,4BAA4B;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,8BAA8B;AAWzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,0BAAsB;AAE7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAkB;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,0BAAgB;AAUtD,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,WAAW,EACZ,oBAAgB;AAEjB,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,gBAAgB,EAAE,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,EAAE,WAAW,CAAC;IACrB,mBAAmB,EAAE,uBAAuB,CAAC;IAC7C,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,OAAO,EACP,mBAAmB,EACnB,iBAAiB,EACjB,OAAO,EACP,OAAO,EAAE,EAAE,EAAa,EAAE,MAA8B,EAAE,GAAG,OAAO,EAAE,GACvE,EAAE,oBAAoB,GAAG,WAAW,CAgHpC;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,uBAAuB,+BAsB7C;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,uBAAuB,EAC5C,OAAO,EAAE,iBAAiB,EAC1B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,MAAM,oBAAoB,CAAC,GAAG,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"request.d.mts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,oCAAoC;AAC5E,OAAO,EAIL,KAAK,MAAM,EACZ,4BAA4B;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,8BAA8B;AAWzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,0BAAsB;AAE7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAkB;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,0BAAgB;AAUtD,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,WAAW,EACZ,oBAAgB;AAEjB,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,gBAAgB,EAAE,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,EAAE,WAAW,CAAC;IACrB,mBAAmB,EAAE,uBAAuB,CAAC;IAC7C,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,OAAO,EACP,mBAAmB,EACnB,iBAAiB,EACjB,OAAO,EACP,OAAO,EAAE,EAAE,EAAa,EAAE,MAA8B,EAAE,GAAG,OAAO,EAAE,GACvE,EAAE,oBAAoB,GAAG,WAAW,CAgHpC;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,uBAAuB,+BAsB7C;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,uBAAuB,EAC5C,OAAO,EAAE,iBAAiB,EAC1B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,MAAM,oBAAoB,CAAC,GAAG,SAAS,CAAC,CA8CnD"}
|
package/dist/request.mjs
CHANGED
|
@@ -147,6 +147,13 @@ export async function getInterfaceApi(result, snapId, controllerMessenger, optio
|
|
|
147
147
|
const interfaceId = await getInterfaceFromResult(result, snapId, controllerMessenger);
|
|
148
148
|
const id = interfaceId ?? contentId;
|
|
149
149
|
if (id) {
|
|
150
|
+
try {
|
|
151
|
+
controllerMessenger.call('SnapInterfaceController:setInterfaceDisplayed', snapId, id);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// The call will fail for invalid interfaces, but we can just ignore that
|
|
155
|
+
// here.
|
|
156
|
+
}
|
|
150
157
|
return () => {
|
|
151
158
|
const { content } = controllerMessenger.call('SnapInterfaceController:getInterface', snapId, id);
|
|
152
159
|
const actions = getInterfaceActions(snapId, controllerMessenger, options, {
|
package/dist/request.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.mjs","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AbstractExecutionService } from '@metamask/snaps-controllers';\nimport {\n type ComponentOrElement,\n ComponentOrElementStruct,\n type JsonRpcError,\n type SnapId,\n} from '@metamask/snaps-sdk';\nimport type { HandlerType } from '@metamask/snaps-utils';\nimport { unwrapError } from '@metamask/snaps-utils';\nimport { is } from '@metamask/superstruct';\nimport {\n assert,\n getSafeJson,\n hasProperty,\n isPlainObject,\n} from '@metamask/utils';\nimport { nanoid } from '@reduxjs/toolkit';\n\nimport type { RootControllerMessenger } from './controllers';\nimport { getInterface, getInterfaceActions } from './interface';\nimport type { SimulationOptions } from './options';\nimport type { RunSagaFunction, Store } from './store';\nimport {\n getTraces,\n getErrors,\n clearNotifications,\n getNotifications,\n getEvents,\n clearTrackables,\n} from './store';\nimport { SnapResponseStruct } from './structs';\nimport type {\n RequestOptions,\n SnapHandlerInterface,\n SnapRequest,\n} from './types';\n\nexport type HandleRequestOptions = {\n snapId: SnapId;\n store: Store;\n executionService: AbstractExecutionService<unknown>;\n handler: HandlerType;\n controllerMessenger: RootControllerMessenger;\n simulationOptions: SimulationOptions;\n runSaga: RunSagaFunction;\n request: RequestOptions;\n};\n\n/**\n * Send a JSON-RPC request to the Snap, and wrap the response in a\n * {@link SnapResponse} object.\n *\n * @param options - The request options.\n * @param options.snapId - The ID of the Snap to send the request to.\n * @param options.store - The Redux store.\n * @param options.executionService - The execution service to use to send the\n * request.\n * @param options.handler - The handler to use to send the request.\n * @param options.controllerMessenger - The controller messenger used to call actions.\n * @param options.simulationOptions - The simulation options.\n * @param options.runSaga - A function to run a saga outside the usual Redux\n * flow.\n * @param options.request - The request to send.\n * @param options.request.id - The ID of the request. If not provided, a random\n * ID will be generated.\n * @param options.request.origin - The origin of the request. Defaults to\n * `https://metamask.io`.\n * @returns The response, wrapped in a {@link SnapResponse} object.\n */\nexport function handleRequest({\n snapId,\n store,\n executionService,\n handler,\n controllerMessenger,\n simulationOptions,\n runSaga,\n request: { id = nanoid(), origin = 'https://metamask.io', ...options },\n}: HandleRequestOptions): SnapRequest {\n const getInterfaceError = () => {\n throw new Error(\n 'Unable to get the interface from the Snap: The request to the Snap failed.',\n );\n };\n\n const promise = executionService\n .handleRpcRequest(snapId, {\n origin,\n handler,\n request: {\n jsonrpc: '2.0',\n id: 1,\n ...options,\n },\n })\n .then(async (result) => {\n const state = store.getState();\n const notifications = getNotifications(state);\n const errors = getErrors(state);\n const events = getEvents(state);\n const traces = getTraces(state);\n const interfaceId = notifications[0]?.content;\n\n store.dispatch(clearNotifications());\n store.dispatch(clearTrackables());\n\n try {\n const getInterfaceFn = await getInterfaceApi(\n result,\n snapId,\n controllerMessenger,\n simulationOptions,\n interfaceId,\n );\n\n return {\n id: String(id),\n response: {\n result: getSafeJson(result),\n },\n notifications,\n tracked: {\n errors,\n events,\n traces,\n },\n ...(getInterfaceFn ? { getInterface: getInterfaceFn } : {}),\n };\n } catch (error) {\n const [unwrappedError] = unwrapError(error);\n return {\n id: String(id),\n response: {\n error: unwrappedError.serialize(),\n },\n notifications: [],\n tracked: {\n errors: [],\n events: [],\n traces: [],\n },\n getInterface: getInterfaceError,\n };\n }\n })\n .catch((error) => {\n const [unwrappedError] = unwrapError(error);\n\n return {\n id: String(id),\n response: {\n error: unwrappedError.serialize(),\n },\n notifications: [],\n tracked: {\n errors: [],\n events: [],\n traces: [],\n },\n getInterface: getInterfaceError,\n };\n }) as unknown as SnapRequest;\n\n promise.getInterface = async () => {\n const sagaPromise = runSaga(\n getInterface,\n runSaga,\n snapId,\n controllerMessenger,\n simulationOptions,\n ).toPromise();\n const result = await Promise.race([promise, sagaPromise]);\n\n // If the request promise has resolved to an error, we should throw\n // instead of waiting for an interface that likely will never be displayed\n if (\n is(result, SnapResponseStruct) &&\n hasProperty(result.response, 'error')\n ) {\n throw new Error(\n `Unable to get the interface from the Snap: The returned interface may be invalid. The error message received was: ${\n (result.response.error as JsonRpcError).message\n }`,\n );\n }\n\n return await sagaPromise;\n };\n\n return promise;\n}\n\n/**\n * Get the interface ID from the result if it's available or create a new interface if the result contains static components.\n *\n * @param result - The handler result object.\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger.\n * @returns The interface ID or undefined if the result doesn't include content.\n */\nexport async function getInterfaceFromResult(\n result: unknown,\n snapId: SnapId,\n controllerMessenger: RootControllerMessenger,\n) {\n if (isPlainObject(result) && hasProperty(result, 'id')) {\n return result.id as string;\n }\n\n if (isPlainObject(result) && hasProperty(result, 'content')) {\n assert(\n is(result.content, ComponentOrElementStruct),\n 'The Snap returned an invalid interface.',\n );\n\n const id = controllerMessenger.call(\n 'SnapInterfaceController:createInterface',\n snapId,\n result.content as ComponentOrElement,\n );\n\n return id;\n }\n\n return undefined;\n}\n\n/**\n * Get the response content from the `SnapInterfaceController` and include the\n * interaction methods.\n *\n * @param result - The handler result object.\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger.\n * @param options - The simulation options.\n * @param contentId - The id of the interface if it exists outside of the result.\n * @returns The content components if any.\n */\nexport async function getInterfaceApi(\n result: unknown,\n snapId: SnapId,\n controllerMessenger: RootControllerMessenger,\n options: SimulationOptions,\n contentId?: string,\n): Promise<(() => SnapHandlerInterface) | undefined> {\n const interfaceId = await getInterfaceFromResult(\n result,\n snapId,\n controllerMessenger,\n );\n\n const id = interfaceId ?? contentId;\n\n if (id) {\n return () => {\n const { content } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const actions = getInterfaceActions(\n snapId,\n controllerMessenger,\n options,\n {\n id,\n content,\n },\n );\n\n return {\n content,\n ...actions,\n };\n };\n }\n\n return undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"request.mjs","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AbstractExecutionService } from '@metamask/snaps-controllers';\nimport {\n type ComponentOrElement,\n ComponentOrElementStruct,\n type JsonRpcError,\n type SnapId,\n} from '@metamask/snaps-sdk';\nimport type { HandlerType } from '@metamask/snaps-utils';\nimport { unwrapError } from '@metamask/snaps-utils';\nimport { is } from '@metamask/superstruct';\nimport {\n assert,\n getSafeJson,\n hasProperty,\n isPlainObject,\n} from '@metamask/utils';\nimport { nanoid } from '@reduxjs/toolkit';\n\nimport type { RootControllerMessenger } from './controllers';\nimport { getInterface, getInterfaceActions } from './interface';\nimport type { SimulationOptions } from './options';\nimport type { RunSagaFunction, Store } from './store';\nimport {\n getTraces,\n getErrors,\n clearNotifications,\n getNotifications,\n getEvents,\n clearTrackables,\n} from './store';\nimport { SnapResponseStruct } from './structs';\nimport type {\n RequestOptions,\n SnapHandlerInterface,\n SnapRequest,\n} from './types';\n\nexport type HandleRequestOptions = {\n snapId: SnapId;\n store: Store;\n executionService: AbstractExecutionService<unknown>;\n handler: HandlerType;\n controllerMessenger: RootControllerMessenger;\n simulationOptions: SimulationOptions;\n runSaga: RunSagaFunction;\n request: RequestOptions;\n};\n\n/**\n * Send a JSON-RPC request to the Snap, and wrap the response in a\n * {@link SnapResponse} object.\n *\n * @param options - The request options.\n * @param options.snapId - The ID of the Snap to send the request to.\n * @param options.store - The Redux store.\n * @param options.executionService - The execution service to use to send the\n * request.\n * @param options.handler - The handler to use to send the request.\n * @param options.controllerMessenger - The controller messenger used to call actions.\n * @param options.simulationOptions - The simulation options.\n * @param options.runSaga - A function to run a saga outside the usual Redux\n * flow.\n * @param options.request - The request to send.\n * @param options.request.id - The ID of the request. If not provided, a random\n * ID will be generated.\n * @param options.request.origin - The origin of the request. Defaults to\n * `https://metamask.io`.\n * @returns The response, wrapped in a {@link SnapResponse} object.\n */\nexport function handleRequest({\n snapId,\n store,\n executionService,\n handler,\n controllerMessenger,\n simulationOptions,\n runSaga,\n request: { id = nanoid(), origin = 'https://metamask.io', ...options },\n}: HandleRequestOptions): SnapRequest {\n const getInterfaceError = () => {\n throw new Error(\n 'Unable to get the interface from the Snap: The request to the Snap failed.',\n );\n };\n\n const promise = executionService\n .handleRpcRequest(snapId, {\n origin,\n handler,\n request: {\n jsonrpc: '2.0',\n id: 1,\n ...options,\n },\n })\n .then(async (result) => {\n const state = store.getState();\n const notifications = getNotifications(state);\n const errors = getErrors(state);\n const events = getEvents(state);\n const traces = getTraces(state);\n const interfaceId = notifications[0]?.content;\n\n store.dispatch(clearNotifications());\n store.dispatch(clearTrackables());\n\n try {\n const getInterfaceFn = await getInterfaceApi(\n result,\n snapId,\n controllerMessenger,\n simulationOptions,\n interfaceId,\n );\n\n return {\n id: String(id),\n response: {\n result: getSafeJson(result),\n },\n notifications,\n tracked: {\n errors,\n events,\n traces,\n },\n ...(getInterfaceFn ? { getInterface: getInterfaceFn } : {}),\n };\n } catch (error) {\n const [unwrappedError] = unwrapError(error);\n return {\n id: String(id),\n response: {\n error: unwrappedError.serialize(),\n },\n notifications: [],\n tracked: {\n errors: [],\n events: [],\n traces: [],\n },\n getInterface: getInterfaceError,\n };\n }\n })\n .catch((error) => {\n const [unwrappedError] = unwrapError(error);\n\n return {\n id: String(id),\n response: {\n error: unwrappedError.serialize(),\n },\n notifications: [],\n tracked: {\n errors: [],\n events: [],\n traces: [],\n },\n getInterface: getInterfaceError,\n };\n }) as unknown as SnapRequest;\n\n promise.getInterface = async () => {\n const sagaPromise = runSaga(\n getInterface,\n runSaga,\n snapId,\n controllerMessenger,\n simulationOptions,\n ).toPromise();\n const result = await Promise.race([promise, sagaPromise]);\n\n // If the request promise has resolved to an error, we should throw\n // instead of waiting for an interface that likely will never be displayed\n if (\n is(result, SnapResponseStruct) &&\n hasProperty(result.response, 'error')\n ) {\n throw new Error(\n `Unable to get the interface from the Snap: The returned interface may be invalid. The error message received was: ${\n (result.response.error as JsonRpcError).message\n }`,\n );\n }\n\n return await sagaPromise;\n };\n\n return promise;\n}\n\n/**\n * Get the interface ID from the result if it's available or create a new interface if the result contains static components.\n *\n * @param result - The handler result object.\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger.\n * @returns The interface ID or undefined if the result doesn't include content.\n */\nexport async function getInterfaceFromResult(\n result: unknown,\n snapId: SnapId,\n controllerMessenger: RootControllerMessenger,\n) {\n if (isPlainObject(result) && hasProperty(result, 'id')) {\n return result.id as string;\n }\n\n if (isPlainObject(result) && hasProperty(result, 'content')) {\n assert(\n is(result.content, ComponentOrElementStruct),\n 'The Snap returned an invalid interface.',\n );\n\n const id = controllerMessenger.call(\n 'SnapInterfaceController:createInterface',\n snapId,\n result.content as ComponentOrElement,\n );\n\n return id;\n }\n\n return undefined;\n}\n\n/**\n * Get the response content from the `SnapInterfaceController` and include the\n * interaction methods.\n *\n * @param result - The handler result object.\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger.\n * @param options - The simulation options.\n * @param contentId - The id of the interface if it exists outside of the result.\n * @returns The content components if any.\n */\nexport async function getInterfaceApi(\n result: unknown,\n snapId: SnapId,\n controllerMessenger: RootControllerMessenger,\n options: SimulationOptions,\n contentId?: string,\n): Promise<(() => SnapHandlerInterface) | undefined> {\n const interfaceId = await getInterfaceFromResult(\n result,\n snapId,\n controllerMessenger,\n );\n\n const id = interfaceId ?? contentId;\n\n if (id) {\n try {\n controllerMessenger.call(\n 'SnapInterfaceController:setInterfaceDisplayed',\n snapId,\n id,\n );\n } catch {\n // The call will fail for invalid interfaces, but we can just ignore that\n // here.\n }\n\n return () => {\n const { content } = controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n id,\n );\n\n const actions = getInterfaceActions(\n snapId,\n controllerMessenger,\n options,\n {\n id,\n content,\n },\n );\n\n return {\n content,\n ...actions,\n };\n };\n }\n\n return undefined;\n}\n"]}
|
package/dist/simulation.cjs
CHANGED
|
@@ -4,7 +4,6 @@ exports.registerActions = exports.getMultichainHooks = exports.getPermittedHooks
|
|
|
4
4
|
const json_rpc_middleware_stream_1 = require("@metamask/json-rpc-middleware-stream");
|
|
5
5
|
const messenger_1 = require("@metamask/messenger");
|
|
6
6
|
const permission_controller_1 = require("@metamask/permission-controller");
|
|
7
|
-
const phishing_controller_1 = require("@metamask/phishing-controller");
|
|
8
7
|
const node_1 = require("@metamask/snaps-controllers/node");
|
|
9
8
|
const snaps_rpc_methods_1 = require("@metamask/snaps-rpc-methods");
|
|
10
9
|
const snaps_utils_1 = require("@metamask/snaps-utils");
|
|
@@ -178,7 +177,7 @@ function getPermittedHooks(snapId, snapFiles, controllerMessenger, runSaga) {
|
|
|
178
177
|
getSnapFile: async (path, encoding) => await (0, files_1.getSnapFile)(snapFiles.auxiliaryFiles, path, encoding),
|
|
179
178
|
createInterface: (...args) => controllerMessenger.call('SnapInterfaceController:createInterface', snapId, ...args),
|
|
180
179
|
updateInterface: (...args) => controllerMessenger.call('SnapInterfaceController:updateInterface', snapId, ...args),
|
|
181
|
-
getInterfaceState: (...args) => controllerMessenger.call('SnapInterfaceController:
|
|
180
|
+
getInterfaceState: (...args) => controllerMessenger.call('SnapInterfaceController:getInterfaceState', snapId, ...args),
|
|
182
181
|
getInterfaceContext: (...args) => controllerMessenger.call('SnapInterfaceController:getInterface', snapId, ...args).context,
|
|
183
182
|
resolveInterface: async (...args) => controllerMessenger.call('SnapInterfaceController:resolveInterface', snapId, ...args),
|
|
184
183
|
getEntropySources: (0, hooks_1.getGetEntropySourcesImplementation)(),
|
|
@@ -248,7 +247,7 @@ exports.getMultichainHooks = getMultichainHooks;
|
|
|
248
247
|
* @param snapId - The ID of the Snap.
|
|
249
248
|
*/
|
|
250
249
|
function registerActions(controllerMessenger, runSaga, options, snapId) {
|
|
251
|
-
controllerMessenger.registerActionHandler('PhishingController:testOrigin', () => ({ result: false, type:
|
|
250
|
+
controllerMessenger.registerActionHandler('PhishingController:testOrigin', () => ({ result: false, type: 'all' }));
|
|
252
251
|
controllerMessenger.registerActionHandler('AccountsController:getAccountByAddress',
|
|
253
252
|
// @ts-expect-error - This is a partial account with only the necessary
|
|
254
253
|
// data used by the interface controller.
|
package/dist/simulation.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simulation.cjs","sourceRoot":"","sources":["../src/simulation.ts"],"names":[],"mappings":"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","sourcesContent":["import { createEngineStream } from '@metamask/json-rpc-middleware-stream';\nimport type { CryptographicFunctions } from '@metamask/key-tree';\nimport type {\n ActionConstraint,\n EventConstraint,\n MockAnyNamespace,\n NamespacedName,\n} from '@metamask/messenger';\nimport { MOCK_ANY_NAMESPACE, Messenger } from '@metamask/messenger';\nimport {\n PermissionDoesNotExistError,\n type Caveat,\n type RequestedPermissions,\n} from '@metamask/permission-controller';\nimport { PhishingDetectorResultType } from '@metamask/phishing-controller';\nimport type { AbstractExecutionService } from '@metamask/snaps-controllers';\nimport {\n detectSnapLocation,\n fetchSnap,\n NodeThreadExecutionService,\n setupMultiplex,\n} from '@metamask/snaps-controllers/node';\nimport { DIALOG_APPROVAL_TYPES } from '@metamask/snaps-rpc-methods';\nimport type {\n TrackEventParams,\n AuxiliaryFileEncoding,\n Component,\n InterfaceState,\n InterfaceContext,\n SnapId,\n EntropySource,\n TraceRequest,\n EndTraceRequest,\n TraceContext,\n} from '@metamask/snaps-sdk';\nimport type { FetchedSnapFiles, Snap } from '@metamask/snaps-utils';\nimport { logError } from '@metamask/snaps-utils';\nimport type { CaipAssetType, Hex, Json } from '@metamask/utils';\nimport type { Duplex } from 'readable-stream';\nimport { pipeline } from 'readable-stream';\nimport type { SagaIterator } from 'redux-saga';\nimport { select } from 'redux-saga/effects';\n\nimport type { RootControllerMessenger } from './controllers';\nimport { getControllers, registerSnap } from './controllers';\nimport { getSnapFile } from './files';\nimport type { SnapHelpers } from './helpers';\nimport { getHelpers } from './helpers';\nimport { resolveWithSaga } from './interface';\nimport { asyncResolve, getEndowments } from './methods';\nimport {\n getPermittedClearSnapStateMethodImplementation,\n getPermittedGetSnapStateMethodImplementation,\n getPermittedUpdateSnapStateMethodImplementation,\n getGetEntropySourcesImplementation,\n getGetMnemonicImplementation,\n getGetSnapImplementation,\n getTrackEventImplementation,\n getTrackErrorImplementation,\n getEndTraceImplementation,\n getStartTraceImplementation,\n getSetCurrentChainImplementation,\n} from './methods/hooks';\nimport { getGetMnemonicSeedImplementation } from './methods/hooks/get-mnemonic-seed';\nimport { createJsonRpcEngine } from './middleware';\nimport type {\n SimulationAccount,\n SimulationOptions,\n SimulationUserOptions,\n} from './options';\nimport { getOptions } from './options';\nimport type {\n ApplicationState,\n Interface,\n RunSagaFunction,\n Store,\n} from './store';\nimport { createStore, getCurrentInterface } from './store';\nimport { addSnapMetadataToAccount } from './utils/account';\n\n/**\n * Options for the execution service, without the options that are shared\n * between all execution services.\n *\n * @template Service - The type of the execution service, i.e., the class that\n * creates the execution service.\n */\nexport type ExecutionServiceOptions<\n Service extends new (...args: any[]) => any,\n> = Omit<\n ConstructorParameters<Service>[0],\n keyof ConstructorParameters<typeof AbstractExecutionService<unknown>>[0]\n>;\n\n/**\n * The options for running a Snap in a simulated environment.\n *\n * @property executionService - The execution service to use.\n * @property executionServiceOptions - The options to use when creating the\n * execution service, if any. This should only include options specific to the\n * provided execution service.\n * @property options - The simulation options.\n * @template Service - The type of the execution service.\n */\nexport type InstallSnapOptions<\n Service extends new (\n ...args: any[]\n ) => InstanceType<typeof AbstractExecutionService<unknown>>,\n> =\n ExecutionServiceOptions<Service> extends Record<string, never>\n ? {\n executionService: Service;\n executionServiceOptions?: ExecutionServiceOptions<Service>;\n options?: SimulationUserOptions;\n }\n : {\n executionService: Service;\n executionServiceOptions: ExecutionServiceOptions<Service>;\n options?: SimulationUserOptions;\n };\n\nexport type InstalledSnap = {\n snapId: SnapId;\n store: Store;\n executionService: InstanceType<typeof AbstractExecutionService>;\n controllerMessenger: Messenger<\n NamespacedName,\n ActionConstraint,\n EventConstraint\n >;\n runSaga: RunSagaFunction;\n};\n\nexport type RestrictedMiddlewareHooks = {\n /**\n * A hook that returns the user's secret recovery phrase.\n *\n * @param source - The entropy source to get the mnemonic from.\n * @returns The user's secret recovery phrase.\n */\n getMnemonic: (source?: string | undefined) => Promise<Uint8Array>;\n\n /**\n * A hook that returns the seed derived from the user's secret recovery phrase.\n *\n * @param source - The entropy source to get the seed from.\n * @returns The seed.\n */\n getMnemonicSeed: (source?: string | undefined) => Promise<Uint8Array>;\n\n /**\n * A hook that returns whether the client is locked or not.\n *\n * @returns A boolean flag signaling whether the client is locked.\n */\n getIsLocked: () => boolean;\n\n /**\n * Get the cryptographic functions to use for the client. This may return an\n * empty object to fall back to the default cryptographic functions.\n *\n * @returns The cryptographic functions to use for the client.\n */\n getClientCryptography: () => CryptographicFunctions;\n\n /**\n * A hook that returns metadata about a given Snap.\n *\n * @param snapId - The ID of a Snap.\n * @returns The metadata for the given Snap.\n */\n getSnap: (snapId: string) => Snap;\n\n /**\n * A hook that sets the current chain ID.\n *\n * @param chainId - The chain ID.\n */\n setCurrentChain: (chainId: Hex) => null;\n\n /**\n * A hook that gets the current simulation state.\n *\n * @returns The simulation state.\n */\n getSimulationState: () => ApplicationState;\n};\n\nexport type PermittedMiddlewareHooks = {\n /**\n * A hook that gets whether the requesting origin has a given permission.\n *\n * @param permissionName - The name of the permission to check.\n * @returns Whether the origin has the permission.\n */\n hasPermission: (permissionName: string) => boolean;\n\n /**\n * A hook that returns the entropy sources available to the Snap.\n *\n * @returns The entropy sources available to the Snap.\n */\n getEntropySources: () => EntropySource[];\n\n /**\n * A hook that returns a promise that resolves once the extension is unlocked.\n *\n * @param shouldShowUnlockRequest - Whether to show the unlock request.\n * @returns A promise that resolves once the extension is unlocked.\n */\n getUnlockPromise: (shouldShowUnlockRequest: boolean) => Promise<void>;\n\n /**\n * A hook that returns whether the client is locked or not.\n *\n * @returns A boolean flag signaling whether the client is locked.\n */\n getIsLocked: () => boolean;\n\n /**\n * A hook that returns whether the client is active or not.\n *\n * @returns A boolean flag signaling whether the client is opened.\n */\n getIsActive: () => boolean;\n\n /**\n * A hook that returns the client version.\n *\n * @returns A string that corresponds to the client version.\n */\n getVersion: () => string;\n\n /**\n * A hook that returns the Snap's auxiliary file for the given path. This hook\n * is bound to the Snap ID.\n *\n * @param path - The path of the auxiliary file to get.\n * @param encoding - The encoding to use when returning the file.\n * @returns The Snap's auxiliary file for the given path.\n */\n getSnapFile: (\n path: string,\n encoding: AuxiliaryFileEncoding,\n ) => Promise<string | null>;\n\n /**\n * A hook that gets the state of the Snap. This hook is bound to the Snap ID.\n *\n * @param encrypted - Whether to get the encrypted or unencrypted state.\n * @returns The current state of the Snap.\n */\n getSnapState: (encrypted: boolean) => Promise<Record<string, Json>>;\n\n /**\n * A hook that updates the state of the Snap. This hook is bound to the Snap\n * ID.\n *\n * @param newState - The new state.\n * @param encrypted - Whether to update the encrypted or unencrypted state.\n */\n updateSnapState: (\n newState: Record<string, Json>,\n encrypted: boolean,\n ) => Promise<void>;\n\n /**\n * A hook that clears the state of the Snap. This hook is bound to the Snap\n * ID.\n *\n * @param encrypted - Whether to clear the encrypted or unencrypted state.\n */\n clearSnapState: (encrypted: boolean) => Promise<void>;\n\n /**\n * A hook that creates an interface for the Snap. This hook is bound to the\n * Snap ID.\n *\n * @param content - The content of the interface.\n * @param context - The context of the interface.\n * @returns The ID of the created interface.\n */\n createInterface: (content: Component, context?: InterfaceContext) => string;\n\n /**\n * A hook that updates an interface for the Snap. This hook is bound to the\n * Snap ID.\n *\n * @param id - The ID of the interface to update.\n * @param content - The content of the interface.\n */\n updateInterface: (id: string, content: Component) => void;\n\n /**\n * A hook that gets the state of an interface for the Snap. This hook is bound\n * to the Snap ID.\n *\n * @param id - The ID of the interface to get.\n * @returns The state of the interface.\n */\n getInterfaceState: (id: string) => InterfaceState;\n\n /**\n * A hook that gets the context of an interface for the Snap. This hook is\n * bound to the Snap ID.\n *\n * @param id - The ID of the interface to get.\n * @returns The context of the interface.\n */\n getInterfaceContext: (id: string) => InterfaceContext | null;\n\n /**\n * A hook that resolves an interface for the Snap. This hook is bound to the\n * Snap ID.\n *\n * @param id - The ID of the interface to resolve.\n * @param value - The value to resolve the interface with.\n */\n resolveInterface: (id: string, value: Json) => Promise<void>;\n\n /**\n * A hook that gets the Snap's metadata.\n *\n * @param snapId - The ID of the Snap to get.\n * @returns The Snap's metadata.\n */\n getSnap(snapId: string): Snap;\n\n /**\n * A hook that tracks an error.\n *\n * @param error - The error object containing error details and properties.\n */\n trackError(error: Error): void;\n\n /**\n * A hook that tracks an event.\n *\n * @param event - The event object containing event details and properties.\n */\n trackEvent(event: TrackEventParams['event']): void;\n\n /**\n * A hook that starts a performance trace.\n *\n * @param request - The trace request object containing trace details.\n */\n startTrace(request: TraceRequest): TraceContext;\n\n /**\n * A hook that ends a performance trace.\n *\n * @param request - The trace request object containing trace details.\n * @returns The trace data.\n */\n endTrace(request: EndTraceRequest): void;\n};\n\nexport type MultichainMiddlewareHooks = {\n /**\n * A hook that returns the simulated accounts.\n *\n * @returns The simulated accounts.\n */\n getAccounts: () => SimulationAccount[];\n\n /**\n * A hook that retrieves a caveat for a given permission.\n *\n * @param permission - The permission name.\n * @param caveatType - The caveat type.\n * @returns The caveat, if it exists.\n */\n getCaveat: (\n permission: string,\n caveatType: string,\n ) => Caveat<string, Json> | undefined;\n\n /**\n * A hook that grants permissions to the origin.\n *\n * @param permissions - The permissions.\n */\n grantPermissions: (permissions: RequestedPermissions) => void;\n\n /**\n * A hook that revokes a permission for the origin.\n *\n * @param permission - The permission name.\n */\n revokePermission: (permission: string) => void;\n};\n\n/**\n * Install a Snap in a simulated environment. This will fetch the Snap files,\n * create a Redux store, set up the controllers and JSON-RPC stack, register the\n * Snap, and run the Snap code in the execution service.\n *\n * @param snapId - The ID of the Snap to install.\n * @param options - The options to use when installing the Snap.\n * @param options.executionService - The execution service to use.\n * @param options.executionServiceOptions - The options to use when creating the\n * execution service, if any. This should only include options specific to the\n * provided execution service.\n * @param options.options - The simulation options.\n * @returns The installed Snap object.\n * @template Service - The type of the execution service.\n */\nexport async function installSnap<\n Service extends new (\n ...args: any[]\n ) => InstanceType<typeof AbstractExecutionService>,\n>(\n snapId: SnapId,\n {\n executionService,\n executionServiceOptions,\n options: rawOptions = {},\n }: Partial<InstallSnapOptions<Service>> = {},\n): Promise<InstalledSnap & SnapHelpers> {\n const options = getOptions(rawOptions);\n\n // Fetch Snap files.\n const location = detectSnapLocation(snapId, {\n allowLocal: true,\n });\n\n const snapFiles = await fetchSnap(snapId, location);\n\n // Create Redux store.\n const { store, runSaga } = createStore(options);\n\n const controllerMessenger = new Messenger<MockAnyNamespace, any, any>({\n namespace: MOCK_ANY_NAMESPACE,\n });\n\n registerActions(controllerMessenger, runSaga, options, snapId);\n\n // Set up controllers and JSON-RPC stack.\n const restrictedHooks = getRestrictedHooks(options, store, runSaga);\n\n const permittedHooks = getPermittedHooks(\n snapId,\n snapFiles,\n controllerMessenger,\n runSaga,\n );\n\n const multichainHooks = getMultichainHooks(\n snapId,\n options,\n controllerMessenger,\n );\n\n const { subjectMetadataController, permissionController } = getControllers({\n controllerMessenger,\n hooks: restrictedHooks,\n runSaga,\n options,\n });\n\n const permissionMiddleware = permissionController.createPermissionMiddleware({\n origin: snapId,\n });\n\n const engine = createJsonRpcEngine({\n store,\n restrictedHooks,\n permittedHooks,\n permissionMiddleware,\n multichainHooks,\n isMultichain: false,\n });\n\n const multichainEngine = createJsonRpcEngine({\n store,\n restrictedHooks,\n permittedHooks,\n permissionMiddleware,\n multichainHooks,\n isMultichain: true,\n });\n\n // Create execution service.\n const ExecutionService = executionService ?? NodeThreadExecutionService;\n const service = new ExecutionService({\n ...executionServiceOptions,\n messenger: new Messenger({\n namespace: 'ExecutionService',\n parent: controllerMessenger,\n }),\n setupSnapProvider: (_snapId: string, rpcStream: Duplex) => {\n const mux = setupMultiplex(rpcStream, 'snapStream');\n const stream = mux.createStream('metamask-provider');\n const providerStream = createEngineStream({ engine });\n\n // Error function is difficult to test, so we ignore it.\n /* istanbul ignore next 2 */\n pipeline(stream, providerStream, stream, (error) => {\n if (error && !error.message?.match('Premature close')) {\n logError(`Provider stream failure.`, error);\n }\n });\n\n const multichainStream = mux.createStream('metamask-multichain-provider');\n const multichainProviderStream = createEngineStream({\n engine: multichainEngine,\n });\n\n /* istanbul ignore next 2 */\n pipeline(\n multichainStream,\n multichainProviderStream,\n multichainStream,\n (error) => {\n if (error && !error.message?.match('Premature close')) {\n logError(`Provider stream failure.`, error);\n }\n },\n );\n },\n });\n\n // Register the Snap. This sets up the Snap's permissions and subject\n // metadata.\n await registerSnap(snapId, snapFiles.manifest.result, {\n permissionController,\n subjectMetadataController,\n });\n\n // Run the Snap code in the execution service.\n await service.executeSnap({\n snapId,\n sourceCode: snapFiles.sourceCode.toString('utf8'),\n endowments: await getEndowments(permissionController, snapId),\n });\n\n const helpers = getHelpers({\n snapId,\n store,\n controllerMessenger,\n runSaga,\n executionService: service,\n options,\n });\n\n return {\n snapId,\n store,\n executionService: service,\n controllerMessenger,\n runSaga,\n ...helpers,\n };\n}\n\n/**\n * Get the hooks for the simulation.\n *\n * @param options - The simulation options.\n * @param store - The Redux store.\n * @param runSaga - The run saga function.\n * @returns The hooks for the simulation.\n */\nexport function getRestrictedHooks(\n options: SimulationOptions,\n store: Store,\n runSaga: RunSagaFunction,\n): RestrictedMiddlewareHooks {\n return {\n getMnemonic: getGetMnemonicImplementation(options.secretRecoveryPhrase),\n getMnemonicSeed: getGetMnemonicSeedImplementation(\n options.secretRecoveryPhrase,\n ),\n getIsLocked: () => false,\n getClientCryptography: () => ({}),\n getSnap: getGetSnapImplementation(true),\n setCurrentChain: getSetCurrentChainImplementation(runSaga),\n getSimulationState: store.getState.bind(store),\n };\n}\n\n/**\n * Get the permitted hooks for the simulation.\n *\n * @param snapId - The ID of the Snap.\n * @param snapFiles - The fetched Snap files.\n * @param controllerMessenger - The controller messenger.\n * @param runSaga - The run saga function.\n * @returns The permitted hooks for the simulation.\n */\nexport function getPermittedHooks(\n snapId: SnapId,\n snapFiles: FetchedSnapFiles,\n controllerMessenger: RootControllerMessenger,\n runSaga: RunSagaFunction,\n): PermittedMiddlewareHooks {\n return {\n hasPermission: () => true,\n getUnlockPromise: asyncResolve(),\n getIsLocked: () => false,\n getIsActive: () => true,\n getVersion: () => '13.6.0-flask.0',\n\n getSnapFile: async (path: string, encoding: AuxiliaryFileEncoding) =>\n await getSnapFile(snapFiles.auxiliaryFiles, path, encoding),\n\n createInterface: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:createInterface',\n snapId,\n ...args,\n ),\n updateInterface: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterface',\n snapId,\n ...args,\n ),\n getInterfaceState: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n ...args,\n ).state,\n getInterfaceContext: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n ...args,\n ).context,\n resolveInterface: async (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:resolveInterface',\n snapId,\n ...args,\n ),\n\n getEntropySources: getGetEntropySourcesImplementation(),\n getSnapState: getPermittedGetSnapStateMethodImplementation(runSaga),\n updateSnapState: getPermittedUpdateSnapStateMethodImplementation(runSaga),\n clearSnapState: getPermittedClearSnapStateMethodImplementation(runSaga),\n\n getSnap: getGetSnapImplementation(true),\n trackError: getTrackErrorImplementation(runSaga),\n trackEvent: getTrackEventImplementation(runSaga),\n startTrace: getStartTraceImplementation(runSaga),\n endTrace: getEndTraceImplementation(runSaga),\n };\n}\n\n/**\n * Get the hooks for the multichain middleware simulation.\n *\n * @param snapId - The Snap ID.\n * @param options - The simulation options.\n * @param controllerMessenger - The controller messenger.\n * @returns The hooks for the middleware.\n */\nexport function getMultichainHooks(\n snapId: SnapId,\n options: SimulationOptions,\n controllerMessenger: RootControllerMessenger,\n): MultichainMiddlewareHooks {\n return {\n getAccounts: () => options.accounts,\n getCaveat: (permission: string, caveatType: string) => {\n try {\n return controllerMessenger.call(\n 'PermissionController:getCaveat',\n snapId,\n permission,\n caveatType,\n );\n } catch (error) {\n if (error instanceof PermissionDoesNotExistError) {\n return undefined;\n }\n /* istanbul ignore next */\n throw error;\n }\n },\n grantPermissions: (approvedPermissions: RequestedPermissions) => {\n controllerMessenger.call('PermissionController:grantPermissions', {\n subject: { origin: snapId },\n approvedPermissions,\n });\n },\n revokePermission: (permission: string) => {\n try {\n controllerMessenger.call('PermissionController:revokePermissions', {\n [snapId]: [permission],\n });\n } catch (error) {\n if (error instanceof PermissionDoesNotExistError) {\n return;\n }\n /* istanbul ignore next */\n throw error;\n }\n },\n };\n}\n\n/**\n * Register mocked action handlers.\n *\n * @param controllerMessenger - The controller messenger.\n * @param runSaga - The run saga function.\n * @param options - The simulation options.\n * @param snapId - The ID of the Snap.\n */\nexport function registerActions(\n controllerMessenger: RootControllerMessenger,\n runSaga: RunSagaFunction,\n options: SimulationOptions,\n snapId: SnapId,\n) {\n controllerMessenger.registerActionHandler(\n 'PhishingController:testOrigin',\n () => ({ result: false, type: PhishingDetectorResultType.All }),\n );\n\n controllerMessenger.registerActionHandler(\n 'AccountsController:getAccountByAddress',\n // @ts-expect-error - This is a partial account with only the necessary\n // data used by the interface controller.\n (address) => {\n const matchingAccount = options.accounts.find(\n (account) => address === account.address,\n );\n\n if (!matchingAccount) {\n return undefined;\n }\n\n return addSnapMetadataToAccount(matchingAccount, snapId);\n },\n );\n\n controllerMessenger.registerActionHandler(\n 'AccountsController:getSelectedMultichainAccount',\n // @ts-expect-error - This is a partial account with only the necessary\n // data used by the interface controller.\n () => {\n const selectedAccount = options.accounts.find(\n (account) => account.selected,\n );\n\n if (!selectedAccount) {\n return undefined;\n }\n\n return addSnapMetadataToAccount(selectedAccount, snapId);\n },\n );\n\n controllerMessenger.registerActionHandler(\n 'AccountsController:listMultichainAccounts',\n\n () =>\n // @ts-expect-error - These are partial accounts with only the necessary\n // data used by the interface controller.\n options.accounts.map((account) =>\n addSnapMetadataToAccount(account, snapId),\n ),\n );\n\n controllerMessenger.registerActionHandler(\n 'MultichainAssetsController:getState',\n () => ({\n // @ts-expect-error - These are partial assets with only the\n // necessary data used by the interface controller.\n assetsMetadata: options.assets,\n accountsAssets: options.accounts.reduce<Record<string, CaipAssetType[]>>(\n (acc, account) => {\n acc[account.id] = account.assets ?? [];\n return acc;\n },\n {},\n ),\n }),\n );\n\n controllerMessenger.registerActionHandler(\n 'ApprovalController:hasRequest',\n (opts) => {\n /**\n * Get the current interface from the store.\n *\n * @yields Selects the current interface from the store.\n * @returns The current interface.\n */\n function* getCurrentInterfaceSaga(): SagaIterator {\n const currentInterface: Interface = yield select(getCurrentInterface);\n return currentInterface;\n }\n\n const currentInterface: Interface | undefined = runSaga(\n getCurrentInterfaceSaga,\n ).result();\n return (\n currentInterface?.type === DIALOG_APPROVAL_TYPES.default &&\n currentInterface?.id === opts?.id\n );\n },\n );\n\n controllerMessenger.registerActionHandler(\n 'ApprovalController:acceptRequest',\n async (_id: string, value: unknown) => {\n await runSaga(resolveWithSaga, value).toPromise();\n\n return { value };\n },\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"simulation.cjs","sourceRoot":"","sources":["../src/simulation.ts"],"names":[],"mappings":";;;AAAA,qFAA0E;AAQ1E,mDAAoE;AACpE,2EAIyC;AAEzC,2DAK0C;AAC1C,mEAAoE;AAcpE,uDAAiD;AAGjD,qDAA2C;AAE3C,gDAA4C;AAG5C,mDAA6D;AAC7D,uCAAsC;AAEtC,2CAAuC;AACvC,+CAA8C;AAC9C,iDAAwD;AACxD,qDAYyB;AACzB,6EAAqF;AACrF,uDAAmD;AAMnD,2CAAuC;AAOvC,6CAA2D;AAC3D,iDAA2D;AA2T3D;;;;;;;;;;;;;;GAcG;AACI,KAAK,UAAU,WAAW,CAK/B,MAAc,EACd,EACE,gBAAgB,EAChB,uBAAuB,EACvB,OAAO,EAAE,UAAU,GAAG,EAAE,MACgB,EAAE;IAE5C,MAAM,OAAO,GAAG,IAAA,oBAAU,EAAC,UAAU,CAAC,CAAC;IAEvC,oBAAoB;IACpB,MAAM,QAAQ,GAAG,IAAA,yBAAkB,EAAC,MAAM,EAAE;QAC1C,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,IAAA,gBAAS,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEpD,sBAAsB;IACtB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAC;IAEhD,MAAM,mBAAmB,GAAG,IAAI,qBAAS,CAA6B;QACpE,SAAS,EAAE,8BAAkB;KAC9B,CAAC,CAAC;IAEH,eAAe,CAAC,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAE/D,yCAAyC;IACzC,MAAM,eAAe,GAAG,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAEpE,MAAM,cAAc,GAAG,iBAAiB,CACtC,MAAM,EACN,SAAS,EACT,mBAAmB,EACnB,OAAO,CACR,CAAC;IAEF,MAAM,eAAe,GAAG,kBAAkB,CACxC,MAAM,EACN,OAAO,EACP,mBAAmB,CACpB,CAAC;IAEF,MAAM,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,GAAG,IAAA,4BAAc,EAAC;QACzE,mBAAmB;QACnB,KAAK,EAAE,eAAe;QACtB,OAAO;QACP,OAAO;KACR,CAAC,CAAC;IAEH,MAAM,oBAAoB,GAAG,oBAAoB,CAAC,0BAA0B,CAAC;QAC3E,MAAM,EAAE,MAAM;KACf,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAA,gCAAmB,EAAC;QACjC,KAAK;QACL,eAAe;QACf,cAAc;QACd,oBAAoB;QACpB,eAAe;QACf,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,IAAA,gCAAmB,EAAC;QAC3C,KAAK;QACL,eAAe;QACf,cAAc;QACd,oBAAoB;QACpB,eAAe;QACf,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,4BAA4B;IAC5B,MAAM,gBAAgB,GAAG,gBAAgB,IAAI,iCAA0B,CAAC;IACxE,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC;QACnC,GAAG,uBAAuB;QAC1B,SAAS,EAAE,IAAI,qBAAS,CAAC;YACvB,SAAS,EAAE,kBAAkB;YAC7B,MAAM,EAAE,mBAAmB;SAC5B,CAAC;QACF,iBAAiB,EAAE,CAAC,OAAe,EAAE,SAAiB,EAAE,EAAE;YACxD,MAAM,GAAG,GAAG,IAAA,qBAAc,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;YACrD,MAAM,cAAc,GAAG,IAAA,+CAAkB,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAEtD,wDAAwD;YACxD,4BAA4B;YAC5B,IAAA,0BAAQ,EAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjD,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBACtD,IAAA,sBAAQ,EAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,gBAAgB,GAAG,GAAG,CAAC,YAAY,CAAC,8BAA8B,CAAC,CAAC;YAC1E,MAAM,wBAAwB,GAAG,IAAA,+CAAkB,EAAC;gBAClD,MAAM,EAAE,gBAAgB;aACzB,CAAC,CAAC;YAEH,4BAA4B;YAC5B,IAAA,0BAAQ,EACN,gBAAgB,EAChB,wBAAwB,EACxB,gBAAgB,EAChB,CAAC,KAAK,EAAE,EAAE;gBACR,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBACtD,IAAA,sBAAQ,EAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC,CACF,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;IAEH,qEAAqE;IACrE,YAAY;IACZ,MAAM,IAAA,0BAAY,EAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE;QACpD,oBAAoB;QACpB,yBAAyB;KAC1B,CAAC,CAAC;IAEH,8CAA8C;IAC9C,MAAM,OAAO,CAAC,WAAW,CAAC;QACxB,MAAM;QACN,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QACjD,UAAU,EAAE,MAAM,IAAA,uBAAa,EAAC,oBAAoB,EAAE,MAAM,CAAC;KAC9D,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAA,oBAAU,EAAC;QACzB,MAAM;QACN,KAAK;QACL,mBAAmB;QACnB,OAAO;QACP,gBAAgB,EAAE,OAAO;QACzB,OAAO;KACR,CAAC,CAAC;IAEH,OAAO;QACL,MAAM;QACN,KAAK;QACL,gBAAgB,EAAE,OAAO;QACzB,mBAAmB;QACnB,OAAO;QACP,GAAG,OAAO;KACX,CAAC;AACJ,CAAC;AAlJD,kCAkJC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAChC,OAA0B,EAC1B,KAAY,EACZ,OAAwB;IAExB,OAAO;QACL,WAAW,EAAE,IAAA,oCAA4B,EAAC,OAAO,CAAC,oBAAoB,CAAC;QACvE,eAAe,EAAE,IAAA,oDAAgC,EAC/C,OAAO,CAAC,oBAAoB,CAC7B;QACD,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;QACxB,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,IAAA,gCAAwB,EAAC,IAAI,CAAC;QACvC,eAAe,EAAE,IAAA,wCAAgC,EAAC,OAAO,CAAC;QAC1D,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;KAC/C,CAAC;AACJ,CAAC;AAhBD,gDAgBC;AAED;;;;;;;;GAQG;AACH,SAAgB,iBAAiB,CAC/B,MAAc,EACd,SAA2B,EAC3B,mBAA4C,EAC5C,OAAwB;IAExB,OAAO;QACL,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI;QACzB,gBAAgB,EAAE,IAAA,sBAAY,GAAE;QAChC,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;QACxB,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI;QACvB,UAAU,EAAE,GAAG,EAAE,CAAC,gBAAgB;QAElC,WAAW,EAAE,KAAK,EAAE,IAAY,EAAE,QAA+B,EAAE,EAAE,CACnE,MAAM,IAAA,mBAAW,EAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,QAAQ,CAAC;QAE7D,eAAe,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAC3B,mBAAmB,CAAC,IAAI,CACtB,yCAAyC,EACzC,MAAM,EACN,GAAG,IAAI,CACR;QACH,eAAe,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAC3B,mBAAmB,CAAC,IAAI,CACtB,yCAAyC,EACzC,MAAM,EACN,GAAG,IAAI,CACR;QACH,iBAAiB,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAC7B,mBAAmB,CAAC,IAAI,CACtB,2CAA2C,EAC3C,MAAM,EACN,GAAG,IAAI,CACR;QACH,mBAAmB,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAC/B,mBAAmB,CAAC,IAAI,CACtB,sCAAsC,EACtC,MAAM,EACN,GAAG,IAAI,CACR,CAAC,OAAO;QACX,gBAAgB,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,CAClC,mBAAmB,CAAC,IAAI,CACtB,0CAA0C,EAC1C,MAAM,EACN,GAAG,IAAI,CACR;QAEH,iBAAiB,EAAE,IAAA,0CAAkC,GAAE;QACvD,YAAY,EAAE,IAAA,oDAA4C,EAAC,OAAO,CAAC;QACnE,eAAe,EAAE,IAAA,uDAA+C,EAAC,OAAO,CAAC;QACzE,cAAc,EAAE,IAAA,sDAA8C,EAAC,OAAO,CAAC;QAEvE,OAAO,EAAE,IAAA,gCAAwB,EAAC,IAAI,CAAC;QACvC,UAAU,EAAE,IAAA,mCAA2B,EAAC,OAAO,CAAC;QAChD,UAAU,EAAE,IAAA,mCAA2B,EAAC,OAAO,CAAC;QAChD,UAAU,EAAE,IAAA,mCAA2B,EAAC,OAAO,CAAC;QAChD,QAAQ,EAAE,IAAA,iCAAyB,EAAC,OAAO,CAAC;KAC7C,CAAC;AACJ,CAAC;AA1DD,8CA0DC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAChC,MAAc,EACd,OAA0B,EAC1B,mBAA4C;IAE5C,OAAO;QACL,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ;QACnC,SAAS,EAAE,CAAC,UAAkB,EAAE,UAAkB,EAAE,EAAE;YACpD,IAAI,CAAC;gBACH,OAAO,mBAAmB,CAAC,IAAI,CAC7B,gCAAgC,EAChC,MAAM,EACN,UAAU,EACV,UAAU,CACX,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,mDAA2B,EAAE,CAAC;oBACjD,OAAO,SAAS,CAAC;gBACnB,CAAC;gBACD,0BAA0B;gBAC1B,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,gBAAgB,EAAE,CAAC,mBAAyC,EAAE,EAAE;YAC9D,mBAAmB,CAAC,IAAI,CAAC,uCAAuC,EAAE;gBAChE,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;gBAC3B,mBAAmB;aACpB,CAAC,CAAC;QACL,CAAC;QACD,gBAAgB,EAAE,CAAC,UAAkB,EAAE,EAAE;YACvC,IAAI,CAAC;gBACH,mBAAmB,CAAC,IAAI,CAAC,wCAAwC,EAAE;oBACjE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC;iBACvB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,mDAA2B,EAAE,CAAC;oBACjD,OAAO;gBACT,CAAC;gBACD,0BAA0B;gBAC1B,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AA3CD,gDA2CC;AAED;;;;;;;GAOG;AACH,SAAgB,eAAe,CAC7B,mBAA4C,EAC5C,OAAwB,EACxB,OAA0B,EAC1B,MAAc;IAEd,mBAAmB,CAAC,qBAAqB,CACvC,+BAA+B,EAC/B,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CACvC,CAAC;IAEF,mBAAmB,CAAC,qBAAqB,CACvC,wCAAwC;IACxC,uEAAuE;IACvE,yCAAyC;IACzC,CAAC,OAAO,EAAE,EAAE;QACV,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAC3C,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CACzC,CAAC;QAEF,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAA,kCAAwB,EAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC,CACF,CAAC;IAEF,mBAAmB,CAAC,qBAAqB,CACvC,iDAAiD;IACjD,uEAAuE;IACvE,yCAAyC;IACzC,GAAG,EAAE;QACH,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAC3C,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAC9B,CAAC;QAEF,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAA,kCAAwB,EAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC,CACF,CAAC;IAEF,mBAAmB,CAAC,qBAAqB,CACvC,2CAA2C,EAE3C,GAAG,EAAE;IACH,wEAAwE;IACxE,yCAAyC;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAC/B,IAAA,kCAAwB,EAAC,OAAO,EAAE,MAAM,CAAC,CAC1C,CACJ,CAAC;IAEF,mBAAmB,CAAC,qBAAqB,CACvC,qCAAqC,EACrC,GAAG,EAAE,CAAC,CAAC;QACL,4DAA4D;QAC5D,mDAAmD;QACnD,cAAc,EAAE,OAAO,CAAC,MAAM;QAC9B,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CACrC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;YACf,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;YACvC,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAAE,CACH;KACF,CAAC,CACH,CAAC;IAEF,mBAAmB,CAAC,qBAAqB,CACvC,+BAA+B,EAC/B,CAAC,IAAI,EAAE,EAAE;QACP;;;;;WAKG;QACH,QAAQ,CAAC,CAAC,uBAAuB;YAC/B,MAAM,gBAAgB,GAAc,MAAM,IAAA,gBAAM,EAAC,2BAAmB,CAAC,CAAC;YACtE,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QAED,MAAM,gBAAgB,GAA0B,OAAO,CACrD,uBAAuB,CACxB,CAAC,MAAM,EAAE,CAAC;QACX,OAAO,CACL,gBAAgB,EAAE,IAAI,KAAK,yCAAqB,CAAC,OAAO;YACxD,gBAAgB,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,CAClC,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,mBAAmB,CAAC,qBAAqB,CACvC,kCAAkC,EAClC,KAAK,EAAE,GAAW,EAAE,KAAc,EAAE,EAAE;QACpC,MAAM,OAAO,CAAC,2BAAe,EAAE,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;QAElD,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC,CACF,CAAC;AACJ,CAAC;AAxGD,0CAwGC","sourcesContent":["import { createEngineStream } from '@metamask/json-rpc-middleware-stream';\nimport type { CryptographicFunctions } from '@metamask/key-tree';\nimport type {\n ActionConstraint,\n EventConstraint,\n MockAnyNamespace,\n NamespacedName,\n} from '@metamask/messenger';\nimport { MOCK_ANY_NAMESPACE, Messenger } from '@metamask/messenger';\nimport {\n PermissionDoesNotExistError,\n type Caveat,\n type RequestedPermissions,\n} from '@metamask/permission-controller';\nimport type { AbstractExecutionService } from '@metamask/snaps-controllers';\nimport {\n detectSnapLocation,\n fetchSnap,\n NodeThreadExecutionService,\n setupMultiplex,\n} from '@metamask/snaps-controllers/node';\nimport { DIALOG_APPROVAL_TYPES } from '@metamask/snaps-rpc-methods';\nimport type {\n TrackEventParams,\n AuxiliaryFileEncoding,\n Component,\n InterfaceState,\n InterfaceContext,\n SnapId,\n EntropySource,\n TraceRequest,\n EndTraceRequest,\n TraceContext,\n} from '@metamask/snaps-sdk';\nimport type { FetchedSnapFiles, Snap } from '@metamask/snaps-utils';\nimport { logError } from '@metamask/snaps-utils';\nimport type { CaipAssetType, Hex, Json } from '@metamask/utils';\nimport type { Duplex } from 'readable-stream';\nimport { pipeline } from 'readable-stream';\nimport type { SagaIterator } from 'redux-saga';\nimport { select } from 'redux-saga/effects';\n\nimport type { RootControllerMessenger } from './controllers';\nimport { getControllers, registerSnap } from './controllers';\nimport { getSnapFile } from './files';\nimport type { SnapHelpers } from './helpers';\nimport { getHelpers } from './helpers';\nimport { resolveWithSaga } from './interface';\nimport { asyncResolve, getEndowments } from './methods';\nimport {\n getPermittedClearSnapStateMethodImplementation,\n getPermittedGetSnapStateMethodImplementation,\n getPermittedUpdateSnapStateMethodImplementation,\n getGetEntropySourcesImplementation,\n getGetMnemonicImplementation,\n getGetSnapImplementation,\n getTrackEventImplementation,\n getTrackErrorImplementation,\n getEndTraceImplementation,\n getStartTraceImplementation,\n getSetCurrentChainImplementation,\n} from './methods/hooks';\nimport { getGetMnemonicSeedImplementation } from './methods/hooks/get-mnemonic-seed';\nimport { createJsonRpcEngine } from './middleware';\nimport type {\n SimulationAccount,\n SimulationOptions,\n SimulationUserOptions,\n} from './options';\nimport { getOptions } from './options';\nimport type {\n ApplicationState,\n Interface,\n RunSagaFunction,\n Store,\n} from './store';\nimport { createStore, getCurrentInterface } from './store';\nimport { addSnapMetadataToAccount } from './utils/account';\n\n/**\n * Options for the execution service, without the options that are shared\n * between all execution services.\n *\n * @template Service - The type of the execution service, i.e., the class that\n * creates the execution service.\n */\nexport type ExecutionServiceOptions<\n Service extends new (...args: any[]) => any,\n> = Omit<\n ConstructorParameters<Service>[0],\n keyof ConstructorParameters<typeof AbstractExecutionService<unknown>>[0]\n>;\n\n/**\n * The options for running a Snap in a simulated environment.\n *\n * @property executionService - The execution service to use.\n * @property executionServiceOptions - The options to use when creating the\n * execution service, if any. This should only include options specific to the\n * provided execution service.\n * @property options - The simulation options.\n * @template Service - The type of the execution service.\n */\nexport type InstallSnapOptions<\n Service extends new (\n ...args: any[]\n ) => InstanceType<typeof AbstractExecutionService<unknown>>,\n> =\n ExecutionServiceOptions<Service> extends Record<string, never>\n ? {\n executionService: Service;\n executionServiceOptions?: ExecutionServiceOptions<Service>;\n options?: SimulationUserOptions;\n }\n : {\n executionService: Service;\n executionServiceOptions: ExecutionServiceOptions<Service>;\n options?: SimulationUserOptions;\n };\n\nexport type InstalledSnap = {\n snapId: SnapId;\n store: Store;\n executionService: InstanceType<typeof AbstractExecutionService>;\n controllerMessenger: Messenger<\n NamespacedName,\n ActionConstraint,\n EventConstraint\n >;\n runSaga: RunSagaFunction;\n};\n\nexport type RestrictedMiddlewareHooks = {\n /**\n * A hook that returns the user's secret recovery phrase.\n *\n * @param source - The entropy source to get the mnemonic from.\n * @returns The user's secret recovery phrase.\n */\n getMnemonic: (source?: string | undefined) => Promise<Uint8Array>;\n\n /**\n * A hook that returns the seed derived from the user's secret recovery phrase.\n *\n * @param source - The entropy source to get the seed from.\n * @returns The seed.\n */\n getMnemonicSeed: (source?: string | undefined) => Promise<Uint8Array>;\n\n /**\n * A hook that returns whether the client is locked or not.\n *\n * @returns A boolean flag signaling whether the client is locked.\n */\n getIsLocked: () => boolean;\n\n /**\n * Get the cryptographic functions to use for the client. This may return an\n * empty object to fall back to the default cryptographic functions.\n *\n * @returns The cryptographic functions to use for the client.\n */\n getClientCryptography: () => CryptographicFunctions;\n\n /**\n * A hook that returns metadata about a given Snap.\n *\n * @param snapId - The ID of a Snap.\n * @returns The metadata for the given Snap.\n */\n getSnap: (snapId: string) => Snap;\n\n /**\n * A hook that sets the current chain ID.\n *\n * @param chainId - The chain ID.\n */\n setCurrentChain: (chainId: Hex) => null;\n\n /**\n * A hook that gets the current simulation state.\n *\n * @returns The simulation state.\n */\n getSimulationState: () => ApplicationState;\n};\n\nexport type PermittedMiddlewareHooks = {\n /**\n * A hook that gets whether the requesting origin has a given permission.\n *\n * @param permissionName - The name of the permission to check.\n * @returns Whether the origin has the permission.\n */\n hasPermission: (permissionName: string) => boolean;\n\n /**\n * A hook that returns the entropy sources available to the Snap.\n *\n * @returns The entropy sources available to the Snap.\n */\n getEntropySources: () => EntropySource[];\n\n /**\n * A hook that returns a promise that resolves once the extension is unlocked.\n *\n * @param shouldShowUnlockRequest - Whether to show the unlock request.\n * @returns A promise that resolves once the extension is unlocked.\n */\n getUnlockPromise: (shouldShowUnlockRequest: boolean) => Promise<void>;\n\n /**\n * A hook that returns whether the client is locked or not.\n *\n * @returns A boolean flag signaling whether the client is locked.\n */\n getIsLocked: () => boolean;\n\n /**\n * A hook that returns whether the client is active or not.\n *\n * @returns A boolean flag signaling whether the client is opened.\n */\n getIsActive: () => boolean;\n\n /**\n * A hook that returns the client version.\n *\n * @returns A string that corresponds to the client version.\n */\n getVersion: () => string;\n\n /**\n * A hook that returns the Snap's auxiliary file for the given path. This hook\n * is bound to the Snap ID.\n *\n * @param path - The path of the auxiliary file to get.\n * @param encoding - The encoding to use when returning the file.\n * @returns The Snap's auxiliary file for the given path.\n */\n getSnapFile: (\n path: string,\n encoding: AuxiliaryFileEncoding,\n ) => Promise<string | null>;\n\n /**\n * A hook that gets the state of the Snap. This hook is bound to the Snap ID.\n *\n * @param encrypted - Whether to get the encrypted or unencrypted state.\n * @returns The current state of the Snap.\n */\n getSnapState: (encrypted: boolean) => Promise<Record<string, Json>>;\n\n /**\n * A hook that updates the state of the Snap. This hook is bound to the Snap\n * ID.\n *\n * @param newState - The new state.\n * @param encrypted - Whether to update the encrypted or unencrypted state.\n */\n updateSnapState: (\n newState: Record<string, Json>,\n encrypted: boolean,\n ) => Promise<void>;\n\n /**\n * A hook that clears the state of the Snap. This hook is bound to the Snap\n * ID.\n *\n * @param encrypted - Whether to clear the encrypted or unencrypted state.\n */\n clearSnapState: (encrypted: boolean) => Promise<void>;\n\n /**\n * A hook that creates an interface for the Snap. This hook is bound to the\n * Snap ID.\n *\n * @param content - The content of the interface.\n * @param context - The context of the interface.\n * @returns The ID of the created interface.\n */\n createInterface: (content: Component, context?: InterfaceContext) => string;\n\n /**\n * A hook that updates an interface for the Snap. This hook is bound to the\n * Snap ID.\n *\n * @param id - The ID of the interface to update.\n * @param content - The content of the interface.\n */\n updateInterface: (id: string, content: Component) => void;\n\n /**\n * A hook that gets the state of an interface for the Snap. This hook is bound\n * to the Snap ID.\n *\n * @param id - The ID of the interface to get.\n * @returns The state of the interface.\n */\n getInterfaceState: (id: string) => InterfaceState;\n\n /**\n * A hook that gets the context of an interface for the Snap. This hook is\n * bound to the Snap ID.\n *\n * @param id - The ID of the interface to get.\n * @returns The context of the interface.\n */\n getInterfaceContext: (id: string) => InterfaceContext | null;\n\n /**\n * A hook that resolves an interface for the Snap. This hook is bound to the\n * Snap ID.\n *\n * @param id - The ID of the interface to resolve.\n * @param value - The value to resolve the interface with.\n */\n resolveInterface: (id: string, value: Json) => Promise<void>;\n\n /**\n * A hook that gets the Snap's metadata.\n *\n * @param snapId - The ID of the Snap to get.\n * @returns The Snap's metadata.\n */\n getSnap(snapId: string): Snap;\n\n /**\n * A hook that tracks an error.\n *\n * @param error - The error object containing error details and properties.\n */\n trackError(error: Error): void;\n\n /**\n * A hook that tracks an event.\n *\n * @param event - The event object containing event details and properties.\n */\n trackEvent(event: TrackEventParams['event']): void;\n\n /**\n * A hook that starts a performance trace.\n *\n * @param request - The trace request object containing trace details.\n */\n startTrace(request: TraceRequest): TraceContext;\n\n /**\n * A hook that ends a performance trace.\n *\n * @param request - The trace request object containing trace details.\n * @returns The trace data.\n */\n endTrace(request: EndTraceRequest): void;\n};\n\nexport type MultichainMiddlewareHooks = {\n /**\n * A hook that returns the simulated accounts.\n *\n * @returns The simulated accounts.\n */\n getAccounts: () => SimulationAccount[];\n\n /**\n * A hook that retrieves a caveat for a given permission.\n *\n * @param permission - The permission name.\n * @param caveatType - The caveat type.\n * @returns The caveat, if it exists.\n */\n getCaveat: (\n permission: string,\n caveatType: string,\n ) => Caveat<string, Json> | undefined;\n\n /**\n * A hook that grants permissions to the origin.\n *\n * @param permissions - The permissions.\n */\n grantPermissions: (permissions: RequestedPermissions) => void;\n\n /**\n * A hook that revokes a permission for the origin.\n *\n * @param permission - The permission name.\n */\n revokePermission: (permission: string) => void;\n};\n\n/**\n * Install a Snap in a simulated environment. This will fetch the Snap files,\n * create a Redux store, set up the controllers and JSON-RPC stack, register the\n * Snap, and run the Snap code in the execution service.\n *\n * @param snapId - The ID of the Snap to install.\n * @param options - The options to use when installing the Snap.\n * @param options.executionService - The execution service to use.\n * @param options.executionServiceOptions - The options to use when creating the\n * execution service, if any. This should only include options specific to the\n * provided execution service.\n * @param options.options - The simulation options.\n * @returns The installed Snap object.\n * @template Service - The type of the execution service.\n */\nexport async function installSnap<\n Service extends new (\n ...args: any[]\n ) => InstanceType<typeof AbstractExecutionService>,\n>(\n snapId: SnapId,\n {\n executionService,\n executionServiceOptions,\n options: rawOptions = {},\n }: Partial<InstallSnapOptions<Service>> = {},\n): Promise<InstalledSnap & SnapHelpers> {\n const options = getOptions(rawOptions);\n\n // Fetch Snap files.\n const location = detectSnapLocation(snapId, {\n allowLocal: true,\n });\n\n const snapFiles = await fetchSnap(snapId, location);\n\n // Create Redux store.\n const { store, runSaga } = createStore(options);\n\n const controllerMessenger = new Messenger<MockAnyNamespace, any, any>({\n namespace: MOCK_ANY_NAMESPACE,\n });\n\n registerActions(controllerMessenger, runSaga, options, snapId);\n\n // Set up controllers and JSON-RPC stack.\n const restrictedHooks = getRestrictedHooks(options, store, runSaga);\n\n const permittedHooks = getPermittedHooks(\n snapId,\n snapFiles,\n controllerMessenger,\n runSaga,\n );\n\n const multichainHooks = getMultichainHooks(\n snapId,\n options,\n controllerMessenger,\n );\n\n const { subjectMetadataController, permissionController } = getControllers({\n controllerMessenger,\n hooks: restrictedHooks,\n runSaga,\n options,\n });\n\n const permissionMiddleware = permissionController.createPermissionMiddleware({\n origin: snapId,\n });\n\n const engine = createJsonRpcEngine({\n store,\n restrictedHooks,\n permittedHooks,\n permissionMiddleware,\n multichainHooks,\n isMultichain: false,\n });\n\n const multichainEngine = createJsonRpcEngine({\n store,\n restrictedHooks,\n permittedHooks,\n permissionMiddleware,\n multichainHooks,\n isMultichain: true,\n });\n\n // Create execution service.\n const ExecutionService = executionService ?? NodeThreadExecutionService;\n const service = new ExecutionService({\n ...executionServiceOptions,\n messenger: new Messenger({\n namespace: 'ExecutionService',\n parent: controllerMessenger,\n }),\n setupSnapProvider: (_snapId: string, rpcStream: Duplex) => {\n const mux = setupMultiplex(rpcStream, 'snapStream');\n const stream = mux.createStream('metamask-provider');\n const providerStream = createEngineStream({ engine });\n\n // Error function is difficult to test, so we ignore it.\n /* istanbul ignore next 2 */\n pipeline(stream, providerStream, stream, (error) => {\n if (error && !error.message?.match('Premature close')) {\n logError(`Provider stream failure.`, error);\n }\n });\n\n const multichainStream = mux.createStream('metamask-multichain-provider');\n const multichainProviderStream = createEngineStream({\n engine: multichainEngine,\n });\n\n /* istanbul ignore next 2 */\n pipeline(\n multichainStream,\n multichainProviderStream,\n multichainStream,\n (error) => {\n if (error && !error.message?.match('Premature close')) {\n logError(`Provider stream failure.`, error);\n }\n },\n );\n },\n });\n\n // Register the Snap. This sets up the Snap's permissions and subject\n // metadata.\n await registerSnap(snapId, snapFiles.manifest.result, {\n permissionController,\n subjectMetadataController,\n });\n\n // Run the Snap code in the execution service.\n await service.executeSnap({\n snapId,\n sourceCode: snapFiles.sourceCode.toString('utf8'),\n endowments: await getEndowments(permissionController, snapId),\n });\n\n const helpers = getHelpers({\n snapId,\n store,\n controllerMessenger,\n runSaga,\n executionService: service,\n options,\n });\n\n return {\n snapId,\n store,\n executionService: service,\n controllerMessenger,\n runSaga,\n ...helpers,\n };\n}\n\n/**\n * Get the hooks for the simulation.\n *\n * @param options - The simulation options.\n * @param store - The Redux store.\n * @param runSaga - The run saga function.\n * @returns The hooks for the simulation.\n */\nexport function getRestrictedHooks(\n options: SimulationOptions,\n store: Store,\n runSaga: RunSagaFunction,\n): RestrictedMiddlewareHooks {\n return {\n getMnemonic: getGetMnemonicImplementation(options.secretRecoveryPhrase),\n getMnemonicSeed: getGetMnemonicSeedImplementation(\n options.secretRecoveryPhrase,\n ),\n getIsLocked: () => false,\n getClientCryptography: () => ({}),\n getSnap: getGetSnapImplementation(true),\n setCurrentChain: getSetCurrentChainImplementation(runSaga),\n getSimulationState: store.getState.bind(store),\n };\n}\n\n/**\n * Get the permitted hooks for the simulation.\n *\n * @param snapId - The ID of the Snap.\n * @param snapFiles - The fetched Snap files.\n * @param controllerMessenger - The controller messenger.\n * @param runSaga - The run saga function.\n * @returns The permitted hooks for the simulation.\n */\nexport function getPermittedHooks(\n snapId: SnapId,\n snapFiles: FetchedSnapFiles,\n controllerMessenger: RootControllerMessenger,\n runSaga: RunSagaFunction,\n): PermittedMiddlewareHooks {\n return {\n hasPermission: () => true,\n getUnlockPromise: asyncResolve(),\n getIsLocked: () => false,\n getIsActive: () => true,\n getVersion: () => '13.6.0-flask.0',\n\n getSnapFile: async (path: string, encoding: AuxiliaryFileEncoding) =>\n await getSnapFile(snapFiles.auxiliaryFiles, path, encoding),\n\n createInterface: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:createInterface',\n snapId,\n ...args,\n ),\n updateInterface: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterface',\n snapId,\n ...args,\n ),\n getInterfaceState: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:getInterfaceState',\n snapId,\n ...args,\n ),\n getInterfaceContext: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n ...args,\n ).context,\n resolveInterface: async (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:resolveInterface',\n snapId,\n ...args,\n ),\n\n getEntropySources: getGetEntropySourcesImplementation(),\n getSnapState: getPermittedGetSnapStateMethodImplementation(runSaga),\n updateSnapState: getPermittedUpdateSnapStateMethodImplementation(runSaga),\n clearSnapState: getPermittedClearSnapStateMethodImplementation(runSaga),\n\n getSnap: getGetSnapImplementation(true),\n trackError: getTrackErrorImplementation(runSaga),\n trackEvent: getTrackEventImplementation(runSaga),\n startTrace: getStartTraceImplementation(runSaga),\n endTrace: getEndTraceImplementation(runSaga),\n };\n}\n\n/**\n * Get the hooks for the multichain middleware simulation.\n *\n * @param snapId - The Snap ID.\n * @param options - The simulation options.\n * @param controllerMessenger - The controller messenger.\n * @returns The hooks for the middleware.\n */\nexport function getMultichainHooks(\n snapId: SnapId,\n options: SimulationOptions,\n controllerMessenger: RootControllerMessenger,\n): MultichainMiddlewareHooks {\n return {\n getAccounts: () => options.accounts,\n getCaveat: (permission: string, caveatType: string) => {\n try {\n return controllerMessenger.call(\n 'PermissionController:getCaveat',\n snapId,\n permission,\n caveatType,\n );\n } catch (error) {\n if (error instanceof PermissionDoesNotExistError) {\n return undefined;\n }\n /* istanbul ignore next */\n throw error;\n }\n },\n grantPermissions: (approvedPermissions: RequestedPermissions) => {\n controllerMessenger.call('PermissionController:grantPermissions', {\n subject: { origin: snapId },\n approvedPermissions,\n });\n },\n revokePermission: (permission: string) => {\n try {\n controllerMessenger.call('PermissionController:revokePermissions', {\n [snapId]: [permission],\n });\n } catch (error) {\n if (error instanceof PermissionDoesNotExistError) {\n return;\n }\n /* istanbul ignore next */\n throw error;\n }\n },\n };\n}\n\n/**\n * Register mocked action handlers.\n *\n * @param controllerMessenger - The controller messenger.\n * @param runSaga - The run saga function.\n * @param options - The simulation options.\n * @param snapId - The ID of the Snap.\n */\nexport function registerActions(\n controllerMessenger: RootControllerMessenger,\n runSaga: RunSagaFunction,\n options: SimulationOptions,\n snapId: SnapId,\n) {\n controllerMessenger.registerActionHandler(\n 'PhishingController:testOrigin',\n () => ({ result: false, type: 'all' }),\n );\n\n controllerMessenger.registerActionHandler(\n 'AccountsController:getAccountByAddress',\n // @ts-expect-error - This is a partial account with only the necessary\n // data used by the interface controller.\n (address) => {\n const matchingAccount = options.accounts.find(\n (account) => address === account.address,\n );\n\n if (!matchingAccount) {\n return undefined;\n }\n\n return addSnapMetadataToAccount(matchingAccount, snapId);\n },\n );\n\n controllerMessenger.registerActionHandler(\n 'AccountsController:getSelectedMultichainAccount',\n // @ts-expect-error - This is a partial account with only the necessary\n // data used by the interface controller.\n () => {\n const selectedAccount = options.accounts.find(\n (account) => account.selected,\n );\n\n if (!selectedAccount) {\n return undefined;\n }\n\n return addSnapMetadataToAccount(selectedAccount, snapId);\n },\n );\n\n controllerMessenger.registerActionHandler(\n 'AccountsController:listMultichainAccounts',\n\n () =>\n // @ts-expect-error - These are partial accounts with only the necessary\n // data used by the interface controller.\n options.accounts.map((account) =>\n addSnapMetadataToAccount(account, snapId),\n ),\n );\n\n controllerMessenger.registerActionHandler(\n 'MultichainAssetsController:getState',\n () => ({\n // @ts-expect-error - These are partial assets with only the\n // necessary data used by the interface controller.\n assetsMetadata: options.assets,\n accountsAssets: options.accounts.reduce<Record<string, CaipAssetType[]>>(\n (acc, account) => {\n acc[account.id] = account.assets ?? [];\n return acc;\n },\n {},\n ),\n }),\n );\n\n controllerMessenger.registerActionHandler(\n 'ApprovalController:hasRequest',\n (opts) => {\n /**\n * Get the current interface from the store.\n *\n * @yields Selects the current interface from the store.\n * @returns The current interface.\n */\n function* getCurrentInterfaceSaga(): SagaIterator {\n const currentInterface: Interface = yield select(getCurrentInterface);\n return currentInterface;\n }\n\n const currentInterface: Interface | undefined = runSaga(\n getCurrentInterfaceSaga,\n ).result();\n return (\n currentInterface?.type === DIALOG_APPROVAL_TYPES.default &&\n currentInterface?.id === opts?.id\n );\n },\n );\n\n controllerMessenger.registerActionHandler(\n 'ApprovalController:acceptRequest',\n async (_id: string, value: unknown) => {\n await runSaga(resolveWithSaga, value).toPromise();\n\n return { value };\n },\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simulation.d.cts","sourceRoot":"","sources":["../src/simulation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,2BAA2B;AACjE,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEf,cAAc,EACf,4BAA4B;AAC7B,OAAO,EAAsB,SAAS,EAAE,4BAA4B;AACpE,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,oBAAoB,EAC1B,wCAAwC;
|
|
1
|
+
{"version":3,"file":"simulation.d.cts","sourceRoot":"","sources":["../src/simulation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simulation.d.mts","sourceRoot":"","sources":["../src/simulation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,2BAA2B;AACjE,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEf,cAAc,EACf,4BAA4B;AAC7B,OAAO,EAAsB,SAAS,EAAE,4BAA4B;AACpE,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,oBAAoB,EAC1B,wCAAwC;
|
|
1
|
+
{"version":3,"file":"simulation.d.mts","sourceRoot":"","sources":["../src/simulation.ts"],"names":[],"mappings":"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"}
|
package/dist/simulation.mjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { createEngineStream } from "@metamask/json-rpc-middleware-stream";
|
|
2
2
|
import { MOCK_ANY_NAMESPACE, Messenger } from "@metamask/messenger";
|
|
3
3
|
import { PermissionDoesNotExistError } from "@metamask/permission-controller";
|
|
4
|
-
import { PhishingDetectorResultType } from "@metamask/phishing-controller";
|
|
5
4
|
import { detectSnapLocation, fetchSnap, NodeThreadExecutionService, setupMultiplex } from "@metamask/snaps-controllers/node";
|
|
6
5
|
import { DIALOG_APPROVAL_TYPES } from "@metamask/snaps-rpc-methods";
|
|
7
6
|
import { logError } from "@metamask/snaps-utils";
|
|
@@ -173,7 +172,7 @@ export function getPermittedHooks(snapId, snapFiles, controllerMessenger, runSag
|
|
|
173
172
|
getSnapFile: async (path, encoding) => await getSnapFile(snapFiles.auxiliaryFiles, path, encoding),
|
|
174
173
|
createInterface: (...args) => controllerMessenger.call('SnapInterfaceController:createInterface', snapId, ...args),
|
|
175
174
|
updateInterface: (...args) => controllerMessenger.call('SnapInterfaceController:updateInterface', snapId, ...args),
|
|
176
|
-
getInterfaceState: (...args) => controllerMessenger.call('SnapInterfaceController:
|
|
175
|
+
getInterfaceState: (...args) => controllerMessenger.call('SnapInterfaceController:getInterfaceState', snapId, ...args),
|
|
177
176
|
getInterfaceContext: (...args) => controllerMessenger.call('SnapInterfaceController:getInterface', snapId, ...args).context,
|
|
178
177
|
resolveInterface: async (...args) => controllerMessenger.call('SnapInterfaceController:resolveInterface', snapId, ...args),
|
|
179
178
|
getEntropySources: getGetEntropySourcesImplementation(),
|
|
@@ -241,7 +240,7 @@ export function getMultichainHooks(snapId, options, controllerMessenger) {
|
|
|
241
240
|
* @param snapId - The ID of the Snap.
|
|
242
241
|
*/
|
|
243
242
|
export function registerActions(controllerMessenger, runSaga, options, snapId) {
|
|
244
|
-
controllerMessenger.registerActionHandler('PhishingController:testOrigin', () => ({ result: false, type:
|
|
243
|
+
controllerMessenger.registerActionHandler('PhishingController:testOrigin', () => ({ result: false, type: 'all' }));
|
|
245
244
|
controllerMessenger.registerActionHandler('AccountsController:getAccountByAddress',
|
|
246
245
|
// @ts-expect-error - This is a partial account with only the necessary
|
|
247
246
|
// data used by the interface controller.
|
package/dist/simulation.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simulation.mjs","sourceRoot":"","sources":["../src/simulation.ts"],"names":[],"mappings":"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","sourcesContent":["import { createEngineStream } from '@metamask/json-rpc-middleware-stream';\nimport type { CryptographicFunctions } from '@metamask/key-tree';\nimport type {\n ActionConstraint,\n EventConstraint,\n MockAnyNamespace,\n NamespacedName,\n} from '@metamask/messenger';\nimport { MOCK_ANY_NAMESPACE, Messenger } from '@metamask/messenger';\nimport {\n PermissionDoesNotExistError,\n type Caveat,\n type RequestedPermissions,\n} from '@metamask/permission-controller';\nimport { PhishingDetectorResultType } from '@metamask/phishing-controller';\nimport type { AbstractExecutionService } from '@metamask/snaps-controllers';\nimport {\n detectSnapLocation,\n fetchSnap,\n NodeThreadExecutionService,\n setupMultiplex,\n} from '@metamask/snaps-controllers/node';\nimport { DIALOG_APPROVAL_TYPES } from '@metamask/snaps-rpc-methods';\nimport type {\n TrackEventParams,\n AuxiliaryFileEncoding,\n Component,\n InterfaceState,\n InterfaceContext,\n SnapId,\n EntropySource,\n TraceRequest,\n EndTraceRequest,\n TraceContext,\n} from '@metamask/snaps-sdk';\nimport type { FetchedSnapFiles, Snap } from '@metamask/snaps-utils';\nimport { logError } from '@metamask/snaps-utils';\nimport type { CaipAssetType, Hex, Json } from '@metamask/utils';\nimport type { Duplex } from 'readable-stream';\nimport { pipeline } from 'readable-stream';\nimport type { SagaIterator } from 'redux-saga';\nimport { select } from 'redux-saga/effects';\n\nimport type { RootControllerMessenger } from './controllers';\nimport { getControllers, registerSnap } from './controllers';\nimport { getSnapFile } from './files';\nimport type { SnapHelpers } from './helpers';\nimport { getHelpers } from './helpers';\nimport { resolveWithSaga } from './interface';\nimport { asyncResolve, getEndowments } from './methods';\nimport {\n getPermittedClearSnapStateMethodImplementation,\n getPermittedGetSnapStateMethodImplementation,\n getPermittedUpdateSnapStateMethodImplementation,\n getGetEntropySourcesImplementation,\n getGetMnemonicImplementation,\n getGetSnapImplementation,\n getTrackEventImplementation,\n getTrackErrorImplementation,\n getEndTraceImplementation,\n getStartTraceImplementation,\n getSetCurrentChainImplementation,\n} from './methods/hooks';\nimport { getGetMnemonicSeedImplementation } from './methods/hooks/get-mnemonic-seed';\nimport { createJsonRpcEngine } from './middleware';\nimport type {\n SimulationAccount,\n SimulationOptions,\n SimulationUserOptions,\n} from './options';\nimport { getOptions } from './options';\nimport type {\n ApplicationState,\n Interface,\n RunSagaFunction,\n Store,\n} from './store';\nimport { createStore, getCurrentInterface } from './store';\nimport { addSnapMetadataToAccount } from './utils/account';\n\n/**\n * Options for the execution service, without the options that are shared\n * between all execution services.\n *\n * @template Service - The type of the execution service, i.e., the class that\n * creates the execution service.\n */\nexport type ExecutionServiceOptions<\n Service extends new (...args: any[]) => any,\n> = Omit<\n ConstructorParameters<Service>[0],\n keyof ConstructorParameters<typeof AbstractExecutionService<unknown>>[0]\n>;\n\n/**\n * The options for running a Snap in a simulated environment.\n *\n * @property executionService - The execution service to use.\n * @property executionServiceOptions - The options to use when creating the\n * execution service, if any. This should only include options specific to the\n * provided execution service.\n * @property options - The simulation options.\n * @template Service - The type of the execution service.\n */\nexport type InstallSnapOptions<\n Service extends new (\n ...args: any[]\n ) => InstanceType<typeof AbstractExecutionService<unknown>>,\n> =\n ExecutionServiceOptions<Service> extends Record<string, never>\n ? {\n executionService: Service;\n executionServiceOptions?: ExecutionServiceOptions<Service>;\n options?: SimulationUserOptions;\n }\n : {\n executionService: Service;\n executionServiceOptions: ExecutionServiceOptions<Service>;\n options?: SimulationUserOptions;\n };\n\nexport type InstalledSnap = {\n snapId: SnapId;\n store: Store;\n executionService: InstanceType<typeof AbstractExecutionService>;\n controllerMessenger: Messenger<\n NamespacedName,\n ActionConstraint,\n EventConstraint\n >;\n runSaga: RunSagaFunction;\n};\n\nexport type RestrictedMiddlewareHooks = {\n /**\n * A hook that returns the user's secret recovery phrase.\n *\n * @param source - The entropy source to get the mnemonic from.\n * @returns The user's secret recovery phrase.\n */\n getMnemonic: (source?: string | undefined) => Promise<Uint8Array>;\n\n /**\n * A hook that returns the seed derived from the user's secret recovery phrase.\n *\n * @param source - The entropy source to get the seed from.\n * @returns The seed.\n */\n getMnemonicSeed: (source?: string | undefined) => Promise<Uint8Array>;\n\n /**\n * A hook that returns whether the client is locked or not.\n *\n * @returns A boolean flag signaling whether the client is locked.\n */\n getIsLocked: () => boolean;\n\n /**\n * Get the cryptographic functions to use for the client. This may return an\n * empty object to fall back to the default cryptographic functions.\n *\n * @returns The cryptographic functions to use for the client.\n */\n getClientCryptography: () => CryptographicFunctions;\n\n /**\n * A hook that returns metadata about a given Snap.\n *\n * @param snapId - The ID of a Snap.\n * @returns The metadata for the given Snap.\n */\n getSnap: (snapId: string) => Snap;\n\n /**\n * A hook that sets the current chain ID.\n *\n * @param chainId - The chain ID.\n */\n setCurrentChain: (chainId: Hex) => null;\n\n /**\n * A hook that gets the current simulation state.\n *\n * @returns The simulation state.\n */\n getSimulationState: () => ApplicationState;\n};\n\nexport type PermittedMiddlewareHooks = {\n /**\n * A hook that gets whether the requesting origin has a given permission.\n *\n * @param permissionName - The name of the permission to check.\n * @returns Whether the origin has the permission.\n */\n hasPermission: (permissionName: string) => boolean;\n\n /**\n * A hook that returns the entropy sources available to the Snap.\n *\n * @returns The entropy sources available to the Snap.\n */\n getEntropySources: () => EntropySource[];\n\n /**\n * A hook that returns a promise that resolves once the extension is unlocked.\n *\n * @param shouldShowUnlockRequest - Whether to show the unlock request.\n * @returns A promise that resolves once the extension is unlocked.\n */\n getUnlockPromise: (shouldShowUnlockRequest: boolean) => Promise<void>;\n\n /**\n * A hook that returns whether the client is locked or not.\n *\n * @returns A boolean flag signaling whether the client is locked.\n */\n getIsLocked: () => boolean;\n\n /**\n * A hook that returns whether the client is active or not.\n *\n * @returns A boolean flag signaling whether the client is opened.\n */\n getIsActive: () => boolean;\n\n /**\n * A hook that returns the client version.\n *\n * @returns A string that corresponds to the client version.\n */\n getVersion: () => string;\n\n /**\n * A hook that returns the Snap's auxiliary file for the given path. This hook\n * is bound to the Snap ID.\n *\n * @param path - The path of the auxiliary file to get.\n * @param encoding - The encoding to use when returning the file.\n * @returns The Snap's auxiliary file for the given path.\n */\n getSnapFile: (\n path: string,\n encoding: AuxiliaryFileEncoding,\n ) => Promise<string | null>;\n\n /**\n * A hook that gets the state of the Snap. This hook is bound to the Snap ID.\n *\n * @param encrypted - Whether to get the encrypted or unencrypted state.\n * @returns The current state of the Snap.\n */\n getSnapState: (encrypted: boolean) => Promise<Record<string, Json>>;\n\n /**\n * A hook that updates the state of the Snap. This hook is bound to the Snap\n * ID.\n *\n * @param newState - The new state.\n * @param encrypted - Whether to update the encrypted or unencrypted state.\n */\n updateSnapState: (\n newState: Record<string, Json>,\n encrypted: boolean,\n ) => Promise<void>;\n\n /**\n * A hook that clears the state of the Snap. This hook is bound to the Snap\n * ID.\n *\n * @param encrypted - Whether to clear the encrypted or unencrypted state.\n */\n clearSnapState: (encrypted: boolean) => Promise<void>;\n\n /**\n * A hook that creates an interface for the Snap. This hook is bound to the\n * Snap ID.\n *\n * @param content - The content of the interface.\n * @param context - The context of the interface.\n * @returns The ID of the created interface.\n */\n createInterface: (content: Component, context?: InterfaceContext) => string;\n\n /**\n * A hook that updates an interface for the Snap. This hook is bound to the\n * Snap ID.\n *\n * @param id - The ID of the interface to update.\n * @param content - The content of the interface.\n */\n updateInterface: (id: string, content: Component) => void;\n\n /**\n * A hook that gets the state of an interface for the Snap. This hook is bound\n * to the Snap ID.\n *\n * @param id - The ID of the interface to get.\n * @returns The state of the interface.\n */\n getInterfaceState: (id: string) => InterfaceState;\n\n /**\n * A hook that gets the context of an interface for the Snap. This hook is\n * bound to the Snap ID.\n *\n * @param id - The ID of the interface to get.\n * @returns The context of the interface.\n */\n getInterfaceContext: (id: string) => InterfaceContext | null;\n\n /**\n * A hook that resolves an interface for the Snap. This hook is bound to the\n * Snap ID.\n *\n * @param id - The ID of the interface to resolve.\n * @param value - The value to resolve the interface with.\n */\n resolveInterface: (id: string, value: Json) => Promise<void>;\n\n /**\n * A hook that gets the Snap's metadata.\n *\n * @param snapId - The ID of the Snap to get.\n * @returns The Snap's metadata.\n */\n getSnap(snapId: string): Snap;\n\n /**\n * A hook that tracks an error.\n *\n * @param error - The error object containing error details and properties.\n */\n trackError(error: Error): void;\n\n /**\n * A hook that tracks an event.\n *\n * @param event - The event object containing event details and properties.\n */\n trackEvent(event: TrackEventParams['event']): void;\n\n /**\n * A hook that starts a performance trace.\n *\n * @param request - The trace request object containing trace details.\n */\n startTrace(request: TraceRequest): TraceContext;\n\n /**\n * A hook that ends a performance trace.\n *\n * @param request - The trace request object containing trace details.\n * @returns The trace data.\n */\n endTrace(request: EndTraceRequest): void;\n};\n\nexport type MultichainMiddlewareHooks = {\n /**\n * A hook that returns the simulated accounts.\n *\n * @returns The simulated accounts.\n */\n getAccounts: () => SimulationAccount[];\n\n /**\n * A hook that retrieves a caveat for a given permission.\n *\n * @param permission - The permission name.\n * @param caveatType - The caveat type.\n * @returns The caveat, if it exists.\n */\n getCaveat: (\n permission: string,\n caveatType: string,\n ) => Caveat<string, Json> | undefined;\n\n /**\n * A hook that grants permissions to the origin.\n *\n * @param permissions - The permissions.\n */\n grantPermissions: (permissions: RequestedPermissions) => void;\n\n /**\n * A hook that revokes a permission for the origin.\n *\n * @param permission - The permission name.\n */\n revokePermission: (permission: string) => void;\n};\n\n/**\n * Install a Snap in a simulated environment. This will fetch the Snap files,\n * create a Redux store, set up the controllers and JSON-RPC stack, register the\n * Snap, and run the Snap code in the execution service.\n *\n * @param snapId - The ID of the Snap to install.\n * @param options - The options to use when installing the Snap.\n * @param options.executionService - The execution service to use.\n * @param options.executionServiceOptions - The options to use when creating the\n * execution service, if any. This should only include options specific to the\n * provided execution service.\n * @param options.options - The simulation options.\n * @returns The installed Snap object.\n * @template Service - The type of the execution service.\n */\nexport async function installSnap<\n Service extends new (\n ...args: any[]\n ) => InstanceType<typeof AbstractExecutionService>,\n>(\n snapId: SnapId,\n {\n executionService,\n executionServiceOptions,\n options: rawOptions = {},\n }: Partial<InstallSnapOptions<Service>> = {},\n): Promise<InstalledSnap & SnapHelpers> {\n const options = getOptions(rawOptions);\n\n // Fetch Snap files.\n const location = detectSnapLocation(snapId, {\n allowLocal: true,\n });\n\n const snapFiles = await fetchSnap(snapId, location);\n\n // Create Redux store.\n const { store, runSaga } = createStore(options);\n\n const controllerMessenger = new Messenger<MockAnyNamespace, any, any>({\n namespace: MOCK_ANY_NAMESPACE,\n });\n\n registerActions(controllerMessenger, runSaga, options, snapId);\n\n // Set up controllers and JSON-RPC stack.\n const restrictedHooks = getRestrictedHooks(options, store, runSaga);\n\n const permittedHooks = getPermittedHooks(\n snapId,\n snapFiles,\n controllerMessenger,\n runSaga,\n );\n\n const multichainHooks = getMultichainHooks(\n snapId,\n options,\n controllerMessenger,\n );\n\n const { subjectMetadataController, permissionController } = getControllers({\n controllerMessenger,\n hooks: restrictedHooks,\n runSaga,\n options,\n });\n\n const permissionMiddleware = permissionController.createPermissionMiddleware({\n origin: snapId,\n });\n\n const engine = createJsonRpcEngine({\n store,\n restrictedHooks,\n permittedHooks,\n permissionMiddleware,\n multichainHooks,\n isMultichain: false,\n });\n\n const multichainEngine = createJsonRpcEngine({\n store,\n restrictedHooks,\n permittedHooks,\n permissionMiddleware,\n multichainHooks,\n isMultichain: true,\n });\n\n // Create execution service.\n const ExecutionService = executionService ?? NodeThreadExecutionService;\n const service = new ExecutionService({\n ...executionServiceOptions,\n messenger: new Messenger({\n namespace: 'ExecutionService',\n parent: controllerMessenger,\n }),\n setupSnapProvider: (_snapId: string, rpcStream: Duplex) => {\n const mux = setupMultiplex(rpcStream, 'snapStream');\n const stream = mux.createStream('metamask-provider');\n const providerStream = createEngineStream({ engine });\n\n // Error function is difficult to test, so we ignore it.\n /* istanbul ignore next 2 */\n pipeline(stream, providerStream, stream, (error) => {\n if (error && !error.message?.match('Premature close')) {\n logError(`Provider stream failure.`, error);\n }\n });\n\n const multichainStream = mux.createStream('metamask-multichain-provider');\n const multichainProviderStream = createEngineStream({\n engine: multichainEngine,\n });\n\n /* istanbul ignore next 2 */\n pipeline(\n multichainStream,\n multichainProviderStream,\n multichainStream,\n (error) => {\n if (error && !error.message?.match('Premature close')) {\n logError(`Provider stream failure.`, error);\n }\n },\n );\n },\n });\n\n // Register the Snap. This sets up the Snap's permissions and subject\n // metadata.\n await registerSnap(snapId, snapFiles.manifest.result, {\n permissionController,\n subjectMetadataController,\n });\n\n // Run the Snap code in the execution service.\n await service.executeSnap({\n snapId,\n sourceCode: snapFiles.sourceCode.toString('utf8'),\n endowments: await getEndowments(permissionController, snapId),\n });\n\n const helpers = getHelpers({\n snapId,\n store,\n controllerMessenger,\n runSaga,\n executionService: service,\n options,\n });\n\n return {\n snapId,\n store,\n executionService: service,\n controllerMessenger,\n runSaga,\n ...helpers,\n };\n}\n\n/**\n * Get the hooks for the simulation.\n *\n * @param options - The simulation options.\n * @param store - The Redux store.\n * @param runSaga - The run saga function.\n * @returns The hooks for the simulation.\n */\nexport function getRestrictedHooks(\n options: SimulationOptions,\n store: Store,\n runSaga: RunSagaFunction,\n): RestrictedMiddlewareHooks {\n return {\n getMnemonic: getGetMnemonicImplementation(options.secretRecoveryPhrase),\n getMnemonicSeed: getGetMnemonicSeedImplementation(\n options.secretRecoveryPhrase,\n ),\n getIsLocked: () => false,\n getClientCryptography: () => ({}),\n getSnap: getGetSnapImplementation(true),\n setCurrentChain: getSetCurrentChainImplementation(runSaga),\n getSimulationState: store.getState.bind(store),\n };\n}\n\n/**\n * Get the permitted hooks for the simulation.\n *\n * @param snapId - The ID of the Snap.\n * @param snapFiles - The fetched Snap files.\n * @param controllerMessenger - The controller messenger.\n * @param runSaga - The run saga function.\n * @returns The permitted hooks for the simulation.\n */\nexport function getPermittedHooks(\n snapId: SnapId,\n snapFiles: FetchedSnapFiles,\n controllerMessenger: RootControllerMessenger,\n runSaga: RunSagaFunction,\n): PermittedMiddlewareHooks {\n return {\n hasPermission: () => true,\n getUnlockPromise: asyncResolve(),\n getIsLocked: () => false,\n getIsActive: () => true,\n getVersion: () => '13.6.0-flask.0',\n\n getSnapFile: async (path: string, encoding: AuxiliaryFileEncoding) =>\n await getSnapFile(snapFiles.auxiliaryFiles, path, encoding),\n\n createInterface: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:createInterface',\n snapId,\n ...args,\n ),\n updateInterface: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterface',\n snapId,\n ...args,\n ),\n getInterfaceState: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n ...args,\n ).state,\n getInterfaceContext: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n ...args,\n ).context,\n resolveInterface: async (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:resolveInterface',\n snapId,\n ...args,\n ),\n\n getEntropySources: getGetEntropySourcesImplementation(),\n getSnapState: getPermittedGetSnapStateMethodImplementation(runSaga),\n updateSnapState: getPermittedUpdateSnapStateMethodImplementation(runSaga),\n clearSnapState: getPermittedClearSnapStateMethodImplementation(runSaga),\n\n getSnap: getGetSnapImplementation(true),\n trackError: getTrackErrorImplementation(runSaga),\n trackEvent: getTrackEventImplementation(runSaga),\n startTrace: getStartTraceImplementation(runSaga),\n endTrace: getEndTraceImplementation(runSaga),\n };\n}\n\n/**\n * Get the hooks for the multichain middleware simulation.\n *\n * @param snapId - The Snap ID.\n * @param options - The simulation options.\n * @param controllerMessenger - The controller messenger.\n * @returns The hooks for the middleware.\n */\nexport function getMultichainHooks(\n snapId: SnapId,\n options: SimulationOptions,\n controllerMessenger: RootControllerMessenger,\n): MultichainMiddlewareHooks {\n return {\n getAccounts: () => options.accounts,\n getCaveat: (permission: string, caveatType: string) => {\n try {\n return controllerMessenger.call(\n 'PermissionController:getCaveat',\n snapId,\n permission,\n caveatType,\n );\n } catch (error) {\n if (error instanceof PermissionDoesNotExistError) {\n return undefined;\n }\n /* istanbul ignore next */\n throw error;\n }\n },\n grantPermissions: (approvedPermissions: RequestedPermissions) => {\n controllerMessenger.call('PermissionController:grantPermissions', {\n subject: { origin: snapId },\n approvedPermissions,\n });\n },\n revokePermission: (permission: string) => {\n try {\n controllerMessenger.call('PermissionController:revokePermissions', {\n [snapId]: [permission],\n });\n } catch (error) {\n if (error instanceof PermissionDoesNotExistError) {\n return;\n }\n /* istanbul ignore next */\n throw error;\n }\n },\n };\n}\n\n/**\n * Register mocked action handlers.\n *\n * @param controllerMessenger - The controller messenger.\n * @param runSaga - The run saga function.\n * @param options - The simulation options.\n * @param snapId - The ID of the Snap.\n */\nexport function registerActions(\n controllerMessenger: RootControllerMessenger,\n runSaga: RunSagaFunction,\n options: SimulationOptions,\n snapId: SnapId,\n) {\n controllerMessenger.registerActionHandler(\n 'PhishingController:testOrigin',\n () => ({ result: false, type: PhishingDetectorResultType.All }),\n );\n\n controllerMessenger.registerActionHandler(\n 'AccountsController:getAccountByAddress',\n // @ts-expect-error - This is a partial account with only the necessary\n // data used by the interface controller.\n (address) => {\n const matchingAccount = options.accounts.find(\n (account) => address === account.address,\n );\n\n if (!matchingAccount) {\n return undefined;\n }\n\n return addSnapMetadataToAccount(matchingAccount, snapId);\n },\n );\n\n controllerMessenger.registerActionHandler(\n 'AccountsController:getSelectedMultichainAccount',\n // @ts-expect-error - This is a partial account with only the necessary\n // data used by the interface controller.\n () => {\n const selectedAccount = options.accounts.find(\n (account) => account.selected,\n );\n\n if (!selectedAccount) {\n return undefined;\n }\n\n return addSnapMetadataToAccount(selectedAccount, snapId);\n },\n );\n\n controllerMessenger.registerActionHandler(\n 'AccountsController:listMultichainAccounts',\n\n () =>\n // @ts-expect-error - These are partial accounts with only the necessary\n // data used by the interface controller.\n options.accounts.map((account) =>\n addSnapMetadataToAccount(account, snapId),\n ),\n );\n\n controllerMessenger.registerActionHandler(\n 'MultichainAssetsController:getState',\n () => ({\n // @ts-expect-error - These are partial assets with only the\n // necessary data used by the interface controller.\n assetsMetadata: options.assets,\n accountsAssets: options.accounts.reduce<Record<string, CaipAssetType[]>>(\n (acc, account) => {\n acc[account.id] = account.assets ?? [];\n return acc;\n },\n {},\n ),\n }),\n );\n\n controllerMessenger.registerActionHandler(\n 'ApprovalController:hasRequest',\n (opts) => {\n /**\n * Get the current interface from the store.\n *\n * @yields Selects the current interface from the store.\n * @returns The current interface.\n */\n function* getCurrentInterfaceSaga(): SagaIterator {\n const currentInterface: Interface = yield select(getCurrentInterface);\n return currentInterface;\n }\n\n const currentInterface: Interface | undefined = runSaga(\n getCurrentInterfaceSaga,\n ).result();\n return (\n currentInterface?.type === DIALOG_APPROVAL_TYPES.default &&\n currentInterface?.id === opts?.id\n );\n },\n );\n\n controllerMessenger.registerActionHandler(\n 'ApprovalController:acceptRequest',\n async (_id: string, value: unknown) => {\n await runSaga(resolveWithSaga, value).toPromise();\n\n return { value };\n },\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"simulation.mjs","sourceRoot":"","sources":["../src/simulation.ts"],"names":[],"mappings":"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","sourcesContent":["import { createEngineStream } from '@metamask/json-rpc-middleware-stream';\nimport type { CryptographicFunctions } from '@metamask/key-tree';\nimport type {\n ActionConstraint,\n EventConstraint,\n MockAnyNamespace,\n NamespacedName,\n} from '@metamask/messenger';\nimport { MOCK_ANY_NAMESPACE, Messenger } from '@metamask/messenger';\nimport {\n PermissionDoesNotExistError,\n type Caveat,\n type RequestedPermissions,\n} from '@metamask/permission-controller';\nimport type { AbstractExecutionService } from '@metamask/snaps-controllers';\nimport {\n detectSnapLocation,\n fetchSnap,\n NodeThreadExecutionService,\n setupMultiplex,\n} from '@metamask/snaps-controllers/node';\nimport { DIALOG_APPROVAL_TYPES } from '@metamask/snaps-rpc-methods';\nimport type {\n TrackEventParams,\n AuxiliaryFileEncoding,\n Component,\n InterfaceState,\n InterfaceContext,\n SnapId,\n EntropySource,\n TraceRequest,\n EndTraceRequest,\n TraceContext,\n} from '@metamask/snaps-sdk';\nimport type { FetchedSnapFiles, Snap } from '@metamask/snaps-utils';\nimport { logError } from '@metamask/snaps-utils';\nimport type { CaipAssetType, Hex, Json } from '@metamask/utils';\nimport type { Duplex } from 'readable-stream';\nimport { pipeline } from 'readable-stream';\nimport type { SagaIterator } from 'redux-saga';\nimport { select } from 'redux-saga/effects';\n\nimport type { RootControllerMessenger } from './controllers';\nimport { getControllers, registerSnap } from './controllers';\nimport { getSnapFile } from './files';\nimport type { SnapHelpers } from './helpers';\nimport { getHelpers } from './helpers';\nimport { resolveWithSaga } from './interface';\nimport { asyncResolve, getEndowments } from './methods';\nimport {\n getPermittedClearSnapStateMethodImplementation,\n getPermittedGetSnapStateMethodImplementation,\n getPermittedUpdateSnapStateMethodImplementation,\n getGetEntropySourcesImplementation,\n getGetMnemonicImplementation,\n getGetSnapImplementation,\n getTrackEventImplementation,\n getTrackErrorImplementation,\n getEndTraceImplementation,\n getStartTraceImplementation,\n getSetCurrentChainImplementation,\n} from './methods/hooks';\nimport { getGetMnemonicSeedImplementation } from './methods/hooks/get-mnemonic-seed';\nimport { createJsonRpcEngine } from './middleware';\nimport type {\n SimulationAccount,\n SimulationOptions,\n SimulationUserOptions,\n} from './options';\nimport { getOptions } from './options';\nimport type {\n ApplicationState,\n Interface,\n RunSagaFunction,\n Store,\n} from './store';\nimport { createStore, getCurrentInterface } from './store';\nimport { addSnapMetadataToAccount } from './utils/account';\n\n/**\n * Options for the execution service, without the options that are shared\n * between all execution services.\n *\n * @template Service - The type of the execution service, i.e., the class that\n * creates the execution service.\n */\nexport type ExecutionServiceOptions<\n Service extends new (...args: any[]) => any,\n> = Omit<\n ConstructorParameters<Service>[0],\n keyof ConstructorParameters<typeof AbstractExecutionService<unknown>>[0]\n>;\n\n/**\n * The options for running a Snap in a simulated environment.\n *\n * @property executionService - The execution service to use.\n * @property executionServiceOptions - The options to use when creating the\n * execution service, if any. This should only include options specific to the\n * provided execution service.\n * @property options - The simulation options.\n * @template Service - The type of the execution service.\n */\nexport type InstallSnapOptions<\n Service extends new (\n ...args: any[]\n ) => InstanceType<typeof AbstractExecutionService<unknown>>,\n> =\n ExecutionServiceOptions<Service> extends Record<string, never>\n ? {\n executionService: Service;\n executionServiceOptions?: ExecutionServiceOptions<Service>;\n options?: SimulationUserOptions;\n }\n : {\n executionService: Service;\n executionServiceOptions: ExecutionServiceOptions<Service>;\n options?: SimulationUserOptions;\n };\n\nexport type InstalledSnap = {\n snapId: SnapId;\n store: Store;\n executionService: InstanceType<typeof AbstractExecutionService>;\n controllerMessenger: Messenger<\n NamespacedName,\n ActionConstraint,\n EventConstraint\n >;\n runSaga: RunSagaFunction;\n};\n\nexport type RestrictedMiddlewareHooks = {\n /**\n * A hook that returns the user's secret recovery phrase.\n *\n * @param source - The entropy source to get the mnemonic from.\n * @returns The user's secret recovery phrase.\n */\n getMnemonic: (source?: string | undefined) => Promise<Uint8Array>;\n\n /**\n * A hook that returns the seed derived from the user's secret recovery phrase.\n *\n * @param source - The entropy source to get the seed from.\n * @returns The seed.\n */\n getMnemonicSeed: (source?: string | undefined) => Promise<Uint8Array>;\n\n /**\n * A hook that returns whether the client is locked or not.\n *\n * @returns A boolean flag signaling whether the client is locked.\n */\n getIsLocked: () => boolean;\n\n /**\n * Get the cryptographic functions to use for the client. This may return an\n * empty object to fall back to the default cryptographic functions.\n *\n * @returns The cryptographic functions to use for the client.\n */\n getClientCryptography: () => CryptographicFunctions;\n\n /**\n * A hook that returns metadata about a given Snap.\n *\n * @param snapId - The ID of a Snap.\n * @returns The metadata for the given Snap.\n */\n getSnap: (snapId: string) => Snap;\n\n /**\n * A hook that sets the current chain ID.\n *\n * @param chainId - The chain ID.\n */\n setCurrentChain: (chainId: Hex) => null;\n\n /**\n * A hook that gets the current simulation state.\n *\n * @returns The simulation state.\n */\n getSimulationState: () => ApplicationState;\n};\n\nexport type PermittedMiddlewareHooks = {\n /**\n * A hook that gets whether the requesting origin has a given permission.\n *\n * @param permissionName - The name of the permission to check.\n * @returns Whether the origin has the permission.\n */\n hasPermission: (permissionName: string) => boolean;\n\n /**\n * A hook that returns the entropy sources available to the Snap.\n *\n * @returns The entropy sources available to the Snap.\n */\n getEntropySources: () => EntropySource[];\n\n /**\n * A hook that returns a promise that resolves once the extension is unlocked.\n *\n * @param shouldShowUnlockRequest - Whether to show the unlock request.\n * @returns A promise that resolves once the extension is unlocked.\n */\n getUnlockPromise: (shouldShowUnlockRequest: boolean) => Promise<void>;\n\n /**\n * A hook that returns whether the client is locked or not.\n *\n * @returns A boolean flag signaling whether the client is locked.\n */\n getIsLocked: () => boolean;\n\n /**\n * A hook that returns whether the client is active or not.\n *\n * @returns A boolean flag signaling whether the client is opened.\n */\n getIsActive: () => boolean;\n\n /**\n * A hook that returns the client version.\n *\n * @returns A string that corresponds to the client version.\n */\n getVersion: () => string;\n\n /**\n * A hook that returns the Snap's auxiliary file for the given path. This hook\n * is bound to the Snap ID.\n *\n * @param path - The path of the auxiliary file to get.\n * @param encoding - The encoding to use when returning the file.\n * @returns The Snap's auxiliary file for the given path.\n */\n getSnapFile: (\n path: string,\n encoding: AuxiliaryFileEncoding,\n ) => Promise<string | null>;\n\n /**\n * A hook that gets the state of the Snap. This hook is bound to the Snap ID.\n *\n * @param encrypted - Whether to get the encrypted or unencrypted state.\n * @returns The current state of the Snap.\n */\n getSnapState: (encrypted: boolean) => Promise<Record<string, Json>>;\n\n /**\n * A hook that updates the state of the Snap. This hook is bound to the Snap\n * ID.\n *\n * @param newState - The new state.\n * @param encrypted - Whether to update the encrypted or unencrypted state.\n */\n updateSnapState: (\n newState: Record<string, Json>,\n encrypted: boolean,\n ) => Promise<void>;\n\n /**\n * A hook that clears the state of the Snap. This hook is bound to the Snap\n * ID.\n *\n * @param encrypted - Whether to clear the encrypted or unencrypted state.\n */\n clearSnapState: (encrypted: boolean) => Promise<void>;\n\n /**\n * A hook that creates an interface for the Snap. This hook is bound to the\n * Snap ID.\n *\n * @param content - The content of the interface.\n * @param context - The context of the interface.\n * @returns The ID of the created interface.\n */\n createInterface: (content: Component, context?: InterfaceContext) => string;\n\n /**\n * A hook that updates an interface for the Snap. This hook is bound to the\n * Snap ID.\n *\n * @param id - The ID of the interface to update.\n * @param content - The content of the interface.\n */\n updateInterface: (id: string, content: Component) => void;\n\n /**\n * A hook that gets the state of an interface for the Snap. This hook is bound\n * to the Snap ID.\n *\n * @param id - The ID of the interface to get.\n * @returns The state of the interface.\n */\n getInterfaceState: (id: string) => InterfaceState;\n\n /**\n * A hook that gets the context of an interface for the Snap. This hook is\n * bound to the Snap ID.\n *\n * @param id - The ID of the interface to get.\n * @returns The context of the interface.\n */\n getInterfaceContext: (id: string) => InterfaceContext | null;\n\n /**\n * A hook that resolves an interface for the Snap. This hook is bound to the\n * Snap ID.\n *\n * @param id - The ID of the interface to resolve.\n * @param value - The value to resolve the interface with.\n */\n resolveInterface: (id: string, value: Json) => Promise<void>;\n\n /**\n * A hook that gets the Snap's metadata.\n *\n * @param snapId - The ID of the Snap to get.\n * @returns The Snap's metadata.\n */\n getSnap(snapId: string): Snap;\n\n /**\n * A hook that tracks an error.\n *\n * @param error - The error object containing error details and properties.\n */\n trackError(error: Error): void;\n\n /**\n * A hook that tracks an event.\n *\n * @param event - The event object containing event details and properties.\n */\n trackEvent(event: TrackEventParams['event']): void;\n\n /**\n * A hook that starts a performance trace.\n *\n * @param request - The trace request object containing trace details.\n */\n startTrace(request: TraceRequest): TraceContext;\n\n /**\n * A hook that ends a performance trace.\n *\n * @param request - The trace request object containing trace details.\n * @returns The trace data.\n */\n endTrace(request: EndTraceRequest): void;\n};\n\nexport type MultichainMiddlewareHooks = {\n /**\n * A hook that returns the simulated accounts.\n *\n * @returns The simulated accounts.\n */\n getAccounts: () => SimulationAccount[];\n\n /**\n * A hook that retrieves a caveat for a given permission.\n *\n * @param permission - The permission name.\n * @param caveatType - The caveat type.\n * @returns The caveat, if it exists.\n */\n getCaveat: (\n permission: string,\n caveatType: string,\n ) => Caveat<string, Json> | undefined;\n\n /**\n * A hook that grants permissions to the origin.\n *\n * @param permissions - The permissions.\n */\n grantPermissions: (permissions: RequestedPermissions) => void;\n\n /**\n * A hook that revokes a permission for the origin.\n *\n * @param permission - The permission name.\n */\n revokePermission: (permission: string) => void;\n};\n\n/**\n * Install a Snap in a simulated environment. This will fetch the Snap files,\n * create a Redux store, set up the controllers and JSON-RPC stack, register the\n * Snap, and run the Snap code in the execution service.\n *\n * @param snapId - The ID of the Snap to install.\n * @param options - The options to use when installing the Snap.\n * @param options.executionService - The execution service to use.\n * @param options.executionServiceOptions - The options to use when creating the\n * execution service, if any. This should only include options specific to the\n * provided execution service.\n * @param options.options - The simulation options.\n * @returns The installed Snap object.\n * @template Service - The type of the execution service.\n */\nexport async function installSnap<\n Service extends new (\n ...args: any[]\n ) => InstanceType<typeof AbstractExecutionService>,\n>(\n snapId: SnapId,\n {\n executionService,\n executionServiceOptions,\n options: rawOptions = {},\n }: Partial<InstallSnapOptions<Service>> = {},\n): Promise<InstalledSnap & SnapHelpers> {\n const options = getOptions(rawOptions);\n\n // Fetch Snap files.\n const location = detectSnapLocation(snapId, {\n allowLocal: true,\n });\n\n const snapFiles = await fetchSnap(snapId, location);\n\n // Create Redux store.\n const { store, runSaga } = createStore(options);\n\n const controllerMessenger = new Messenger<MockAnyNamespace, any, any>({\n namespace: MOCK_ANY_NAMESPACE,\n });\n\n registerActions(controllerMessenger, runSaga, options, snapId);\n\n // Set up controllers and JSON-RPC stack.\n const restrictedHooks = getRestrictedHooks(options, store, runSaga);\n\n const permittedHooks = getPermittedHooks(\n snapId,\n snapFiles,\n controllerMessenger,\n runSaga,\n );\n\n const multichainHooks = getMultichainHooks(\n snapId,\n options,\n controllerMessenger,\n );\n\n const { subjectMetadataController, permissionController } = getControllers({\n controllerMessenger,\n hooks: restrictedHooks,\n runSaga,\n options,\n });\n\n const permissionMiddleware = permissionController.createPermissionMiddleware({\n origin: snapId,\n });\n\n const engine = createJsonRpcEngine({\n store,\n restrictedHooks,\n permittedHooks,\n permissionMiddleware,\n multichainHooks,\n isMultichain: false,\n });\n\n const multichainEngine = createJsonRpcEngine({\n store,\n restrictedHooks,\n permittedHooks,\n permissionMiddleware,\n multichainHooks,\n isMultichain: true,\n });\n\n // Create execution service.\n const ExecutionService = executionService ?? NodeThreadExecutionService;\n const service = new ExecutionService({\n ...executionServiceOptions,\n messenger: new Messenger({\n namespace: 'ExecutionService',\n parent: controllerMessenger,\n }),\n setupSnapProvider: (_snapId: string, rpcStream: Duplex) => {\n const mux = setupMultiplex(rpcStream, 'snapStream');\n const stream = mux.createStream('metamask-provider');\n const providerStream = createEngineStream({ engine });\n\n // Error function is difficult to test, so we ignore it.\n /* istanbul ignore next 2 */\n pipeline(stream, providerStream, stream, (error) => {\n if (error && !error.message?.match('Premature close')) {\n logError(`Provider stream failure.`, error);\n }\n });\n\n const multichainStream = mux.createStream('metamask-multichain-provider');\n const multichainProviderStream = createEngineStream({\n engine: multichainEngine,\n });\n\n /* istanbul ignore next 2 */\n pipeline(\n multichainStream,\n multichainProviderStream,\n multichainStream,\n (error) => {\n if (error && !error.message?.match('Premature close')) {\n logError(`Provider stream failure.`, error);\n }\n },\n );\n },\n });\n\n // Register the Snap. This sets up the Snap's permissions and subject\n // metadata.\n await registerSnap(snapId, snapFiles.manifest.result, {\n permissionController,\n subjectMetadataController,\n });\n\n // Run the Snap code in the execution service.\n await service.executeSnap({\n snapId,\n sourceCode: snapFiles.sourceCode.toString('utf8'),\n endowments: await getEndowments(permissionController, snapId),\n });\n\n const helpers = getHelpers({\n snapId,\n store,\n controllerMessenger,\n runSaga,\n executionService: service,\n options,\n });\n\n return {\n snapId,\n store,\n executionService: service,\n controllerMessenger,\n runSaga,\n ...helpers,\n };\n}\n\n/**\n * Get the hooks for the simulation.\n *\n * @param options - The simulation options.\n * @param store - The Redux store.\n * @param runSaga - The run saga function.\n * @returns The hooks for the simulation.\n */\nexport function getRestrictedHooks(\n options: SimulationOptions,\n store: Store,\n runSaga: RunSagaFunction,\n): RestrictedMiddlewareHooks {\n return {\n getMnemonic: getGetMnemonicImplementation(options.secretRecoveryPhrase),\n getMnemonicSeed: getGetMnemonicSeedImplementation(\n options.secretRecoveryPhrase,\n ),\n getIsLocked: () => false,\n getClientCryptography: () => ({}),\n getSnap: getGetSnapImplementation(true),\n setCurrentChain: getSetCurrentChainImplementation(runSaga),\n getSimulationState: store.getState.bind(store),\n };\n}\n\n/**\n * Get the permitted hooks for the simulation.\n *\n * @param snapId - The ID of the Snap.\n * @param snapFiles - The fetched Snap files.\n * @param controllerMessenger - The controller messenger.\n * @param runSaga - The run saga function.\n * @returns The permitted hooks for the simulation.\n */\nexport function getPermittedHooks(\n snapId: SnapId,\n snapFiles: FetchedSnapFiles,\n controllerMessenger: RootControllerMessenger,\n runSaga: RunSagaFunction,\n): PermittedMiddlewareHooks {\n return {\n hasPermission: () => true,\n getUnlockPromise: asyncResolve(),\n getIsLocked: () => false,\n getIsActive: () => true,\n getVersion: () => '13.6.0-flask.0',\n\n getSnapFile: async (path: string, encoding: AuxiliaryFileEncoding) =>\n await getSnapFile(snapFiles.auxiliaryFiles, path, encoding),\n\n createInterface: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:createInterface',\n snapId,\n ...args,\n ),\n updateInterface: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:updateInterface',\n snapId,\n ...args,\n ),\n getInterfaceState: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:getInterfaceState',\n snapId,\n ...args,\n ),\n getInterfaceContext: (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:getInterface',\n snapId,\n ...args,\n ).context,\n resolveInterface: async (...args) =>\n controllerMessenger.call(\n 'SnapInterfaceController:resolveInterface',\n snapId,\n ...args,\n ),\n\n getEntropySources: getGetEntropySourcesImplementation(),\n getSnapState: getPermittedGetSnapStateMethodImplementation(runSaga),\n updateSnapState: getPermittedUpdateSnapStateMethodImplementation(runSaga),\n clearSnapState: getPermittedClearSnapStateMethodImplementation(runSaga),\n\n getSnap: getGetSnapImplementation(true),\n trackError: getTrackErrorImplementation(runSaga),\n trackEvent: getTrackEventImplementation(runSaga),\n startTrace: getStartTraceImplementation(runSaga),\n endTrace: getEndTraceImplementation(runSaga),\n };\n}\n\n/**\n * Get the hooks for the multichain middleware simulation.\n *\n * @param snapId - The Snap ID.\n * @param options - The simulation options.\n * @param controllerMessenger - The controller messenger.\n * @returns The hooks for the middleware.\n */\nexport function getMultichainHooks(\n snapId: SnapId,\n options: SimulationOptions,\n controllerMessenger: RootControllerMessenger,\n): MultichainMiddlewareHooks {\n return {\n getAccounts: () => options.accounts,\n getCaveat: (permission: string, caveatType: string) => {\n try {\n return controllerMessenger.call(\n 'PermissionController:getCaveat',\n snapId,\n permission,\n caveatType,\n );\n } catch (error) {\n if (error instanceof PermissionDoesNotExistError) {\n return undefined;\n }\n /* istanbul ignore next */\n throw error;\n }\n },\n grantPermissions: (approvedPermissions: RequestedPermissions) => {\n controllerMessenger.call('PermissionController:grantPermissions', {\n subject: { origin: snapId },\n approvedPermissions,\n });\n },\n revokePermission: (permission: string) => {\n try {\n controllerMessenger.call('PermissionController:revokePermissions', {\n [snapId]: [permission],\n });\n } catch (error) {\n if (error instanceof PermissionDoesNotExistError) {\n return;\n }\n /* istanbul ignore next */\n throw error;\n }\n },\n };\n}\n\n/**\n * Register mocked action handlers.\n *\n * @param controllerMessenger - The controller messenger.\n * @param runSaga - The run saga function.\n * @param options - The simulation options.\n * @param snapId - The ID of the Snap.\n */\nexport function registerActions(\n controllerMessenger: RootControllerMessenger,\n runSaga: RunSagaFunction,\n options: SimulationOptions,\n snapId: SnapId,\n) {\n controllerMessenger.registerActionHandler(\n 'PhishingController:testOrigin',\n () => ({ result: false, type: 'all' }),\n );\n\n controllerMessenger.registerActionHandler(\n 'AccountsController:getAccountByAddress',\n // @ts-expect-error - This is a partial account with only the necessary\n // data used by the interface controller.\n (address) => {\n const matchingAccount = options.accounts.find(\n (account) => address === account.address,\n );\n\n if (!matchingAccount) {\n return undefined;\n }\n\n return addSnapMetadataToAccount(matchingAccount, snapId);\n },\n );\n\n controllerMessenger.registerActionHandler(\n 'AccountsController:getSelectedMultichainAccount',\n // @ts-expect-error - This is a partial account with only the necessary\n // data used by the interface controller.\n () => {\n const selectedAccount = options.accounts.find(\n (account) => account.selected,\n );\n\n if (!selectedAccount) {\n return undefined;\n }\n\n return addSnapMetadataToAccount(selectedAccount, snapId);\n },\n );\n\n controllerMessenger.registerActionHandler(\n 'AccountsController:listMultichainAccounts',\n\n () =>\n // @ts-expect-error - These are partial accounts with only the necessary\n // data used by the interface controller.\n options.accounts.map((account) =>\n addSnapMetadataToAccount(account, snapId),\n ),\n );\n\n controllerMessenger.registerActionHandler(\n 'MultichainAssetsController:getState',\n () => ({\n // @ts-expect-error - These are partial assets with only the\n // necessary data used by the interface controller.\n assetsMetadata: options.assets,\n accountsAssets: options.accounts.reduce<Record<string, CaipAssetType[]>>(\n (acc, account) => {\n acc[account.id] = account.assets ?? [];\n return acc;\n },\n {},\n ),\n }),\n );\n\n controllerMessenger.registerActionHandler(\n 'ApprovalController:hasRequest',\n (opts) => {\n /**\n * Get the current interface from the store.\n *\n * @yields Selects the current interface from the store.\n * @returns The current interface.\n */\n function* getCurrentInterfaceSaga(): SagaIterator {\n const currentInterface: Interface = yield select(getCurrentInterface);\n return currentInterface;\n }\n\n const currentInterface: Interface | undefined = runSaga(\n getCurrentInterfaceSaga,\n ).result();\n return (\n currentInterface?.type === DIALOG_APPROVAL_TYPES.default &&\n currentInterface?.id === opts?.id\n );\n },\n );\n\n controllerMessenger.registerActionHandler(\n 'ApprovalController:acceptRequest',\n async (_id: string, value: unknown) => {\n await runSaga(resolveWithSaga, value).toPromise();\n\n return { value };\n },\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask/snaps-simulation",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.1.1",
|
|
4
4
|
"description": "A simulation framework for MetaMask Snaps, enabling headless testing of Snaps in a controlled environment",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -56,20 +56,19 @@
|
|
|
56
56
|
},
|
|
57
57
|
"dependencies": {
|
|
58
58
|
"@metamask/chain-agnostic-permission": "^1.4.0",
|
|
59
|
-
"@metamask/json-rpc-engine": "^10.2.
|
|
59
|
+
"@metamask/json-rpc-engine": "^10.2.3",
|
|
60
60
|
"@metamask/json-rpc-middleware-stream": "^8.0.8",
|
|
61
61
|
"@metamask/key-tree": "^10.1.1",
|
|
62
62
|
"@metamask/messenger": "^0.3.0",
|
|
63
63
|
"@metamask/permission-controller": "^12.2.0",
|
|
64
|
-
"@metamask/phishing-controller": "^16.1.0",
|
|
65
64
|
"@metamask/rpc-errors": "^7.0.3",
|
|
66
|
-
"@metamask/snaps-controllers": "^
|
|
67
|
-
"@metamask/snaps-execution-environments": "^
|
|
68
|
-
"@metamask/snaps-rpc-methods": "^
|
|
69
|
-
"@metamask/snaps-sdk": "^
|
|
70
|
-
"@metamask/snaps-utils": "^12.
|
|
65
|
+
"@metamask/snaps-controllers": "^18.0.3",
|
|
66
|
+
"@metamask/snaps-execution-environments": "^11.0.1",
|
|
67
|
+
"@metamask/snaps-rpc-methods": "^15.0.0",
|
|
68
|
+
"@metamask/snaps-sdk": "^11.0.0",
|
|
69
|
+
"@metamask/snaps-utils": "^12.1.1",
|
|
71
70
|
"@metamask/superstruct": "^3.2.1",
|
|
72
|
-
"@metamask/utils": "^11.
|
|
71
|
+
"@metamask/utils": "^11.10.0",
|
|
73
72
|
"@reduxjs/toolkit": "^1.9.5",
|
|
74
73
|
"ethers": "^6.16.0",
|
|
75
74
|
"fast-deep-equal": "^3.1.3",
|
|
@@ -79,8 +78,8 @@
|
|
|
79
78
|
"redux-saga": "^1.2.3"
|
|
80
79
|
},
|
|
81
80
|
"devDependencies": {
|
|
82
|
-
"@lavamoat/allow-scripts": "^3.4.
|
|
83
|
-
"@metamask/auto-changelog": "^5.
|
|
81
|
+
"@lavamoat/allow-scripts": "^3.4.3",
|
|
82
|
+
"@metamask/auto-changelog": "^5.3.2",
|
|
84
83
|
"@ts-bridge/cli": "^0.6.1",
|
|
85
84
|
"@types/express": "^5.0.1",
|
|
86
85
|
"@types/jest": "^27.5.1",
|