diff --git a/app/scripts/lib/keyring-snaps-permissions.test.ts b/app/scripts/lib/keyring-snaps-permissions.test.ts new file mode 100644 index 000000000000..4bbce54b346c --- /dev/null +++ b/app/scripts/lib/keyring-snaps-permissions.test.ts @@ -0,0 +1,75 @@ +import { + SubjectMetadataController, + SubjectType, +} from '@metamask/permission-controller'; +import { KeyringRpcMethod } from '@metamask/keyring-api'; +import { keyringSnapPermissionsBuilder } from './keyring-snaps-permissions'; + +describe('keyringSnapPermissionsBuilder', () => { + const mockController = new SubjectMetadataController({ + subjectCacheLimit: 100, + messenger: { + registerActionHandler: jest.fn(), + publish: jest.fn(), + } as any, + state: {}, + }); + mockController.addSubjectMetadata({ + origin: 'https://some-dapp.com', + subjectType: SubjectType.Website, + }); + + it('returns the methods metamask can call', () => { + const permissions = keyringSnapPermissionsBuilder(mockController); + expect(permissions('metamask')).toStrictEqual([ + KeyringRpcMethod.ListAccounts, + KeyringRpcMethod.GetAccount, + KeyringRpcMethod.FilterAccountChains, + KeyringRpcMethod.DeleteAccount, + KeyringRpcMethod.ListRequests, + KeyringRpcMethod.GetRequest, + KeyringRpcMethod.SubmitRequest, + KeyringRpcMethod.RejectRequest, + ]); + }); + + it('returns the methods a known origin can call', () => { + const permissions = keyringSnapPermissionsBuilder(mockController); + expect(permissions('https://some-dapp.com')).toStrictEqual([ + KeyringRpcMethod.ListAccounts, + KeyringRpcMethod.GetAccount, + KeyringRpcMethod.CreateAccount, + KeyringRpcMethod.FilterAccountChains, + KeyringRpcMethod.UpdateAccount, + KeyringRpcMethod.DeleteAccount, + KeyringRpcMethod.ExportAccount, + KeyringRpcMethod.ListRequests, + KeyringRpcMethod.GetRequest, + KeyringRpcMethod.ApproveRequest, + KeyringRpcMethod.RejectRequest, + ]); + }); + + it('returns the methods an unknown origin can call', () => { + const permissions = keyringSnapPermissionsBuilder(mockController); + expect(permissions('https://some-other-dapp.com')).toStrictEqual([]); + }); + + it.each([ + '', + 'null', + 'sftp://some-dapp.com', + 'http://some-dapp.com', + '0', + undefined, + null, + true, + false, + 1, + 0, + -1, + ])('"%s" cannot call any methods', (origin) => { + const permissions = keyringSnapPermissionsBuilder(mockController); + expect(permissions(origin as any)).toStrictEqual([]); + }); +}); diff --git a/app/scripts/lib/keyring-snaps-permissions.ts b/app/scripts/lib/keyring-snaps-permissions.ts new file mode 100644 index 000000000000..fc3dba14a3f9 --- /dev/null +++ b/app/scripts/lib/keyring-snaps-permissions.ts @@ -0,0 +1,82 @@ +import { + SubjectType, + SubjectMetadataController, +} from '@metamask/permission-controller'; +import { KeyringRpcMethod } from '@metamask/keyring-api'; + +/** + * List of keyring methods MetaMask can call. + */ +const METAMASK_ALLOWED_METHODS: string[] = [ + KeyringRpcMethod.ListAccounts, + KeyringRpcMethod.GetAccount, + KeyringRpcMethod.FilterAccountChains, + KeyringRpcMethod.DeleteAccount, + KeyringRpcMethod.ListRequests, + KeyringRpcMethod.GetRequest, + KeyringRpcMethod.SubmitRequest, + KeyringRpcMethod.RejectRequest, +]; + +/** + * List of keyring methods a dapp can call. + */ +const WEBSITE_ALLOWED_METHODS: string[] = [ + KeyringRpcMethod.ListAccounts, + KeyringRpcMethod.GetAccount, + KeyringRpcMethod.CreateAccount, + KeyringRpcMethod.FilterAccountChains, + KeyringRpcMethod.UpdateAccount, + KeyringRpcMethod.DeleteAccount, + KeyringRpcMethod.ExportAccount, + KeyringRpcMethod.ListRequests, + KeyringRpcMethod.GetRequest, + KeyringRpcMethod.ApproveRequest, + KeyringRpcMethod.RejectRequest, +]; + +/** + * List of allowed protocols. On Flask, HTTP is also allowed for testing. + */ +const ALLOWED_PROTOCOLS: string[] = [ + 'https:', + ///: BEGIN:ONLY_INCLUDE_IN(build-flask) + 'http:', + ///: END:ONLY_INCLUDE_IN +]; + +/** + * Checks if the protocol of the origin is allowed. + * + * @param origin - The origin to check. + * @returns `true` if the protocol of the origin is allowed, `false` otherwise. + */ +function isProtocolAllowed(origin: string): boolean { + const url = new URL(origin); + return ALLOWED_PROTOCOLS.includes(url.protocol); +} + +/** + * Builds a function that returns the list of keyring methods an origin can + * call. + * + * @param controller - Reference to the `SubjectMetadataController`. + * @returns A function that returns the list of keyring methods an origin can + * call. + */ +export function keyringSnapPermissionsBuilder( + controller: SubjectMetadataController, +): (origin: string) => string[] { + return (origin: string) => { + if (origin === 'metamask') { + return METAMASK_ALLOWED_METHODS; + } + + const originMetadata = controller.getSubjectMetadata(origin); + if (originMetadata?.subjectType === SubjectType.Website) { + return isProtocolAllowed(origin) ? WEBSITE_ALLOWED_METHODS : []; + } + + return []; + }; +} diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index f80305a3abb8..2d3e9e7bfa7e 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -166,6 +166,9 @@ import { getTokenValueParam } from '../../shared/lib/metamask-controller-utils'; import { isManifestV3 } from '../../shared/modules/mv3.utils'; import { hexToDecimal } from '../../shared/modules/conversion.utils'; import { ACTION_QUEUE_METRICS_E2E_TEST } from '../../shared/constants/test-flags'; +///: BEGIN:ONLY_INCLUDE_IN(keyring-snaps) +import { keyringSnapPermissionsBuilder } from './lib/keyring-snaps-permissions'; +///: END:ONLY_INCLUDE_IN ///: BEGIN:ONLY_INCLUDE_IN(petnames) import { SnapsNameProvider } from './lib/SnapsNameProvider'; @@ -4426,6 +4429,24 @@ export default class MetamaskController extends EventEmitter { 'SnapController:install', origin, ), + ///: END:ONLY_INCLUDE_IN + ///: BEGIN:ONLY_INCLUDE_IN(keyring-snaps) + hasPermission: this.permissionController.hasPermission.bind( + this.permissionController, + ), + getSnap: this.controllerMessenger.call.bind( + this.controllerMessenger, + 'SnapController:get', + ), + handleSnapRpcRequest: this.controllerMessenger.call.bind( + this.controllerMessenger, + 'SnapController:handleRequest', + ), + getAllowedKeyringMethods: keyringSnapPermissionsBuilder( + this.subjectMetadataController, + ), + ///: END:ONLY_INCLUDE_IN + ///: BEGIN:ONLY_INCLUDE_IN(snaps) }), ); ///: END:ONLY_INCLUDE_IN diff --git a/lavamoat/browserify/desktop/policy.json b/lavamoat/browserify/desktop/policy.json index 6889e6544be7..bb227f6be7a1 100644 --- a/lavamoat/browserify/desktop/policy.json +++ b/lavamoat/browserify/desktop/policy.json @@ -1233,9 +1233,9 @@ "packages": { "@ethereumjs/tx": true, "@metamask/eth-snap-keyring>@metamask/eth-sig-util": true, - "@metamask/eth-snap-keyring>@metamask/keyring-api": true, "@metamask/eth-snap-keyring>@metamask/utils": true, "@metamask/eth-snap-keyring>uuid": true, + "@metamask/keyring-api": true, "superstruct": true, "webpack>events": true } @@ -1252,31 +1252,6 @@ "eth-sig-util>tweetnacl-util": true } }, - "@metamask/eth-snap-keyring>@metamask/keyring-api": { - "packages": { - "@metamask/eth-snap-keyring>@metamask/keyring-api>@metamask/utils": true, - "@metamask/eth-snap-keyring>@metamask/keyring-api>uuid": true, - "superstruct": true - } - }, - "@metamask/eth-snap-keyring>@metamask/keyring-api>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/key-tree>@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true, - "superstruct": true - } - }, - "@metamask/eth-snap-keyring>@metamask/keyring-api>uuid": { - "globals": { - "crypto": true - } - }, "@metamask/eth-snap-keyring>@metamask/utils": { "globals": { "TextDecoder": true, @@ -1736,6 +1711,31 @@ "TextEncoder": true } }, + "@metamask/keyring-api": { + "packages": { + "@metamask/keyring-api>@metamask/utils": true, + "@metamask/keyring-api>uuid": true, + "superstruct": true + } + }, + "@metamask/keyring-api>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "@metamask/key-tree>@noble/hashes": true, + "browserify>buffer": true, + "nock>debug": true, + "semver": true, + "superstruct": true + } + }, + "@metamask/keyring-api>uuid": { + "globals": { + "crypto": true + } + }, "@metamask/keyring-controller": { "packages": { "@metamask/base-controller": true, diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index 7423db0e7c24..5d2e9e9db48f 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -1233,9 +1233,9 @@ "packages": { "@ethereumjs/tx": true, "@metamask/eth-snap-keyring>@metamask/eth-sig-util": true, - "@metamask/eth-snap-keyring>@metamask/keyring-api": true, "@metamask/eth-snap-keyring>@metamask/utils": true, "@metamask/eth-snap-keyring>uuid": true, + "@metamask/keyring-api": true, "superstruct": true, "webpack>events": true } @@ -1252,31 +1252,6 @@ "eth-sig-util>tweetnacl-util": true } }, - "@metamask/eth-snap-keyring>@metamask/keyring-api": { - "packages": { - "@metamask/eth-snap-keyring>@metamask/keyring-api>@metamask/utils": true, - "@metamask/eth-snap-keyring>@metamask/keyring-api>uuid": true, - "superstruct": true - } - }, - "@metamask/eth-snap-keyring>@metamask/keyring-api>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/key-tree>@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true, - "superstruct": true - } - }, - "@metamask/eth-snap-keyring>@metamask/keyring-api>uuid": { - "globals": { - "crypto": true - } - }, "@metamask/eth-snap-keyring>@metamask/utils": { "globals": { "TextDecoder": true, @@ -1736,6 +1711,31 @@ "TextEncoder": true } }, + "@metamask/keyring-api": { + "packages": { + "@metamask/keyring-api>@metamask/utils": true, + "@metamask/keyring-api>uuid": true, + "superstruct": true + } + }, + "@metamask/keyring-api>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "@metamask/key-tree>@noble/hashes": true, + "browserify>buffer": true, + "nock>debug": true, + "semver": true, + "superstruct": true + } + }, + "@metamask/keyring-api>uuid": { + "globals": { + "crypto": true + } + }, "@metamask/keyring-controller": { "packages": { "@metamask/base-controller": true, diff --git a/package.json b/package.json index 2fed93c8a407..f27b1294435c 100644 --- a/package.json +++ b/package.json @@ -247,7 +247,7 @@ "@metamask/eth-json-rpc-middleware": "^11.0.0", "@metamask/eth-keyring-controller": "^13.0.1", "@metamask/eth-ledger-bridge-keyring": "^0.15.0", - "@metamask/eth-snap-keyring": "0.3.1", + "@metamask/eth-snap-keyring": "^1.0.0-rc.1", "@metamask/eth-token-tracker": "^4.0.0", "@metamask/eth-trezor-keyring": "^1.1.0", "@metamask/etherscan-link": "^2.2.0", @@ -255,6 +255,7 @@ "@metamask/gas-fee-controller": "^6.0.1", "@metamask/jazzicon": "^2.0.0", "@metamask/key-tree": "^9.0.0", + "@metamask/keyring-api": "^1.0.0-rc.1", "@metamask/keyring-controller": "^8.0.1", "@metamask/logging-controller": "^1.0.1", "@metamask/logo": "^3.1.2", diff --git a/shared/constants/snaps/permissions.ts b/shared/constants/snaps/permissions.ts index 47971ad511cf..26d1f8ee9417 100644 --- a/shared/constants/snaps/permissions.ts +++ b/shared/constants/snaps/permissions.ts @@ -25,10 +25,9 @@ export const ExcludedSnapPermissions = Object.freeze({ }); export const ExcludedSnapEndowments = Object.freeze({ - // Move to below fence once implemented + ///: BEGIN:ONLY_INCLUDE_IN(build-main) 'endowment:keyring': 'This endowment is still in development therefore not available.', - ///: BEGIN:ONLY_INCLUDE_IN(build-main) 'endowment:lifecycle-hooks': 'This endowment is experimental and therefore not available.', 'endowment:name-lookup': diff --git a/test/e2e/tests/settings-add-snap-account-toggle.spec.js b/test/e2e/accounts/settings-add-snap-account-toggle.spec.js similarity index 88% rename from test/e2e/tests/settings-add-snap-account-toggle.spec.js rename to test/e2e/accounts/settings-add-snap-account-toggle.spec.js index 54a32f5d1662..c9d2dbfd5010 100644 --- a/test/e2e/tests/settings-add-snap-account-toggle.spec.js +++ b/test/e2e/accounts/settings-add-snap-account-toggle.spec.js @@ -17,6 +17,9 @@ describe('Add snap account experimental settings', function () { // Make sure the "Add snap account" button is not visible. await driver.clickElement('[data-testid="account-menu-icon"]'); + await driver.clickElement( + '[data-testid="multichain-account-menu-popover-action-button"]', + ); await driver.assertElementNotPresent({ text: 'Add snap account', tag: 'button', @@ -39,6 +42,9 @@ describe('Add snap account experimental settings', function () { // Make sure the "Add snap account" button is visible. await driver.clickElement('[data-testid="account-menu-icon"]'); + await driver.clickElement( + '[data-testid="multichain-account-menu-popover-action-button"]', + ); assert.equal( await driver.isElementPresentAndVisible({ text: 'Add snap account', diff --git a/test/e2e/accounts/utils.ts b/test/e2e/accounts/utils.ts index 3aab19654db4..8d844f329326 100644 --- a/test/e2e/accounts/utils.ts +++ b/test/e2e/accounts/utils.ts @@ -1,2 +1,2 @@ export const TEST_SNAPS_SIMPLE_KEYRING_WEBSITE_URL = - 'https://metamask.github.io/snap-simple-keyring/0.2.3/'; + 'https://metamask.github.io/snap-simple-keyring/0.3.0/'; diff --git a/yarn.lock b/yarn.lock index 0d7fa0ee5cce..b3560238caac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4144,19 +4144,19 @@ __metadata: languageName: node linkType: hard -"@metamask/eth-snap-keyring@npm:0.3.1": - version: 0.3.1 - resolution: "@metamask/eth-snap-keyring@npm:0.3.1" +"@metamask/eth-snap-keyring@npm:^1.0.0-rc.1": + version: 1.0.0-rc.1 + resolution: "@metamask/eth-snap-keyring@npm:1.0.0-rc.1" dependencies: "@ethereumjs/tx": "npm:^4.2.0" "@metamask/eth-sig-util": "npm:^7.0.0" - "@metamask/keyring-api": "npm:^0.2.7" - "@metamask/snaps-controllers": "npm:^2.0.0" + "@metamask/keyring-api": "npm:^1.0.0-rc.1" + "@metamask/snaps-controllers": "npm:^3.0.0" "@metamask/utils": "npm:^8.1.0" "@types/uuid": "npm:^9.0.1" superstruct: "npm:^1.0.3" uuid: "npm:^9.0.0" - checksum: 286448d2302b3ac663e71176a8464405cdaa30841e980dbac808913a9c1418b4965625c1e3be3d8b3f601ec59257b365e507aef77cf3edca150d8ea6ac3461f5 + checksum: afb50a755823e249e80731da7e2f3ab4246b900020135eb4c3c657d663f2d44a7a6281f29a9a453f5975bd493e4322bede3d5bea0c94871dda8ce0ceced5f186 languageName: node linkType: hard @@ -4272,19 +4272,19 @@ __metadata: languageName: node linkType: hard -"@metamask/keyring-api@npm:^0.2.7": - version: 0.2.7 - resolution: "@metamask/keyring-api@npm:0.2.7" +"@metamask/keyring-api@npm:^1.0.0-rc.1": + version: 1.0.0-rc.1 + resolution: "@metamask/keyring-api@npm:1.0.0-rc.1" dependencies: "@metamask/providers": "npm:^13.0.0" - "@metamask/rpc-methods": "npm:^2.0.0" - "@metamask/snaps-controllers": "npm:^2.0.0" - "@metamask/snaps-utils": "npm:^2.0.0" + "@metamask/rpc-methods": "npm:^3.0.0" + "@metamask/snaps-controllers": "npm:^3.0.0" + "@metamask/snaps-utils": "npm:^3.0.0" "@metamask/utils": "npm:^8.1.0" "@types/uuid": "npm:^9.0.1" superstruct: "npm:^1.0.3" uuid: "npm:^9.0.0" - checksum: e5c607d4b23fcdb75a32fe17a9a25f46acc0c11a41289f444006fddf334b6f75bac6fcc9b9110ababc69388c64d5cbe8a291ac6a73e821c6e9844735f937ba09 + checksum: 60c418d430d01ec6e8a0ed8e6407bb62bcabfe6933d20f8efd31f82e9ae6d1f2b34009affc621f9bf2570d35fad20e4565305369232742b7830c11a27b053e6f languageName: node linkType: hard @@ -4485,7 +4485,7 @@ __metadata: languageName: node linkType: hard -"@metamask/permission-controller@npm:^4.0.0, @metamask/permission-controller@npm:^4.1.0, @metamask/permission-controller@npm:^4.1.2": +"@metamask/permission-controller@npm:^4.0.0, @metamask/permission-controller@npm:^4.1.2": version: 4.1.2 resolution: "@metamask/permission-controller@npm:4.1.2" dependencies: @@ -4647,23 +4647,6 @@ __metadata: languageName: node linkType: hard -"@metamask/rpc-methods@npm:^2.0.0": - version: 2.0.0 - resolution: "@metamask/rpc-methods@npm:2.0.0" - dependencies: - "@metamask/key-tree": "npm:^9.0.0" - "@metamask/permission-controller": "npm:^4.1.0" - "@metamask/snaps-ui": "npm:^2.0.0" - "@metamask/snaps-utils": "npm:^2.0.0" - "@metamask/types": "npm:^1.1.0" - "@metamask/utils": "npm:^8.1.0" - "@noble/hashes": "npm:^1.3.1" - eth-rpc-errors: "npm:^4.0.3" - superstruct: "npm:^1.0.3" - checksum: d520efa0c8b64f4274dbcefc7e4c7a7a88d65a44c48ac30945a699aaaf025a67a2647bbecae82ad25a5ef2ca81bbf7444385d5d73b0bb2aadb9479e47593e542 - languageName: node - linkType: hard - "@metamask/rpc-methods@npm:^3.0.0": version: 3.0.0 resolution: "@metamask/rpc-methods@npm:3.0.0" @@ -4780,34 +4763,6 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-controllers@npm:^2.0.0": - version: 2.0.2 - resolution: "@metamask/snaps-controllers@npm:2.0.2" - dependencies: - "@metamask/approval-controller": "npm:^3.5.0" - "@metamask/base-controller": "npm:^3.2.0" - "@metamask/object-multiplex": "npm:^1.2.0" - "@metamask/permission-controller": "npm:^4.1.0" - "@metamask/post-message-stream": "npm:^7.0.0" - "@metamask/rpc-methods": "npm:^2.0.0" - "@metamask/snaps-execution-environments": "npm:^2.0.1" - "@metamask/snaps-registry": "npm:^2.0.0" - "@metamask/snaps-utils": "npm:^2.0.1" - "@metamask/utils": "npm:^8.1.0" - "@xstate/fsm": "npm:^2.0.0" - concat-stream: "npm:^2.0.0" - eth-rpc-errors: "npm:^4.0.3" - gunzip-maybe: "npm:^1.4.2" - immer: "npm:^9.0.6" - json-rpc-engine: "npm:^6.1.0" - json-rpc-middleware-stream: "npm:^4.2.0" - nanoid: "npm:^3.1.31" - readable-web-to-node-stream: "npm:^3.0.2" - tar-stream: "npm:^2.2.0" - checksum: edd56d591621e2bdc6e53162058e8cb9f70c619f475aaa2b85fa63e1b4b59979a9343e5bff02066a8b9d933d46b5ca14bce344d7715d3457a738f22eafe1c163 - languageName: node - linkType: hard - "@metamask/snaps-controllers@npm:^3.0.0": version: 3.0.0 resolution: "@metamask/snaps-controllers@npm:3.0.0" @@ -4836,24 +4791,6 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-execution-environments@npm:^2.0.1": - version: 2.0.1 - resolution: "@metamask/snaps-execution-environments@npm:2.0.1" - dependencies: - "@metamask/object-multiplex": "npm:^1.2.0" - "@metamask/post-message-stream": "npm:^7.0.0" - "@metamask/providers": "npm:^11.1.1" - "@metamask/rpc-methods": "npm:^2.0.0" - "@metamask/snaps-utils": "npm:^2.0.1" - "@metamask/utils": "npm:^8.1.0" - eth-rpc-errors: "npm:^4.0.3" - json-rpc-engine: "npm:^6.1.0" - nanoid: "npm:^3.1.31" - superstruct: "npm:^1.0.3" - checksum: 9c2ba350b8dc83d4c3a1acb8c7e8d92c1696196fd893ecf546d049f760d8f989275015c18ea1c8c16dfe411af7ae4c9f015ed436caf4f9110b6f325558431475 - languageName: node - linkType: hard - "@metamask/snaps-execution-environments@npm:^3.0.0": version: 3.0.0 resolution: "@metamask/snaps-execution-environments@npm:3.0.0" @@ -4883,16 +4820,6 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-ui@npm:^2.0.0": - version: 2.0.0 - resolution: "@metamask/snaps-ui@npm:2.0.0" - dependencies: - "@metamask/utils": "npm:^8.1.0" - superstruct: "npm:^1.0.3" - checksum: 9ac3dabb1ca9731d510f10f2d81e0160a3f890b9f32c71f780d0fa1c9e72c26fa5e25f70c60afb1c6e216387634d31ad6c78a45f17f51a34ad1b655045f65586 - languageName: node - linkType: hard - "@metamask/snaps-ui@npm:^3.0.0": version: 3.0.0 resolution: "@metamask/snaps-ui@npm:3.0.0" @@ -4904,35 +4831,6 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-utils@npm:^2.0.0, @metamask/snaps-utils@npm:^2.0.1": - version: 2.0.1 - resolution: "@metamask/snaps-utils@npm:2.0.1" - dependencies: - "@babel/core": "npm:^7.20.12" - "@babel/types": "npm:^7.18.7" - "@metamask/base-controller": "npm:^3.2.0" - "@metamask/key-tree": "npm:^9.0.0" - "@metamask/permission-controller": "npm:^4.1.0" - "@metamask/snaps-registry": "npm:^2.0.0" - "@metamask/snaps-ui": "npm:^2.0.0" - "@metamask/utils": "npm:^8.1.0" - "@noble/hashes": "npm:^1.3.1" - "@scure/base": "npm:^1.1.1" - chalk: "npm:^4.1.2" - cron-parser: "npm:^4.5.0" - eth-rpc-errors: "npm:^4.0.3" - fast-deep-equal: "npm:^3.1.3" - fast-json-stable-stringify: "npm:^2.1.0" - is-svg: "npm:^4.4.0" - rfdc: "npm:^1.3.0" - semver: "npm:^7.5.4" - ses: "npm:^0.18.8" - superstruct: "npm:^1.0.3" - validate-npm-package-name: "npm:^5.0.0" - checksum: 1d85ee5f101bb84b2e0a4aec6effc737786cfc1e812fe59936886988ae62574562f9f062b6f9975c2ca2a8129f36c27202acb51d795ea3ce211ce86dd1d5ee02 - languageName: node - linkType: hard - "@metamask/snaps-utils@npm:^3.0.0": version: 3.0.0 resolution: "@metamask/snaps-utils@npm:3.0.0" @@ -23918,7 +23816,7 @@ __metadata: "@metamask/eth-json-rpc-middleware": "npm:^11.0.0" "@metamask/eth-keyring-controller": "npm:^13.0.1" "@metamask/eth-ledger-bridge-keyring": "npm:^0.15.0" - "@metamask/eth-snap-keyring": "npm:0.3.1" + "@metamask/eth-snap-keyring": "npm:^1.0.0-rc.1" "@metamask/eth-token-tracker": "npm:^4.0.0" "@metamask/eth-trezor-keyring": "npm:^1.1.0" "@metamask/etherscan-link": "npm:^2.2.0" @@ -23927,6 +23825,7 @@ __metadata: "@metamask/gas-fee-controller": "npm:^6.0.1" "@metamask/jazzicon": "npm:^2.0.0" "@metamask/key-tree": "npm:^9.0.0" + "@metamask/keyring-api": "npm:^1.0.0-rc.1" "@metamask/keyring-controller": "npm:^8.0.1" "@metamask/logging-controller": "npm:^1.0.1" "@metamask/logo": "npm:^3.1.2"