From 6cc15163b1506adb896187e0c2062cc2abb7e89c Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Thu, 23 Jan 2025 14:14:00 -0800 Subject: [PATCH 01/13] use preview build cba3b99d (initial SIP-26 hooks) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index f3f3d9bcbf87..0c48cb909f87 100644 --- a/package.json +++ b/package.json @@ -328,7 +328,7 @@ "@metamask/message-manager": "^11.0.0", "@metamask/message-signing-snap": "^0.6.0", "@metamask/metamask-eth-abis": "^3.1.1", - "@metamask/multichain": "npm:@metamask-previews/multichain@2.0.0-preview-2ba45577", + "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-cba3b99d", "@metamask/name-controller": "^8.0.0", "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A22.1.1#~/.yarn/patches/@metamask-network-controller-npm-22.1.1-09b6510f1e.patch", "@metamask/notification-services-controller": "^0.15.0", diff --git a/yarn.lock b/yarn.lock index f7b4401170a3..4d442cc9e89c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5909,9 +5909,9 @@ __metadata: languageName: node linkType: hard -"@metamask/multichain@npm:@metamask-previews/multichain@2.0.0-preview-2ba45577": - version: 2.0.0-preview-2ba45577 - resolution: "@metamask-previews/multichain@npm:2.0.0-preview-2ba45577" +"@metamask/multichain@npm:@metamask-previews/multichain@2.1.0-preview-cba3b99d": + version: 2.1.0-preview-cba3b99d + resolution: "@metamask-previews/multichain@npm:2.1.0-preview-cba3b99d" dependencies: "@metamask/api-specs": "npm:^0.10.12" "@metamask/controller-utils": "npm:^11.4.5" @@ -5925,7 +5925,7 @@ __metadata: peerDependencies: "@metamask/network-controller": ^22.0.0 "@metamask/permission-controller": ^11.0.0 - checksum: 10/05992e42f7b50217c335bcd94ab64fdf7f89eea4acebe7f1e416ffec7d9dc7afd6ae49b5d998f9224ceb4d2d4b52463e9ccfcea3fc4f170dc1e9cef32c31661b + checksum: 10/32209c459ecccbda46ab9ec01873dbad73349703a66903dee64b62224e35475d7f88d0038c6f241dbadffabb5780346780027c803b309839565361859caa1e93 languageName: node linkType: hard @@ -26939,7 +26939,7 @@ __metadata: "@metamask/message-manager": "npm:^11.0.0" "@metamask/message-signing-snap": "npm:^0.6.0" "@metamask/metamask-eth-abis": "npm:^3.1.1" - "@metamask/multichain": "npm:@metamask-previews/multichain@2.0.0-preview-2ba45577" + "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-cba3b99d" "@metamask/name-controller": "npm:^8.0.0" "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A22.1.1#~/.yarn/patches/@metamask-network-controller-npm-22.1.1-09b6510f1e.patch" "@metamask/notification-services-controller": "npm:^0.15.0" From 6201adc2a8d939a5b4ce2ab4d5af175a991ecb31 Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Thu, 23 Jan 2025 14:59:12 -0800 Subject: [PATCH 02/13] thread noop hooks --- .../controllers/permissions/specifications.js | 2 ++ .../handlers/wallet-createSession/handler.ts | 19 +++++++++++++++---- app/scripts/metamask-controller.js | 5 +++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/app/scripts/controllers/permissions/specifications.js b/app/scripts/controllers/permissions/specifications.js index f4a1e3320172..5794d03a70eb 100644 --- a/app/scripts/controllers/permissions/specifications.js +++ b/app/scripts/controllers/permissions/specifications.js @@ -50,11 +50,13 @@ export const CaveatFactories = Object.freeze({ export const getCaveatSpecifications = ({ listAccounts, findNetworkClientIdByChainId, + isNonEvmScopeSupported }) => { return { [Caip25CaveatType]: caip25CaveatBuilder({ listAccounts, findNetworkClientIdByChainId, + isNonEvmScopeSupported, }), ...snapsCaveatsSpecifications, ...snapsEndowmentCaveatSpecifications, diff --git a/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts b/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts index 8c43d96f3cbb..347b77d27667 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts @@ -24,6 +24,7 @@ import { ValidPermission, } from '@metamask/permission-controller'; import { + CaipChainId, Hex, isPlainObject, Json, @@ -103,6 +104,8 @@ async function walletCreateSessionHandler( grantPermissions: ( ...args: Parameters ) => Record>>; + getNonEvmSupportedMethods: (scope: CaipChainId) => string[]; + isNonEvmScopeSupported: (scope: CaipChainId) => boolean; }, ) { const { origin } = req; @@ -121,9 +124,11 @@ async function walletCreateSessionHandler( const supportedRequiredScopesObjects = getSupportedScopeObjects( normalizedRequiredScopes, + { getNonEvmSupportedMethods: hooks.getNonEvmSupportedMethods }, ); const supportedOptionalScopesObjects = getSupportedScopeObjects( normalizedOptionalScopes, + { getNonEvmSupportedMethods: hooks.getNonEvmSupportedMethods }, ); const existsNetworkClientForChainId = (chainId: Hex) => { @@ -138,16 +143,20 @@ async function walletCreateSessionHandler( const { supportedScopes: supportedRequiredScopes } = bucketScopes( supportedRequiredScopesObjects, { - isChainIdSupported: existsNetworkClientForChainId, - isChainIdSupportable: () => false, // intended for future usage with eip3085 scopedProperties + isEvmChainIdSupported: existsNetworkClientForChainId, + isEvmChainIdSupportable: () => false, // intended for future usage with eip3085 scopedProperties + getNonEvmSupportedMethods: hooks.getNonEvmSupportedMethods, + isNonEvmScopeSupported: hooks.isNonEvmScopeSupported, }, ); const { supportedScopes: supportedOptionalScopes } = bucketScopes( supportedOptionalScopesObjects, { - isChainIdSupported: existsNetworkClientForChainId, - isChainIdSupportable: () => false, // intended for future usage with eip3085 scopedProperties + isEvmChainIdSupported: existsNetworkClientForChainId, + isEvmChainIdSupportable: () => false, // intended for future usage with eip3085 scopedProperties + getNonEvmSupportedMethods: hooks.getNonEvmSupportedMethods, + isNonEvmScopeSupported: hooks.isNonEvmScopeSupported, }, ); @@ -264,5 +273,7 @@ export const walletCreateSession = { grantPermissions: true, sendMetrics: true, metamaskState: true, + getNonEvmSupportedMethods: true, + isNonEvmScopeSupported: true, }, }; diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 655354d54d11..8c7fac7bb075 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -1353,6 +1353,8 @@ export default class MetamaskController extends EventEmitter { this.networkController.findNetworkClientIdByChainId.bind( this.networkController, ), + // TODO: Fix this + isNonEvmScopeSupported: () => false, }), permissionSpecifications: { ...getPermissionSpecifications(), @@ -6902,6 +6904,9 @@ export default class MetamaskController extends EventEmitter { this.permissionController, origin, ), + // TODO: Fix these + getNonEvmSupportedMethods: () => [], + isNonEvmScopeSupported: () => false, }), ); From 25d9e98e7d96dd7a426ca233228b1f87a4376de5 Mon Sep 17 00:00:00 2001 From: Frederik Bolding Date: Fri, 24 Jan 2025 14:59:22 +0100 Subject: [PATCH 03/13] Add wiring for MultichainRouter --- app/scripts/metamask-controller.js | 37 ++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 8c7fac7bb075..f4647aaf23e5 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -91,6 +91,7 @@ import { SnapInterfaceController, SnapInsightsController, OffscreenExecutionService, + MultichainRouter, } from '@metamask/snaps-controllers'; import { createSnapsMethodMiddleware, @@ -1353,8 +1354,10 @@ export default class MetamaskController extends EventEmitter { this.networkController.findNetworkClientIdByChainId.bind( this.networkController, ), - // TODO: Fix this - isNonEvmScopeSupported: () => false, + isNonEvmScopeSupported: this.controllerMessenger.call.bind( + this.controllerMessenger, + 'MultichainRouter:isSupportedScope', + ), }), permissionSpecifications: { ...getPermissionSpecifications(), @@ -1639,6 +1642,25 @@ export default class MetamaskController extends EventEmitter { messenger: snapInsightsControllerMessenger, }); + const multichainRouterMessenger = this.controllerMessenger.getRestricted({ + name: 'MultichainRouter', + allowedActions: [ + `${this.snapController.name}:getAll`, + `${this.snapController.name}:handleRequest`, + `${this.permissionController.name}:getPermissions`, + `AccountsController:listMultichainAccounts`, + ], + allowedEvents: [], + }); + + this.multichainRouter = new MultichainRouter({ + messenger: multichainRouterMessenger, + // Binding the call to provide the selector only giving the controller the option to pass the operation + withSnapKeyring: this.keyringController.withKeyring.bind(this.keyringController, { + type: 'snap', + }), + }); + // Notification Controllers this.authenticationController = new AuthenticationController.Controller({ state: initState.AuthenticationController, @@ -6904,9 +6926,14 @@ export default class MetamaskController extends EventEmitter { this.permissionController, origin, ), - // TODO: Fix these - getNonEvmSupportedMethods: () => [], - isNonEvmScopeSupported: () => false, + getNonEvmSupportedMethods: this.controllerMessenger.call.bind( + this.controllerMessenger, + 'MultichainRouter:getSupportedMethods', + ), + isNonEvmScopeSupported: this.controllerMessenger.call.bind( + this.controllerMessenger, + 'MultichainRouter:isSupportedScope', + ), }), ); From 188ffdde9c0b0f7a64492626fe375d4759f46631 Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Fri, 24 Jan 2025 08:58:40 -0800 Subject: [PATCH 04/13] use preview build abb67026 (fix wallet_getSession, wallet_invokeMethod, and getSessionScopes) --- app/scripts/metamask-controller.js | 21 +++++++++++++-------- package.json | 2 +- yarn.lock | 10 +++++----- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 65405de324e7..318fb1dc1115 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -3202,7 +3202,7 @@ export default class MetamaskController extends EventEmitter { // remove any existing notification subscriptions for removed authorizations for (const [origin, authorization] of removedAuthorizations.entries()) { - const sessionScopes = getSessionScopes(authorization); + const sessionScopes = getSessionScopes(authorization, {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods}); // if the eth_subscription notification is in the scope and eth_subscribe is in the methods // then remove middleware and unsubscribe Object.entries(sessionScopes).forEach(([scope, scopeObject]) => { @@ -3224,7 +3224,7 @@ export default class MetamaskController extends EventEmitter { // add new notification subscriptions for changed authorizations for (const [origin, authorization] of changedAuthorizations.entries()) { - const sessionScopes = getSessionScopes(authorization); + const sessionScopes = getSessionScopes(authorization, {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods}); // if the eth_subscription notification is in the scope and eth_subscribe is in the methods // then get the subscriptionManager going for that scope @@ -3265,6 +3265,7 @@ export default class MetamaskController extends EventEmitter { if (previousAuthorization) { const previousSessionScopes = getSessionScopes( previousAuthorization, + {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods} ); Object.entries(previousSessionScopes).forEach( @@ -5797,6 +5798,13 @@ export default class MetamaskController extends EventEmitter { }; } + getNonEvmSupportedMethods(scope) { + return this.controllerMessenger.call( + 'MultichainRouter:getSupportedMethods', + scope + ) + } + // --------------------------------------------------------------------------- // Identity Management (signature operations) @@ -6924,10 +6932,7 @@ export default class MetamaskController extends EventEmitter { this.permissionController, origin, ), - getNonEvmSupportedMethods: this.controllerMessenger.call.bind( - this.controllerMessenger, - 'MultichainRouter:getSupportedMethods', - ), + getNonEvmSupportedMethods: this.getNonEvmSupportedMethods.bind(this), isNonEvmScopeSupported: this.controllerMessenger.call.bind( this.controllerMessenger, 'MultichainRouter:isSupportedScope', @@ -7070,7 +7075,7 @@ export default class MetamaskController extends EventEmitter { ); // add new notification subscriptions for changed authorizations - const sessionScopes = getSessionScopes(caip25Caveat.value); + const sessionScopes = getSessionScopes(caip25Caveat.value, {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods}); // if the eth_subscription notification is in the scope and eth_subscribe is in the methods // then get the subscriptionManager going for that scope @@ -7966,7 +7971,7 @@ export default class MetamaskController extends EventEmitter { { method: NOTIFICATION_NAMES.sessionChanged, params: { - sessionScopes: getSessionScopes(newAuthorization), + sessionScopes: getSessionScopes(newAuthorization, {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods}), }, }, API_TYPE.CAIP_MULTICHAIN, diff --git a/package.json b/package.json index 422adcac2991..5e24485a6bb6 100644 --- a/package.json +++ b/package.json @@ -322,7 +322,7 @@ "@metamask/message-manager": "^11.0.0", "@metamask/message-signing-snap": "^0.6.0", "@metamask/metamask-eth-abis": "^3.1.1", - "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-cba3b99d", + "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-abb67026", "@metamask/multichain-transactions-controller": "^0.0.1", "@metamask/name-controller": "^8.0.0", "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A22.1.1#~/.yarn/patches/@metamask-network-controller-npm-22.1.1-09b6510f1e.patch", diff --git a/yarn.lock b/yarn.lock index 37f03a863b60..7332f07da117 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5865,9 +5865,9 @@ __metadata: languageName: node linkType: hard -"@metamask/multichain@npm:@metamask-previews/multichain@2.1.0-preview-cba3b99d": - version: 2.1.0-preview-cba3b99d - resolution: "@metamask-previews/multichain@npm:2.1.0-preview-cba3b99d" +"@metamask/multichain@npm:@metamask-previews/multichain@2.1.0-preview-abb67026": + version: 2.1.0-preview-abb67026 + resolution: "@metamask-previews/multichain@npm:2.1.0-preview-abb67026" dependencies: "@metamask/api-specs": "npm:^0.10.12" "@metamask/controller-utils": "npm:^11.4.5" @@ -5881,7 +5881,7 @@ __metadata: peerDependencies: "@metamask/network-controller": ^22.0.0 "@metamask/permission-controller": ^11.0.0 - checksum: 10/32209c459ecccbda46ab9ec01873dbad73349703a66903dee64b62224e35475d7f88d0038c6f241dbadffabb5780346780027c803b309839565361859caa1e93 + checksum: 10/7f138dc6d564300dc1c583d9a57f5ad5aa8c43b310852ac48761a6ef80716588400dd19a5a72eb6ae7f4008d4e14118335f34bfbc9dc6d5bc63a74c6261f1d0d languageName: node linkType: hard @@ -26916,7 +26916,7 @@ __metadata: "@metamask/message-manager": "npm:^11.0.0" "@metamask/message-signing-snap": "npm:^0.6.0" "@metamask/metamask-eth-abis": "npm:^3.1.1" - "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-cba3b99d" + "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-abb67026" "@metamask/multichain-transactions-controller": "npm:^0.0.1" "@metamask/name-controller": "npm:^8.0.0" "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A22.1.1#~/.yarn/patches/@metamask-network-controller-npm-22.1.1-09b6510f1e.patch" From c28387b62abdd453db5f18b7b24335c8084fd591 Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Fri, 24 Jan 2025 09:36:54 -0800 Subject: [PATCH 05/13] fix binds. Fix wallet_createSession --- .../handlers/wallet-createSession/handler.ts | 2 +- app/scripts/metamask-controller.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts b/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts index 347b77d27667..0307f201e87f 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts @@ -212,7 +212,7 @@ async function walletCreateSessionHandler( legacyApproval.approvedAccounts, ); - const sessionScopes = getSessionScopes(caip25CaveatValue); + const sessionScopes = getSessionScopes(caip25CaveatValue, { getNonEvmSupportedMethods: hooks.getNonEvmSupportedMethods}); hooks.grantPermissions({ subject: { diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 318fb1dc1115..b162f4cef9a1 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -3202,7 +3202,7 @@ export default class MetamaskController extends EventEmitter { // remove any existing notification subscriptions for removed authorizations for (const [origin, authorization] of removedAuthorizations.entries()) { - const sessionScopes = getSessionScopes(authorization, {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods}); + const sessionScopes = getSessionScopes(authorization, {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods.bind(this)}); // if the eth_subscription notification is in the scope and eth_subscribe is in the methods // then remove middleware and unsubscribe Object.entries(sessionScopes).forEach(([scope, scopeObject]) => { @@ -3224,7 +3224,7 @@ export default class MetamaskController extends EventEmitter { // add new notification subscriptions for changed authorizations for (const [origin, authorization] of changedAuthorizations.entries()) { - const sessionScopes = getSessionScopes(authorization, {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods}); + const sessionScopes = getSessionScopes(authorization, {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods.bind(this)}); // if the eth_subscription notification is in the scope and eth_subscribe is in the methods // then get the subscriptionManager going for that scope @@ -3265,7 +3265,7 @@ export default class MetamaskController extends EventEmitter { if (previousAuthorization) { const previousSessionScopes = getSessionScopes( previousAuthorization, - {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods} + {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods.bind(this)} ); Object.entries(previousSessionScopes).forEach( @@ -7075,7 +7075,7 @@ export default class MetamaskController extends EventEmitter { ); // add new notification subscriptions for changed authorizations - const sessionScopes = getSessionScopes(caip25Caveat.value, {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods}); + const sessionScopes = getSessionScopes(caip25Caveat.value, {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods.bind(this)}); // if the eth_subscription notification is in the scope and eth_subscribe is in the methods // then get the subscriptionManager going for that scope @@ -7971,7 +7971,7 @@ export default class MetamaskController extends EventEmitter { { method: NOTIFICATION_NAMES.sessionChanged, params: { - sessionScopes: getSessionScopes(newAuthorization, {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods}), + sessionScopes: getSessionScopes(newAuthorization, {getNonEvmSupportedMethods: this.getNonEvmSupportedMethods.bind(this)}), }, }, API_TYPE.CAIP_MULTICHAIN, From ab2e7462d1ad2e2ae541a8050ac7d89ad86ff3fa Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Wed, 29 Jan 2025 11:07:34 -0800 Subject: [PATCH 06/13] use preview build 3fc797ab (add handleNonEvmRequest hook to wallet_invokeMethod handler) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 5e24485a6bb6..dc858e6ed6bc 100644 --- a/package.json +++ b/package.json @@ -322,7 +322,7 @@ "@metamask/message-manager": "^11.0.0", "@metamask/message-signing-snap": "^0.6.0", "@metamask/metamask-eth-abis": "^3.1.1", - "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-abb67026", + "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-3fc797ab", "@metamask/multichain-transactions-controller": "^0.0.1", "@metamask/name-controller": "^8.0.0", "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A22.1.1#~/.yarn/patches/@metamask-network-controller-npm-22.1.1-09b6510f1e.patch", diff --git a/yarn.lock b/yarn.lock index 7332f07da117..9833bf005a84 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5865,9 +5865,9 @@ __metadata: languageName: node linkType: hard -"@metamask/multichain@npm:@metamask-previews/multichain@2.1.0-preview-abb67026": - version: 2.1.0-preview-abb67026 - resolution: "@metamask-previews/multichain@npm:2.1.0-preview-abb67026" +"@metamask/multichain@npm:@metamask-previews/multichain@2.1.0-preview-3fc797ab": + version: 2.1.0-preview-3fc797ab + resolution: "@metamask-previews/multichain@npm:2.1.0-preview-3fc797ab" dependencies: "@metamask/api-specs": "npm:^0.10.12" "@metamask/controller-utils": "npm:^11.4.5" @@ -5881,7 +5881,7 @@ __metadata: peerDependencies: "@metamask/network-controller": ^22.0.0 "@metamask/permission-controller": ^11.0.0 - checksum: 10/7f138dc6d564300dc1c583d9a57f5ad5aa8c43b310852ac48761a6ef80716588400dd19a5a72eb6ae7f4008d4e14118335f34bfbc9dc6d5bc63a74c6261f1d0d + checksum: 10/25ac93efffa2d5cea887d1b524ccf59af409bba79e6735cf660bae3a8750974a483c8f5fd7a50db487ae6b39415b24b6e0c90e31e108d04f555dbf6c73b7eb9b languageName: node linkType: hard @@ -26916,7 +26916,7 @@ __metadata: "@metamask/message-manager": "npm:^11.0.0" "@metamask/message-signing-snap": "npm:^0.6.0" "@metamask/metamask-eth-abis": "npm:^3.1.1" - "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-abb67026" + "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-3fc797ab" "@metamask/multichain-transactions-controller": "npm:^0.0.1" "@metamask/name-controller": "npm:^8.0.0" "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A22.1.1#~/.yarn/patches/@metamask-network-controller-npm-22.1.1-09b6510f1e.patch" From 1a78dcfa48888dbffff9356ae2c35e63cc5dea6f Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Wed, 29 Jan 2025 11:12:57 -0800 Subject: [PATCH 07/13] Add handleNonEvmRequest hook in MMC --- app/scripts/metamask-controller.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index c8d8b45e80f9..eaccb58c82d5 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -6851,6 +6851,10 @@ export default class MetamaskController extends EventEmitter { this.controllerMessenger, 'MultichainRouter:isSupportedScope', ), + handleNonEvmRequest: this.controllerMessenger.call.bind( + this.controllerMessenger, + 'MultichainRouter:handleRequest', + ), }), ); From 21f4cb4a3b3869d72cfde968617923c6a88e09d2 Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Wed, 29 Jan 2025 11:40:58 -0800 Subject: [PATCH 08/13] use preview build b6ada138 (add hookName to wallet_invokeMethod handler) --- app/scripts/metamask-controller.js | 1 - package.json | 2 +- yarn.lock | 10 +++++----- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index eaccb58c82d5..c8ff1d43dca3 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -3505,7 +3505,6 @@ export default class MetamaskController extends EventEmitter { */ async getProviderState(origin) { const providerNetworkState = await this.getProviderNetworkState(origin); - console.log(providerNetworkState); ///: BEGIN:ONLY_INCLUDE_IF(build-flask) const { chrome } = globalThis; ///: END:ONLY_INCLUDE_IF diff --git a/package.json b/package.json index cb308122a9c3..dbb7452ac05e 100644 --- a/package.json +++ b/package.json @@ -323,7 +323,7 @@ "@metamask/message-manager": "^12.0.0", "@metamask/message-signing-snap": "^0.6.0", "@metamask/metamask-eth-abis": "^3.1.1", - "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-3fc797ab", + "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-b6ada138", "@metamask/multichain-transactions-controller": "^0.0.1", "@metamask/name-controller": "^8.0.0", "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A22.1.1#~/.yarn/patches/@metamask-network-controller-npm-22.1.1-09b6510f1e.patch", diff --git a/yarn.lock b/yarn.lock index 626511a63190..292aa338f4d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5854,9 +5854,9 @@ __metadata: languageName: node linkType: hard -"@metamask/multichain@npm:@metamask-previews/multichain@2.1.0-preview-3fc797ab": - version: 2.1.0-preview-3fc797ab - resolution: "@metamask-previews/multichain@npm:2.1.0-preview-3fc797ab" +"@metamask/multichain@npm:@metamask-previews/multichain@2.1.0-preview-b6ada138": + version: 2.1.0-preview-b6ada138 + resolution: "@metamask-previews/multichain@npm:2.1.0-preview-b6ada138" dependencies: "@metamask/api-specs": "npm:^0.10.12" "@metamask/controller-utils": "npm:^11.4.5" @@ -5870,7 +5870,7 @@ __metadata: peerDependencies: "@metamask/network-controller": ^22.0.0 "@metamask/permission-controller": ^11.0.0 - checksum: 10/25ac93efffa2d5cea887d1b524ccf59af409bba79e6735cf660bae3a8750974a483c8f5fd7a50db487ae6b39415b24b6e0c90e31e108d04f555dbf6c73b7eb9b + checksum: 10/4e9b1ff70dfb18fb551456a404d583bf116f59d7b724473365b577b8599ae106b1778e96bf26c3c7208f0f5b150093f46791211bec4916f17aac427671df4b8f languageName: node linkType: hard @@ -26905,7 +26905,7 @@ __metadata: "@metamask/message-manager": "npm:^12.0.0" "@metamask/message-signing-snap": "npm:^0.6.0" "@metamask/metamask-eth-abis": "npm:^3.1.1" - "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-3fc797ab" + "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-b6ada138" "@metamask/multichain-transactions-controller": "npm:^0.0.1" "@metamask/name-controller": "npm:^8.0.0" "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A22.1.1#~/.yarn/patches/@metamask-network-controller-npm-22.1.1-09b6510f1e.patch" From 2913378adf25f82c3486a127e0e74d57464881c8 Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Wed, 29 Jan 2025 11:57:37 -0800 Subject: [PATCH 09/13] use preview build 5dfebad9 (properly unwrap request passed to MultichainRouter) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index dbb7452ac05e..045ac85701a3 100644 --- a/package.json +++ b/package.json @@ -323,7 +323,7 @@ "@metamask/message-manager": "^12.0.0", "@metamask/message-signing-snap": "^0.6.0", "@metamask/metamask-eth-abis": "^3.1.1", - "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-b6ada138", + "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-5dfebad9", "@metamask/multichain-transactions-controller": "^0.0.1", "@metamask/name-controller": "^8.0.0", "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A22.1.1#~/.yarn/patches/@metamask-network-controller-npm-22.1.1-09b6510f1e.patch", diff --git a/yarn.lock b/yarn.lock index 292aa338f4d2..562f095bc633 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5854,9 +5854,9 @@ __metadata: languageName: node linkType: hard -"@metamask/multichain@npm:@metamask-previews/multichain@2.1.0-preview-b6ada138": - version: 2.1.0-preview-b6ada138 - resolution: "@metamask-previews/multichain@npm:2.1.0-preview-b6ada138" +"@metamask/multichain@npm:@metamask-previews/multichain@2.1.0-preview-5dfebad9": + version: 2.1.0-preview-5dfebad9 + resolution: "@metamask-previews/multichain@npm:2.1.0-preview-5dfebad9" dependencies: "@metamask/api-specs": "npm:^0.10.12" "@metamask/controller-utils": "npm:^11.4.5" @@ -5870,7 +5870,7 @@ __metadata: peerDependencies: "@metamask/network-controller": ^22.0.0 "@metamask/permission-controller": ^11.0.0 - checksum: 10/4e9b1ff70dfb18fb551456a404d583bf116f59d7b724473365b577b8599ae106b1778e96bf26c3c7208f0f5b150093f46791211bec4916f17aac427671df4b8f + checksum: 10/c615befb3df37699613a0822981e0d9df30884129012e950015f5955d9d045d517b777711101e401426388086374b50cee20e5a4e73df2f6dcdd2b84f2985056 languageName: node linkType: hard @@ -26905,7 +26905,7 @@ __metadata: "@metamask/message-manager": "npm:^12.0.0" "@metamask/message-signing-snap": "npm:^0.6.0" "@metamask/metamask-eth-abis": "npm:^3.1.1" - "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-b6ada138" + "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-5dfebad9" "@metamask/multichain-transactions-controller": "npm:^0.0.1" "@metamask/name-controller": "npm:^8.0.0" "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A22.1.1#~/.yarn/patches/@metamask-network-controller-npm-22.1.1-09b6510f1e.patch" From e4a74d7bafee374f3c1725a5600de2f9e6b37ac5 Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Mon, 3 Feb 2025 11:13:04 -0800 Subject: [PATCH 10/13] use preview build 082735ba (updated hooks + validator) --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 0e47ea6cf6e8..63b6a61a17f3 100644 --- a/package.json +++ b/package.json @@ -321,7 +321,7 @@ "@metamask/message-manager": "^12.0.0", "@metamask/message-signing-snap": "^0.6.0", "@metamask/metamask-eth-abis": "^3.1.1", - "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-5dfebad9", + "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-082735ba", "@metamask/multichain-transactions-controller": "^0.0.1", "@metamask/name-controller": "^8.0.0", "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A22.1.1#~/.yarn/patches/@metamask-network-controller-npm-22.1.1-09b6510f1e.patch", diff --git a/yarn.lock b/yarn.lock index c8b79d9e5c82..a8b9e7ce47f4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5726,23 +5726,23 @@ __metadata: languageName: node linkType: hard -"@metamask/multichain@npm:@metamask-previews/multichain@2.1.0-preview-5dfebad9": - version: 2.1.0-preview-5dfebad9 - resolution: "@metamask-previews/multichain@npm:2.1.0-preview-5dfebad9" +"@metamask/multichain@npm:@metamask-previews/multichain@2.1.0-preview-082735ba": + version: 2.1.0-preview-082735ba + resolution: "@metamask-previews/multichain@npm:2.1.0-preview-082735ba" dependencies: "@metamask/api-specs": "npm:^0.10.12" "@metamask/controller-utils": "npm:^11.4.5" "@metamask/eth-json-rpc-filters": "npm:^9.0.0" "@metamask/rpc-errors": "npm:^7.0.2" "@metamask/safe-event-emitter": "npm:^3.0.0" - "@metamask/utils": "npm:^11.0.1" + "@metamask/utils": "npm:^11.1.0" "@open-rpc/schema-utils-js": "npm:^2.0.5" jsonschema: "npm:^1.4.1" lodash: "npm:^4.17.21" peerDependencies: "@metamask/network-controller": ^22.0.0 "@metamask/permission-controller": ^11.0.0 - checksum: 10/c615befb3df37699613a0822981e0d9df30884129012e950015f5955d9d045d517b777711101e401426388086374b50cee20e5a4e73df2f6dcdd2b84f2985056 + checksum: 10/8a3d1854fdcccf0a4943ea7665bc6d5e0e557679b0a22db68db73f08b6e5e2497e1edb6314f82d965dea8de0fa439f2ec1a1484ffc5e08b15d2ed45b39d0fbfa languageName: node linkType: hard @@ -26564,7 +26564,7 @@ __metadata: "@metamask/message-manager": "npm:^12.0.0" "@metamask/message-signing-snap": "npm:^0.6.0" "@metamask/metamask-eth-abis": "npm:^3.1.1" - "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-5dfebad9" + "@metamask/multichain": "npm:@metamask-previews/multichain@2.1.0-preview-082735ba" "@metamask/multichain-transactions-controller": "npm:^0.0.1" "@metamask/name-controller": "npm:^8.0.0" "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A22.1.1#~/.yarn/patches/@metamask-network-controller-npm-22.1.1-09b6510f1e.patch" From e76189c60e65eb7e419dd7cddec72950a5daa39c Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Mon, 3 Feb 2025 11:16:42 -0800 Subject: [PATCH 11/13] add missing hook --- app/scripts/metamask-controller.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 4212057ac77b..87bd89dd83a2 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -1321,6 +1321,10 @@ export default class MetamaskController extends EventEmitter { this.controllerMessenger, 'MultichainRouter:isSupportedScope', ), + getNonEvmAccountAddresses: this.controllerMessenger.call.bind( + this.controllerMessenger, + 'MultichainRouter:getSupportedAccounts', + ), }), permissionSpecifications: { ...getPermissionSpecifications(), From ea57195016c5da0d97727a0e0695bf7ac529beda Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Mon, 3 Feb 2025 11:28:37 -0800 Subject: [PATCH 12/13] add comment about why we aren't filtering invalid non-evm accounts in the wallet_createSession handler --- .../handlers/wallet-createSession/handler.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts b/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts index ad861943f3bd..9009d5a57a9e 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts +++ b/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts @@ -182,6 +182,13 @@ async function walletCreateSessionHandler( supportedEthAccounts, ); + // Note that we do not verify non-evm accounts here. Instead we rely on + // the CAIP-25 caveat validator to throw an error about the requested + // accounts being invalid. Once the Approval UI supports displaying and selecting + // non-evm accounts and networks, we should add the non-evm account filtering + // logic to this handler so that unsupported/invalid non-evm accounts + // never make it into the approval request in the first place. + const { permissions: approvedPermissions } = await hooks.requestPermissionApprovalForOrigin({ [Caip25EndowmentPermissionName]: { From cf181f38f3993bacf12c6583b91a38b4df225bff Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Mon, 3 Feb 2025 14:45:36 -0800 Subject: [PATCH 13/13] fix handleNonEvmRequestForOrigin binding --- app/scripts/metamask-controller.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 3057ece5484a..bd58f9a3bb2e 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -6889,9 +6889,13 @@ export default class MetamaskController extends EventEmitter { this.controllerMessenger, 'MultichainRouter:isSupportedScope', ), - handleNonEvmRequest: this.controllerMessenger.call.bind( - this.controllerMessenger, + handleNonEvmRequestForOrigin: (params) => + this.controllerMessenger.call( 'MultichainRouter:handleRequest', + { + ...params, + origin, + } ), }), );