From e182773b9a2ad8ea92a0867752fde7a5365d91f4 Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Thu, 23 Oct 2025 16:25:08 -0700 Subject: [PATCH 01/10] WIP MetaMaskConnectProvider --- src/sdk/providers/MetaMaskConnectProvider.ts | 86 ++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/sdk/providers/MetaMaskConnectProvider.ts diff --git a/src/sdk/providers/MetaMaskConnectProvider.ts b/src/sdk/providers/MetaMaskConnectProvider.ts new file mode 100644 index 0000000..8ec2cd6 --- /dev/null +++ b/src/sdk/providers/MetaMaskConnectProvider.ts @@ -0,0 +1,86 @@ +import type { JsonRpcRequest } from '@metamask/utils'; + +import { Provider } from './Provider'; + +type NotificationCallback = (notification: any) => void; + +class MetaMaskConnectProvider implements Provider { + #mmConnect: MetamaskConnect | null; + #notificationCallbacks: Set = new Set(); + + constructor() { + this.#mmConnect = null; + this.#notificationCallbacks = new Set(); + } + + async connect(): Promise { + if (this.#mmConnect) { + this.disconnect(); + } + + await createMetamaskConnect({ + dapp: { + name: 'MultichainTest Dapp', + url: 'https://metamask.github.io/test-dapp-multichain/latest/', + }, + onNotification: (notification: any) => { + this.#notifyCallbacks(notification); + }, + }); + + return true; + } + + disconnect(): void { + if (this.#mmConnect !== null) { + this.#mmConnect.disconnect(); + this.#mmConnect = null; + } + } + + isConnected(): boolean { + return Boolean(this.#mmConnect); + } + + async request(request: JsonRpcRequest): Promise { + if (request.method === 'wallet_invokeMethod') { + return this.#mmConnect?.invokeMethod(request.params); + } + if (request.method === 'wallet_getSession') { + // handle this locally + } + if (request.method === 'wallet_revokeSession') { + // noop? + } + if (request.method === 'wallet_createSession') { + // unsure + } + } + + onNotification(callback: NotificationCallback): void { + this.#notificationCallbacks.add(callback); + } + + removeNotificationListener(callback: NotificationCallback): void { + this.#notificationCallbacks.delete(callback); + } + + removeAllNotificationListeners() { + this.#notificationCallbacks.forEach( + this.removeNotificationListener.bind(this), + ); + } + + #notifyCallbacks(notification: any): void { + this.#notificationCallbacks.forEach((callback) => { + try { + callback(notification); + } catch (error) { + console.error('Error in notification callback:', error); + } + }); + } + +} + +export default MetaMaskConnectProvider; From 36b291c1aa610f9856f6e54f2440d69764d02651 Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Fri, 24 Oct 2025 16:11:04 -0700 Subject: [PATCH 02/10] import actual packages --- package.json | 4 + src/sdk/SDK.ts | 5 + src/sdk/providers/MetaMaskConnectProvider.ts | 23 +- yarn.lock | 405 ++++++++++++++++++- 4 files changed, 427 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index efa405f..f0ff75a 100644 --- a/package.json +++ b/package.json @@ -102,5 +102,9 @@ "@solana/web3.js>rpc-websockets>bufferutil": false, "@solana/web3.js>rpc-websockets>utf-8-validate": false } + }, + "dependencies": { + "@metamask/connect": "^0.1.0", + "@metamask/connect-multichain": "^0.1.0" } } diff --git a/src/sdk/SDK.ts b/src/sdk/SDK.ts index 87bce3a..7ad03f3 100644 --- a/src/sdk/SDK.ts +++ b/src/sdk/SDK.ts @@ -1,6 +1,7 @@ import type { CaipAccountId, CaipChainId, Json } from '@metamask/utils'; import { parseCaipChainId, parseCaipAccountId } from '@metamask/utils'; +import MetaMaskConnectProvider from './providers/MetaMaskConnectProvider'; import type MetaMaskMultichainBaseProvider from './providers/MetaMaskMultichainBaseProvider'; import MetaMaskMultichainExternallyConnectableProvider from './providers/MetaMaskMultichainExternallyConnectableProvider'; import MetaMaskMultichainWindowPostMessageProvider from './providers/MetaMaskMultichainWindowPostMessageProvider'; @@ -113,6 +114,10 @@ export class SDK { if (extensionId === WINDOW_POST_MESSAGE_ID) { this.#provider = new MetaMaskMultichainWindowPostMessageProvider(); connected = await this.#provider.connect(); + } else if (extensionId === 'connect') { + this.#provider = + new MetaMaskConnectProvider() as unknown as MetaMaskMultichainBaseProvider; + connected = await this.#provider.connect(); } else { this.#provider = new MetaMaskMultichainExternallyConnectableProvider(); connected = await this.#provider.connect(extensionId); diff --git a/src/sdk/providers/MetaMaskConnectProvider.ts b/src/sdk/providers/MetaMaskConnectProvider.ts index 8ec2cd6..494f210 100644 --- a/src/sdk/providers/MetaMaskConnectProvider.ts +++ b/src/sdk/providers/MetaMaskConnectProvider.ts @@ -1,11 +1,13 @@ -import type { JsonRpcRequest } from '@metamask/utils'; +import type { MultichainCore } from '@metamask/connect-multichain'; +import { createMetamaskConnect } from '@metamask/connect-multichain'; -import { Provider } from './Provider'; +import type { Provider } from './Provider'; type NotificationCallback = (notification: any) => void; class MetaMaskConnectProvider implements Provider { - #mmConnect: MetamaskConnect | null; + #mmConnect: MultichainCore | null; + #notificationCallbacks: Set = new Set(); constructor() { @@ -18,16 +20,19 @@ class MetaMaskConnectProvider implements Provider { this.disconnect(); } - await createMetamaskConnect({ + this.#mmConnect = await createMetamaskConnect({ dapp: { name: 'MultichainTest Dapp', url: 'https://metamask.github.io/test-dapp-multichain/latest/', }, - onNotification: (notification: any) => { - this.#notifyCallbacks(notification); + transport: { + onNotification: (notification: any) => { + this.#notifyCallbacks(notification); + }, }, }); + return true; } @@ -42,7 +47,7 @@ class MetaMaskConnectProvider implements Provider { return Boolean(this.#mmConnect); } - async request(request: JsonRpcRequest): Promise { + async request(request: { method: string; params: any }): Promise { if (request.method === 'wallet_invokeMethod') { return this.#mmConnect?.invokeMethod(request.params); } @@ -53,8 +58,9 @@ class MetaMaskConnectProvider implements Provider { // noop? } if (request.method === 'wallet_createSession') { - // unsure + await this.#mmConnect?.connect(['eip155:1'], []); } + return Promise.resolve(null); } onNotification(callback: NotificationCallback): void { @@ -80,7 +86,6 @@ class MetaMaskConnectProvider implements Provider { } }); } - } export default MetaMaskConnectProvider; diff --git a/yarn.lock b/yarn.lock index 03e7d03..813f6e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1783,6 +1783,15 @@ __metadata: languageName: node linkType: hard +"@ecies/ciphers@npm:^0.2.4": + version: 0.2.4 + resolution: "@ecies/ciphers@npm:0.2.4" + peerDependencies: + "@noble/ciphers": ^1.0.0 + checksum: 10/6300075ffce01765ad0ddcc26ed6150301cd448bc79b7a046cbd659c4bd6e3a05f207df2a09396cdf529bcc6ab921b26cb50483703c57f80f2d8898c369284f3 + languageName: node + linkType: hard + "@es-joy/jsdoccomment@npm:~0.36.1": version: 0.36.1 resolution: "@es-joy/jsdoccomment@npm:0.36.1" @@ -2542,6 +2551,15 @@ __metadata: languageName: node linkType: hard +"@metamask/analytics@npm:^0.1.0": + version: 0.1.0 + resolution: "@metamask/analytics@npm:0.1.0" + dependencies: + openapi-fetch: "npm:^0.13.5" + checksum: 10/31b8c9b217d06543591ebb0d28d8c67262c0d38af55e08c244ef515f151497fb1a061c305b4ac4171c7167325bd7e4cd419a00c07673622582804bec26f51a4e + languageName: node + linkType: hard + "@metamask/api-specs@npm:^0.14.0": version: 0.14.0 resolution: "@metamask/api-specs@npm:0.14.0" @@ -2564,6 +2582,40 @@ __metadata: languageName: node linkType: hard +"@metamask/connect-multichain@npm:^0.1.0": + version: 0.1.0 + resolution: "@metamask/connect-multichain@npm:0.1.0" + dependencies: + "@metamask/analytics": "npm:^0.1.0" + "@metamask/mobile-wallet-protocol-core": "npm:^0.3.0" + "@metamask/mobile-wallet-protocol-dapp-client": "npm:^0.2.1" + "@metamask/multichain-api-client": "npm:^0.8.0" + "@metamask/multichain-ui": "npm:^0.1.0" + "@metamask/onboarding": "npm:^1.0.1" + "@metamask/utils": "npm:^11.8.1" + "@paulmillr/qr": "npm:^0.2.1" + bowser: "npm:^2.11.0" + cross-fetch: "npm:^4.1.0" + eciesjs: "npm:^0.4.15" + eventemitter3: "npm:^5.0.1" + pako: "npm:^2.1.0" + uuid: "npm:^11.1.0" + ws: "npm:^8.18.3" + peerDependencies: + "@react-native-async-storage/async-storage": ^1.23 + checksum: 10/796402213f789cf2f89715a9b777ed26a68c47666bbf39c73cc54e3d3cda0f95b52db5671706c8a14f08be47d9fcc11e94539868060988c2166b592db1012e2f + languageName: node + linkType: hard + +"@metamask/connect@npm:^0.1.0": + version: 0.1.0 + resolution: "@metamask/connect@npm:0.1.0" + dependencies: + "@metamask/connect-multichain": "npm:^0.1.0" + checksum: 10/a0fb40fc4e0658bacc6a2efe5530edb0d1e5f1ad8c01d0e8c791790301473faf2bc0ea5ccda9a342f0370f9d01a941d491ee59bad2e318d1ffd6999209595914 + languageName: node + linkType: hard + "@metamask/eslint-config-jest@npm:^12.1.0": version: 12.1.0 resolution: "@metamask/eslint-config-jest@npm:12.1.0" @@ -2614,6 +2666,65 @@ __metadata: languageName: node linkType: hard +"@metamask/mobile-wallet-protocol-core@npm:^0.2.0": + version: 0.2.0 + resolution: "@metamask/mobile-wallet-protocol-core@npm:0.2.0" + dependencies: + centrifuge: "npm:^5.3.5" + eventemitter3: "npm:^5.0.1" + uuid: "npm:^11.1.0" + checksum: 10/55bbdf85f6231b6f11a0156e0db878ebe33bb9e8aa13445d111853d153a85c0e7e621b05a74d76e58bba6c3c0c3d8961c2dad89393af1b0ddfb2f2b9c7694f07 + languageName: node + linkType: hard + +"@metamask/mobile-wallet-protocol-core@npm:^0.3.0": + version: 0.3.1 + resolution: "@metamask/mobile-wallet-protocol-core@npm:0.3.1" + dependencies: + centrifuge: "npm:^5.3.5" + eventemitter3: "npm:^5.0.1" + uuid: "npm:^11.1.0" + checksum: 10/2de5aab19913c31f6cfcd6dd97c8217207a511c20535fc2b44c91fdd4b553f63cb96d12bcfc248a9f1c357ddb1e29dd996752be89aa77a64229c52aba8d34625 + languageName: node + linkType: hard + +"@metamask/mobile-wallet-protocol-dapp-client@npm:^0.2.1": + version: 0.2.1 + resolution: "@metamask/mobile-wallet-protocol-dapp-client@npm:0.2.1" + dependencies: + "@metamask/mobile-wallet-protocol-core": "npm:^0.2.0" + "@metamask/utils": "npm:^9.1.0" + uuid: "npm:^11.1.0" + checksum: 10/9160a2d9026586718991ccaa7595a72090c3a24b1411887b79a43106dc8fbd0643d66c3f153fd649d15e72e79ef95fe22ae6cd50535948730d51e11a02dc1a62 + languageName: node + linkType: hard + +"@metamask/multichain-api-client@npm:^0.8.0": + version: 0.8.0 + resolution: "@metamask/multichain-api-client@npm:0.8.0" + checksum: 10/73a9cc74c9bc8d20423535a28f690818a82d81ad76077670a4968e6322b8364f70c3fab40558fae79028f9003766cd0eeaada2cefd39042a1df4d327a22cb2f8 + languageName: node + linkType: hard + +"@metamask/multichain-ui@npm:^0.1.0": + version: 0.1.0 + resolution: "@metamask/multichain-ui@npm:0.1.0" + dependencies: + "@paulmillr/qr": "npm:^0.2.1" + qr-code-styling: "npm:^1.9.2" + checksum: 10/7cec847cd3d1f9ed0143839a351ec854744252d98f58908388f2cf72b2e446f028e11da2878162efe6a8d5c0cb09b380934b3f1164dc9416de10df5765b1c419 + languageName: node + linkType: hard + +"@metamask/onboarding@npm:^1.0.1": + version: 1.0.1 + resolution: "@metamask/onboarding@npm:1.0.1" + dependencies: + bowser: "npm:^2.9.0" + checksum: 10/2aa288e58fc34cb4708e311fc08abd33a0d9bc67671610955a2bd8d43a16330261f1159174c365611e249751ec984da9a9cb963bb0a87b3a6945d7caa6cc8799 + languageName: node + linkType: hard + "@metamask/superstruct@npm:^3.1.0": version: 3.1.0 resolution: "@metamask/superstruct@npm:3.1.0" @@ -2629,6 +2740,8 @@ __metadata: "@lavamoat/preinstall-always-fail": "npm:^2.0.0" "@metamask/api-specs": "npm:^0.14.0" "@metamask/auto-changelog": "npm:^3.4.3" + "@metamask/connect": "npm:^0.1.0" + "@metamask/connect-multichain": "npm:^0.1.0" "@metamask/eslint-config": "npm:^12.2.0" "@metamask/eslint-config-jest": "npm:^12.1.0" "@metamask/eslint-config-nodejs": "npm:^12.1.0" @@ -2683,6 +2796,42 @@ __metadata: languageName: node linkType: hard +"@metamask/utils@npm:^11.8.1": + version: 11.8.1 + resolution: "@metamask/utils@npm:11.8.1" + dependencies: + "@ethereumjs/tx": "npm:^4.2.0" + "@metamask/superstruct": "npm:^3.1.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.3" + "@types/debug": "npm:^4.1.7" + "@types/lodash": "npm:^4.17.20" + debug: "npm:^4.3.4" + lodash: "npm:^4.17.21" + pony-cause: "npm:^2.1.10" + semver: "npm:^7.5.4" + uuid: "npm:^9.0.1" + checksum: 10/efd3aab7f86b4a74d396cf1d5fc76e748ff78906802fdc15ec9ce2d1a9bd6b035e8e036ea93eb6b9ea33782c70adb9000772eb7a5e0164e8e9e2ebb077dca3ab + languageName: node + linkType: hard + +"@metamask/utils@npm:^9.1.0": + version: 9.3.0 + resolution: "@metamask/utils@npm:9.3.0" + dependencies: + "@ethereumjs/tx": "npm:^4.2.0" + "@metamask/superstruct": "npm:^3.1.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.3" + "@types/debug": "npm:^4.1.7" + debug: "npm:^4.3.4" + pony-cause: "npm:^2.1.10" + semver: "npm:^7.5.4" + uuid: "npm:^9.0.1" + checksum: 10/ed6648cd973bbf3b4eb0e862903b795a99d27784c820e19f62f0bc0ddf353e98c2858d7e9aaebc0249a586391b344e35b9249d13c08e3ea0c74b23dc1c6b1558 + languageName: node + linkType: hard + "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1": version: 5.1.1-v1 resolution: "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1" @@ -2692,6 +2841,13 @@ __metadata: languageName: node linkType: hard +"@noble/ciphers@npm:^1.3.0": + version: 1.3.0 + resolution: "@noble/ciphers@npm:1.3.0" + checksum: 10/051660051e3e9e2ca5fb9dece2885532b56b7e62946f89afa7284a0fb8bc02e2bd1c06554dba68162ff42d295b54026456084198610f63c296873b2f1cd7a586 + languageName: node + linkType: hard + "@noble/curves@npm:1.4.2, @noble/curves@npm:~1.4.0": version: 1.4.2 resolution: "@noble/curves@npm:1.4.2" @@ -2710,6 +2866,15 @@ __metadata: languageName: node linkType: hard +"@noble/curves@npm:^1.9.7": + version: 1.9.7 + resolution: "@noble/curves@npm:1.9.7" + dependencies: + "@noble/hashes": "npm:1.8.0" + checksum: 10/3cfe2735ea94972988ca9e217e0ebb2044372a7160b2079bf885da789492a6291fc8bf76ca3d8bf8dee477847ee2d6fac267d1e6c4f555054059f5e8c4865d44 + languageName: node + linkType: hard + "@noble/hashes@npm:1.4.0, @noble/hashes@npm:~1.4.0": version: 1.4.0 resolution: "@noble/hashes@npm:1.4.0" @@ -2724,6 +2889,13 @@ __metadata: languageName: node linkType: hard +"@noble/hashes@npm:1.8.0, @noble/hashes@npm:^1.8.0": + version: 1.8.0 + resolution: "@noble/hashes@npm:1.8.0" + checksum: 10/474b7f56bc6fb2d5b3a42132561e221b0ea4f91e590f4655312ca13667840896b34195e2b53b7f097ec080a1fdd3b58d902c2a8d0fbdf51d2e238b53808a177e + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -2878,6 +3050,13 @@ __metadata: languageName: node linkType: hard +"@paulmillr/qr@npm:^0.2.1": + version: 0.2.1 + resolution: "@paulmillr/qr@npm:0.2.1" + checksum: 10/69ee9002124496c4c7ed31f376c6f4a8fa1e86d71a14b420b22133baeab416af1349ae173d93e73a9627c2d9813d0a4bc84a64efa4e125436909f7d6d1d39785 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -2922,6 +3101,79 @@ __metadata: languageName: node linkType: hard +"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/aspromise@npm:1.1.2" + checksum: 10/8a938d84fe4889411296db66b29287bd61ea3c14c2d23e7a8325f46a2b8ce899857c5f038d65d7641805e6c1d06b495525c7faf00c44f85a7ee6476649034969 + languageName: node + linkType: hard + +"@protobufjs/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/base64@npm:1.1.2" + checksum: 10/c71b100daeb3c9bdccab5cbc29495b906ba0ae22ceedc200e1ba49717d9c4ab15a6256839cebb6f9c6acae4ed7c25c67e0a95e734f612b258261d1a3098fe342 + languageName: node + linkType: hard + +"@protobufjs/codegen@npm:^2.0.4": + version: 2.0.4 + resolution: "@protobufjs/codegen@npm:2.0.4" + checksum: 10/c6ee5fa172a8464f5253174d3c2353ea520c2573ad7b6476983d9b1346f4d8f2b44aa29feb17a949b83c1816bc35286a5ea265ed9d8fdd2865acfa09668c0447 + languageName: node + linkType: hard + +"@protobufjs/eventemitter@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/eventemitter@npm:1.1.0" + checksum: 10/03af3e99f17ad421283d054c88a06a30a615922a817741b43ca1b13e7c6b37820a37f6eba9980fb5150c54dba6e26cb6f7b64a6f7d8afa83596fafb3afa218c3 + languageName: node + linkType: hard + +"@protobufjs/fetch@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/fetch@npm:1.1.0" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.1" + "@protobufjs/inquire": "npm:^1.1.0" + checksum: 10/67ae40572ad536e4ef94269199f252c024b66e3059850906bdaee161ca1d75c73d04d35cd56f147a8a5a079f5808e342b99e61942c1dae15604ff0600b09a958 + languageName: node + linkType: hard + +"@protobufjs/float@npm:^1.0.2": + version: 1.0.2 + resolution: "@protobufjs/float@npm:1.0.2" + checksum: 10/634c2c989da0ef2f4f19373d64187e2a79f598c5fb7991afb689d29a2ea17c14b796b29725945fa34b9493c17fb799e08ac0a7ccaae460ee1757d3083ed35187 + languageName: node + linkType: hard + +"@protobufjs/inquire@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/inquire@npm:1.1.0" + checksum: 10/c09efa34a5465cb120775e1a482136f2340a58b4abce7e93d72b8b5a9324a0e879275016ef9fcd73d72a4731639c54f2bb755bb82f916e4a78892d1d840bb3d2 + languageName: node + linkType: hard + +"@protobufjs/path@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/path@npm:1.1.2" + checksum: 10/bb709567935fd385a86ad1f575aea98131bbd719c743fb9b6edd6b47ede429ff71a801cecbd64fc72deebf4e08b8f1bd8062793178cdaed3713b8d15771f9b83 + languageName: node + linkType: hard + +"@protobufjs/pool@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/pool@npm:1.1.0" + checksum: 10/b9c7047647f6af28e92aac54f6f7c1f7ff31b201b4bfcc7a415b2861528854fce3ec666d7e7e10fd744da905f7d4aef2205bbcc8944ca0ca7a82e18134d00c46 + languageName: node + linkType: hard + +"@protobufjs/utf8@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/utf8@npm:1.1.0" + checksum: 10/131e289c57534c1d73a0e55782d6751dd821db1583cb2f7f7e017c9d6747addaebe79f28120b2e0185395d990aad347fb14ffa73ef4096fa38508d61a0e64602 + languageName: node + linkType: hard + "@rollup/plugin-babel@npm:^5.2.0": version: 5.3.1 resolution: "@rollup/plugin-babel@npm:5.3.1" @@ -3658,6 +3910,13 @@ __metadata: languageName: node linkType: hard +"@types/lodash@npm:^4.17.20": + version: 4.17.20 + resolution: "@types/lodash@npm:4.17.20" + checksum: 10/8cd8ad3bd78d2e06a93ae8d6c9907981d5673655fec7cb274a4d9a59549aab5bb5b3017361280773b8990ddfccf363e14d1b37c97af8a9fe363de677f9a61524 + languageName: node + linkType: hard + "@types/mime@npm:^1": version: 1.3.5 resolution: "@types/mime@npm:1.3.5" @@ -3697,6 +3956,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:>=13.7.0": + version: 24.9.1 + resolution: "@types/node@npm:24.9.1" + dependencies: + undici-types: "npm:~7.16.0" + checksum: 10/eacbd06621616825042428dd6105d0c2f86d67b5f05f99db9fa89fe1cc173d5e65e604a9a61f1ce52ad915d09f2119e7468816ca1a22bb7a3cf5f3c131413c86 + languageName: node + linkType: hard + "@types/node@npm:^12.12.54": version: 12.20.55 resolution: "@types/node@npm:12.20.55" @@ -5246,6 +5514,13 @@ __metadata: languageName: node linkType: hard +"bowser@npm:^2.11.0, bowser@npm:^2.9.0": + version: 2.12.1 + resolution: "bowser@npm:2.12.1" + checksum: 10/ccd8bcb31312a25e0740eb43b2388301d560af19213c8d795efe77e40860c3eb6a55ec5fde36b5e25d44f603204dc06af6c975edf9cc7f6b26a9865e22d53461 + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -5493,6 +5768,16 @@ __metadata: languageName: node linkType: hard +"centrifuge@npm:^5.3.5": + version: 5.5.2 + resolution: "centrifuge@npm:5.5.2" + dependencies: + events: "npm:^3.3.0" + protobufjs: "npm:^7.2.5" + checksum: 10/d48bff4fe5ab9a1dfe8f1b4100a197c1e90b929f15ba4a5ff5c191c5bbd5f103aa1fe46945338e3f854174c99a90ef94412f142d84410b4c28d309e7ce73ce69 + languageName: node + linkType: hard + "chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -5943,6 +6228,15 @@ __metadata: languageName: node linkType: hard +"cross-fetch@npm:^4.1.0": + version: 4.1.0 + resolution: "cross-fetch@npm:4.1.0" + dependencies: + node-fetch: "npm:^2.7.0" + checksum: 10/07624940607b64777d27ec9c668ddb6649e8c59ee0a5a10e63a51ce857e2bbb1294a45854a31c10eccb91b65909a5b199fcb0217339b44156f85900a7384f489 + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" @@ -6747,6 +7041,18 @@ __metadata: languageName: node linkType: hard +"eciesjs@npm:^0.4.15": + version: 0.4.16 + resolution: "eciesjs@npm:0.4.16" + dependencies: + "@ecies/ciphers": "npm:^0.2.4" + "@noble/ciphers": "npm:^1.3.0" + "@noble/curves": "npm:^1.9.7" + "@noble/hashes": "npm:^1.8.0" + checksum: 10/0b179dc8ad470b976edb1c7f59770c934a36854d22ccab979fea32ae559f017d843c468f8a551523877251e7340df1babef0777acebcf6518341337d8ed7bb94 + languageName: node + linkType: hard + "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -7676,7 +7982,7 @@ __metadata: languageName: node linkType: hard -"events@npm:^3.2.0": +"events@npm:^3.2.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" checksum: 10/a3d47e285e28d324d7180f1e493961a2bbb4cad6412090e4dec114f4db1f5b560c7696ee8e758f55e23913ede856e3689cd3aa9ae13c56b5d8314cd3b3ddd1be @@ -10925,6 +11231,13 @@ __metadata: languageName: node linkType: hard +"long@npm:^5.0.0": + version: 5.3.2 + resolution: "long@npm:5.3.2" + checksum: 10/b6b55ddae56fcce2864d37119d6b02fe28f6dd6d9e44fd22705f86a9254b9321bd69e9ffe35263b4846d54aba197c64882adcb8c543f2383c1e41284b321ea64 + languageName: node + linkType: hard + "loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -11842,6 +12155,22 @@ __metadata: languageName: node linkType: hard +"openapi-fetch@npm:^0.13.5": + version: 0.13.8 + resolution: "openapi-fetch@npm:0.13.8" + dependencies: + openapi-typescript-helpers: "npm:^0.0.15" + checksum: 10/fed630452ac2d6abc680402651d848b7377b651164ca2be61a8c5e1fc89e41b09c928ba9dc92cf7c7ad2d400b3fbe5af380165303f293501dc08cefa4c0f92fd + languageName: node + linkType: hard + +"openapi-typescript-helpers@npm:^0.0.15": + version: 0.0.15 + resolution: "openapi-typescript-helpers@npm:0.0.15" + checksum: 10/63f8f0b8464aed3e5c6910428bd14839bd5c1dd6ddf841bcea9d5f536a6e03e942a028202920da1a8b1ed9e4304c6fca14943d01a8adff2942d1254a229b8c70 + languageName: node + linkType: hard + "optionator@npm:^0.8.1": version: 0.8.3 resolution: "optionator@npm:0.8.3" @@ -11941,6 +12270,13 @@ __metadata: languageName: node linkType: hard +"pako@npm:^2.1.0": + version: 2.1.0 + resolution: "pako@npm:2.1.0" + checksum: 10/38a04991d0ec4f4b92794a68b8c92bf7340692c5d980255c92148da96eb3e550df7a86a7128b5ac0c65ecddfe5ef3bbe9c6dab13e1bc315086e759b18f7c1401 + languageName: node + linkType: hard + "param-case@npm:^3.0.4": version: 3.0.4 resolution: "param-case@npm:3.0.4" @@ -13144,6 +13480,26 @@ __metadata: languageName: node linkType: hard +"protobufjs@npm:^7.2.5": + version: 7.5.4 + resolution: "protobufjs@npm:7.5.4" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.2" + "@protobufjs/base64": "npm:^1.1.2" + "@protobufjs/codegen": "npm:^2.0.4" + "@protobufjs/eventemitter": "npm:^1.1.0" + "@protobufjs/fetch": "npm:^1.1.0" + "@protobufjs/float": "npm:^1.0.2" + "@protobufjs/inquire": "npm:^1.1.0" + "@protobufjs/path": "npm:^1.1.2" + "@protobufjs/pool": "npm:^1.1.0" + "@protobufjs/utf8": "npm:^1.1.0" + "@types/node": "npm:>=13.7.0" + long: "npm:^5.0.0" + checksum: 10/88d677bb6f11a2ecec63fdd053dfe6d31120844d04e865efa9c8fbe0674cd077d6624ecfdf014018a20dcb114ae2a59c1b21966dd8073e920650c71370966439 + languageName: node + linkType: hard + "proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" @@ -13175,6 +13531,22 @@ __metadata: languageName: node linkType: hard +"qr-code-styling@npm:^1.9.2": + version: 1.9.2 + resolution: "qr-code-styling@npm:1.9.2" + dependencies: + qrcode-generator: "npm:^1.4.4" + checksum: 10/0b94629511935adaf1f777df96e486fcf897e3a632fe4d3259b58405fd98ea61635694ae08eebd4efab81e2e2e68f4ee6fde095018c7b472b5063ce0967519d2 + languageName: node + linkType: hard + +"qrcode-generator@npm:^1.4.4": + version: 1.5.2 + resolution: "qrcode-generator@npm:1.5.2" + checksum: 10/79a8d466227922cd066364a5d0e58b78f45051463594159f95987f7e8925d6e2c67ec776d38eaeda74d3e4d95ea79c74c4261b6bc19790f55b3d562888765d71 + languageName: node + linkType: hard + "qs@npm:6.13.0": version: 6.13.0 resolution: "qs@npm:6.13.0" @@ -15398,6 +15770,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~7.16.0": + version: 7.16.0 + resolution: "undici-types@npm:7.16.0" + checksum: 10/db43439f69c2d94cc29f75cbfe9de86df87061d6b0c577ebe9bb3255f49b22c50162a7d7eb413b0458b6510b8ca299ac7cff38c3a29fbd31af9f504bcf7fbc0d + languageName: node + linkType: hard + "unicode-canonical-property-names-ecmascript@npm:^2.0.0": version: 2.0.1 resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.1" @@ -15585,6 +15964,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^11.1.0": + version: 11.1.0 + resolution: "uuid@npm:11.1.0" + bin: + uuid: dist/esm/bin/uuid + checksum: 10/d2da43b49b154d154574891ced66d0c83fc70caaad87e043400cf644423b067542d6f3eb641b7c819224a7cd3b4c2f21906acbedd6ec9c6a05887aa9115a9cf5 + languageName: node + linkType: hard + "uuid@npm:^8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" @@ -16345,6 +16733,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.18.3": + version: 8.18.3 + resolution: "ws@npm:8.18.3" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10/725964438d752f0ab0de582cd48d6eeada58d1511c3f613485b5598a83680bedac6187c765b0fe082e2d8cc4341fc57707c813ae780feee82d0c5efe6a4c61b6 + languageName: node + linkType: hard + "xml-name-validator@npm:^3.0.0": version: 3.0.0 resolution: "xml-name-validator@npm:3.0.0" From 1a133d131c6f225ba311efaa16ccb14d06df67a3 Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Mon, 27 Oct 2025 10:24:27 -0700 Subject: [PATCH 03/10] move dep into devDeps --- package.json | 5 +---- src/sdk/providers/MetaMaskConnectProvider.ts | 1 - yarn.lock | 10 ---------- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/package.json b/package.json index f0ff75a..88b85c3 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "@lavamoat/preinstall-always-fail": "^2.0.0", "@metamask/api-specs": "^0.14.0", "@metamask/auto-changelog": "^3.4.3", + "@metamask/connect-multichain": "^0.1.0", "@metamask/eslint-config": "^12.2.0", "@metamask/eslint-config-jest": "^12.1.0", "@metamask/eslint-config-nodejs": "^12.1.0", @@ -102,9 +103,5 @@ "@solana/web3.js>rpc-websockets>bufferutil": false, "@solana/web3.js>rpc-websockets>utf-8-validate": false } - }, - "dependencies": { - "@metamask/connect": "^0.1.0", - "@metamask/connect-multichain": "^0.1.0" } } diff --git a/src/sdk/providers/MetaMaskConnectProvider.ts b/src/sdk/providers/MetaMaskConnectProvider.ts index 494f210..eeca790 100644 --- a/src/sdk/providers/MetaMaskConnectProvider.ts +++ b/src/sdk/providers/MetaMaskConnectProvider.ts @@ -32,7 +32,6 @@ class MetaMaskConnectProvider implements Provider { }, }); - return true; } diff --git a/yarn.lock b/yarn.lock index 813f6e9..6afc0bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2607,15 +2607,6 @@ __metadata: languageName: node linkType: hard -"@metamask/connect@npm:^0.1.0": - version: 0.1.0 - resolution: "@metamask/connect@npm:0.1.0" - dependencies: - "@metamask/connect-multichain": "npm:^0.1.0" - checksum: 10/a0fb40fc4e0658bacc6a2efe5530edb0d1e5f1ad8c01d0e8c791790301473faf2bc0ea5ccda9a342f0370f9d01a941d491ee59bad2e318d1ffd6999209595914 - languageName: node - linkType: hard - "@metamask/eslint-config-jest@npm:^12.1.0": version: 12.1.0 resolution: "@metamask/eslint-config-jest@npm:12.1.0" @@ -2740,7 +2731,6 @@ __metadata: "@lavamoat/preinstall-always-fail": "npm:^2.0.0" "@metamask/api-specs": "npm:^0.14.0" "@metamask/auto-changelog": "npm:^3.4.3" - "@metamask/connect": "npm:^0.1.0" "@metamask/connect-multichain": "npm:^0.1.0" "@metamask/eslint-config": "npm:^12.2.0" "@metamask/eslint-config-jest": "npm:^12.1.0" From b58513658bdb241282e5ccfa97d5105739060271 Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Mon, 27 Oct 2025 14:01:40 -0700 Subject: [PATCH 04/10] use @metamask/mobile-wallet-protocol-dapp-client 0.2.2 --- package.json | 3 +- yarn.lock | 97 ++++++++++------------------------------------------ 2 files changed, 21 insertions(+), 79 deletions(-) diff --git a/package.json b/package.json index 88b85c3..5d5e4ca 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,8 @@ "react-scripts>react-app-polyfill>core-js": false, "@solana/web3.js>bigint-buffer": false, "@solana/web3.js>rpc-websockets>bufferutil": false, - "@solana/web3.js>rpc-websockets>utf-8-validate": false + "@solana/web3.js>rpc-websockets>utf-8-validate": false, + "@metamask/connect-multichain>@metamask/mobile-wallet-protocol-core>centrifuge>protobufjs": false } } } diff --git a/yarn.lock b/yarn.lock index 6afc0bc..6c7baee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2657,18 +2657,7 @@ __metadata: languageName: node linkType: hard -"@metamask/mobile-wallet-protocol-core@npm:^0.2.0": - version: 0.2.0 - resolution: "@metamask/mobile-wallet-protocol-core@npm:0.2.0" - dependencies: - centrifuge: "npm:^5.3.5" - eventemitter3: "npm:^5.0.1" - uuid: "npm:^11.1.0" - checksum: 10/55bbdf85f6231b6f11a0156e0db878ebe33bb9e8aa13445d111853d153a85c0e7e621b05a74d76e58bba6c3c0c3d8961c2dad89393af1b0ddfb2f2b9c7694f07 - languageName: node - linkType: hard - -"@metamask/mobile-wallet-protocol-core@npm:^0.3.0": +"@metamask/mobile-wallet-protocol-core@npm:^0.3.0, @metamask/mobile-wallet-protocol-core@npm:^0.3.1": version: 0.3.1 resolution: "@metamask/mobile-wallet-protocol-core@npm:0.3.1" dependencies: @@ -2680,13 +2669,13 @@ __metadata: linkType: hard "@metamask/mobile-wallet-protocol-dapp-client@npm:^0.2.1": - version: 0.2.1 - resolution: "@metamask/mobile-wallet-protocol-dapp-client@npm:0.2.1" + version: 0.2.2 + resolution: "@metamask/mobile-wallet-protocol-dapp-client@npm:0.2.2" dependencies: - "@metamask/mobile-wallet-protocol-core": "npm:^0.2.0" + "@metamask/mobile-wallet-protocol-core": "npm:^0.3.1" "@metamask/utils": "npm:^9.1.0" uuid: "npm:^11.1.0" - checksum: 10/9160a2d9026586718991ccaa7595a72090c3a24b1411887b79a43106dc8fbd0643d66c3f153fd649d15e72e79ef95fe22ae6cd50535948730d51e11a02dc1a62 + checksum: 10/4a2186e6b6e4fcc96472da2dfe98026ec2fbfe01e2b895dbb0ce0098a789e4948908d46bace9514fd56c8cb80a3afd033b2e71300c8291ff9fd9d6fd7103dca4 languageName: node linkType: hard @@ -2769,24 +2758,7 @@ __metadata: languageName: unknown linkType: soft -"@metamask/utils@npm:^11.0.0": - version: 11.3.0 - resolution: "@metamask/utils@npm:11.3.0" - dependencies: - "@ethereumjs/tx": "npm:^4.2.0" - "@metamask/superstruct": "npm:^3.1.0" - "@noble/hashes": "npm:^1.3.1" - "@scure/base": "npm:^1.1.3" - "@types/debug": "npm:^4.1.7" - debug: "npm:^4.3.4" - pony-cause: "npm:^2.1.10" - semver: "npm:^7.5.4" - uuid: "npm:^9.0.1" - checksum: 10/178367aaf608339cd7d6f9cb97e1cc01b58b03c55c0017e83ab8e08e66bcf061ee2f0dd867d4ed2a916cc03672f8dd0bb04b9ff79a0b43657e7d76bdbb2e72f2 - languageName: node - linkType: hard - -"@metamask/utils@npm:^11.8.1": +"@metamask/utils@npm:^11.0.0, @metamask/utils@npm:^11.8.1": version: 11.8.1 resolution: "@metamask/utils@npm:11.8.1" dependencies: @@ -2847,16 +2819,7 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:^1.4.2": - version: 1.8.1 - resolution: "@noble/curves@npm:1.8.1" - dependencies: - "@noble/hashes": "npm:1.7.1" - checksum: 10/e861db372cc0734b02a4c61c0f5a6688d4a7555edca3d8a9e7c846c9aa103ca52d3c3818e8bc333a1a95b5be7f370ff344668d5d759471b11c2d14c7f24b3984 - languageName: node - linkType: hard - -"@noble/curves@npm:^1.9.7": +"@noble/curves@npm:^1.4.2, @noble/curves@npm:^1.9.7": version: 1.9.7 resolution: "@noble/curves@npm:1.9.7" dependencies: @@ -2872,14 +2835,7 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.7.1, @noble/hashes@npm:^1.3.1, @noble/hashes@npm:^1.4.0": - version: 1.7.1 - resolution: "@noble/hashes@npm:1.7.1" - checksum: 10/ca3120da0c3e7881d6a481e9667465cc9ebbee1329124fb0de442e56d63fef9870f8cc96f264ebdb18096e0e36cebc0e6e979a872d545deb0a6fed9353f17e05 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.8.0, @noble/hashes@npm:^1.8.0": +"@noble/hashes@npm:1.8.0, @noble/hashes@npm:^1.3.1, @noble/hashes@npm:^1.4.0, @noble/hashes@npm:^1.8.0": version: 1.8.0 resolution: "@noble/hashes@npm:1.8.0" checksum: 10/474b7f56bc6fb2d5b3a42132561e221b0ea4f91e590f4655312ca13667840896b34195e2b53b7f097ec080a1fdd3b58d902c2a8d0fbdf51d2e238b53808a177e @@ -3937,16 +3893,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^18.18": - version: 18.19.34 - resolution: "@types/node@npm:18.19.34" - dependencies: - undici-types: "npm:~5.26.4" - checksum: 10/5c8daed0c672e824c36d31312377fc4dddf3e91006fadad719527bb2bd710d4207193c1c7034da9d2d6cbc03da89d3693c86207f751540c18a7d38802040fbd9 - languageName: node - linkType: hard - -"@types/node@npm:>=13.7.0": +"@types/node@npm:*, @types/node@npm:>=13.7.0": version: 24.9.1 resolution: "@types/node@npm:24.9.1" dependencies: @@ -3962,6 +3909,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^18.18": + version: 18.19.34 + resolution: "@types/node@npm:18.19.34" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 10/5c8daed0c672e824c36d31312377fc4dddf3e91006fadad719527bb2bd710d4207193c1c7034da9d2d6cbc03da89d3693c86207f751540c18a7d38802040fbd9 + languageName: node + linkType: hard + "@types/parse-json@npm:^4.0.0": version: 4.0.0 resolution: "@types/parse-json@npm:4.0.0" @@ -16708,22 +16664,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.13.0, ws@npm:^8.5.0": - version: 8.18.1 - resolution: "ws@npm:8.18.1" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10/3f38e9594f2af5b6324138e86b74df7d77bbb8e310bf8188679dd80bac0d1f47e51536a1923ac3365f31f3d8b25ea0b03e4ade466aa8292a86cd5defca64b19b - languageName: node - linkType: hard - -"ws@npm:^8.18.3": +"ws@npm:^8.13.0, ws@npm:^8.18.3, ws@npm:^8.5.0": version: 8.18.3 resolution: "ws@npm:8.18.3" peerDependencies: From 814600a653081d9d7a7c16f3d950ff342b88d40f Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Mon, 27 Oct 2025 15:49:45 -0700 Subject: [PATCH 05/10] WIP connection mostly working --- src/sdk/providers/MetaMaskConnectProvider.ts | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/sdk/providers/MetaMaskConnectProvider.ts b/src/sdk/providers/MetaMaskConnectProvider.ts index eeca790..b1299fb 100644 --- a/src/sdk/providers/MetaMaskConnectProvider.ts +++ b/src/sdk/providers/MetaMaskConnectProvider.ts @@ -1,4 +1,4 @@ -import type { MultichainCore } from '@metamask/connect-multichain'; +import type { MultichainCore, Scope } from '@metamask/connect-multichain'; import { createMetamaskConnect } from '@metamask/connect-multichain'; import type { Provider } from './Provider'; @@ -27,17 +27,24 @@ class MetaMaskConnectProvider implements Provider { }, transport: { onNotification: (notification: any) => { + console.log('notification', notification); this.#notifyCallbacks(notification); }, }, + ui: { + preferDesktop: false, + preferExtension: false, + }, }); + await this.#mmConnect?.connect(['eip155:1'], []); + return true; } disconnect(): void { if (this.#mmConnect !== null) { - this.#mmConnect.disconnect(); + this.#mmConnect.disconnect().catch(console.error); this.#mmConnect = null; } } @@ -54,10 +61,14 @@ class MetaMaskConnectProvider implements Provider { // handle this locally } if (request.method === 'wallet_revokeSession') { - // noop? + this.disconnect(); } if (request.method === 'wallet_createSession') { - await this.#mmConnect?.connect(['eip155:1'], []); + const scopes = Object.keys({ + ...request.params.optionalScopes, + ...request.params.requiredScopes, + }); + await this.#mmConnect?.connect(scopes as unknown as Scope[], []); } return Promise.resolve(null); } From bb1b39bd5b75a723b8ea18764bda40f921eeec86 Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Tue, 28 Oct 2025 10:48:40 -0700 Subject: [PATCH 06/10] pass scopes and accounts in wallet_createSession --- src/sdk/providers/MetaMaskConnectProvider.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/sdk/providers/MetaMaskConnectProvider.ts b/src/sdk/providers/MetaMaskConnectProvider.ts index b1299fb..73efaa9 100644 --- a/src/sdk/providers/MetaMaskConnectProvider.ts +++ b/src/sdk/providers/MetaMaskConnectProvider.ts @@ -64,11 +64,17 @@ class MetaMaskConnectProvider implements Provider { this.disconnect(); } if (request.method === 'wallet_createSession') { - const scopes = Object.keys({ + const requestedScopes = Object.keys({ ...request.params.optionalScopes, ...request.params.requiredScopes, + }) as unknown as Scope[]; + + const requestedAccounts = new Set(); + Object.values(request.params.optionalScopes).forEach((scopeObject) => { + const {accounts} = scopeObject as { accounts: CaipAccountId[] }; + accounts.forEach(requestedAccounts.add) }); - await this.#mmConnect?.connect(scopes as unknown as Scope[], []); + await this.#mmConnect?.connect(requestedScopes, Array.from(requestedAccounts)); } return Promise.resolve(null); } From 7277577822cfcbdef19da836e1f8923945529400 Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Tue, 28 Oct 2025 10:48:56 -0700 Subject: [PATCH 07/10] track currentSession value from sessionChanged --- src/sdk/providers/MetaMaskConnectProvider.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/sdk/providers/MetaMaskConnectProvider.ts b/src/sdk/providers/MetaMaskConnectProvider.ts index 73efaa9..6fa2a13 100644 --- a/src/sdk/providers/MetaMaskConnectProvider.ts +++ b/src/sdk/providers/MetaMaskConnectProvider.ts @@ -2,18 +2,14 @@ import type { MultichainCore, Scope } from '@metamask/connect-multichain'; import { createMetamaskConnect } from '@metamask/connect-multichain'; import type { Provider } from './Provider'; +import { CaipAccountId } from '@metamask/utils'; type NotificationCallback = (notification: any) => void; class MetaMaskConnectProvider implements Provider { - #mmConnect: MultichainCore | null; - + #mmConnect: MultichainCore | null = null; #notificationCallbacks: Set = new Set(); - - constructor() { - this.#mmConnect = null; - this.#notificationCallbacks = new Set(); - } + #currnetSession: unknown = {"sessionScopes": {}}; async connect(): Promise { if (this.#mmConnect) { @@ -27,7 +23,9 @@ class MetaMaskConnectProvider implements Provider { }, transport: { onNotification: (notification: any) => { - console.log('notification', notification); + if (notification.method === 'wallet_sessionChanged') { + this.#currnetSession = notification.params; + } this.#notifyCallbacks(notification); }, }, @@ -58,7 +56,7 @@ class MetaMaskConnectProvider implements Provider { return this.#mmConnect?.invokeMethod(request.params); } if (request.method === 'wallet_getSession') { - // handle this locally + return this.#currnetSession; } if (request.method === 'wallet_revokeSession') { this.disconnect(); From dbde24601c6d0b30088c565832d7ee4d9157aa89 Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Tue, 28 Oct 2025 11:04:14 -0700 Subject: [PATCH 08/10] typo --- src/sdk/providers/MetaMaskConnectProvider.ts | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/sdk/providers/MetaMaskConnectProvider.ts b/src/sdk/providers/MetaMaskConnectProvider.ts index 6fa2a13..a35d84f 100644 --- a/src/sdk/providers/MetaMaskConnectProvider.ts +++ b/src/sdk/providers/MetaMaskConnectProvider.ts @@ -1,15 +1,17 @@ import type { MultichainCore, Scope } from '@metamask/connect-multichain'; import { createMetamaskConnect } from '@metamask/connect-multichain'; +import type { CaipAccountId } from '@metamask/utils'; import type { Provider } from './Provider'; -import { CaipAccountId } from '@metamask/utils'; type NotificationCallback = (notification: any) => void; class MetaMaskConnectProvider implements Provider { #mmConnect: MultichainCore | null = null; + #notificationCallbacks: Set = new Set(); - #currnetSession: unknown = {"sessionScopes": {}}; + + #walletSession: unknown = { sessionScopes: {} }; async connect(): Promise { if (this.#mmConnect) { @@ -24,7 +26,7 @@ class MetaMaskConnectProvider implements Provider { transport: { onNotification: (notification: any) => { if (notification.method === 'wallet_sessionChanged') { - this.#currnetSession = notification.params; + this.#walletSession = notification.params; } this.#notifyCallbacks(notification); }, @@ -56,7 +58,7 @@ class MetaMaskConnectProvider implements Provider { return this.#mmConnect?.invokeMethod(request.params); } if (request.method === 'wallet_getSession') { - return this.#currnetSession; + return this.#walletSession; } if (request.method === 'wallet_revokeSession') { this.disconnect(); @@ -69,10 +71,14 @@ class MetaMaskConnectProvider implements Provider { const requestedAccounts = new Set(); Object.values(request.params.optionalScopes).forEach((scopeObject) => { - const {accounts} = scopeObject as { accounts: CaipAccountId[] }; - accounts.forEach(requestedAccounts.add) + const { accounts } = scopeObject as { accounts: CaipAccountId[] }; + accounts.forEach((account) => requestedAccounts.add(account)); }); - await this.#mmConnect?.connect(requestedScopes, Array.from(requestedAccounts)); + await this.#mmConnect?.connect( + requestedScopes, + Array.from(requestedAccounts), + ); + return this.#walletSession; } return Promise.resolve(null); } From 1e97a5c15d9ef60e83aa97d7dc98230cc7d95bdf Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Tue, 28 Oct 2025 11:18:32 -0700 Subject: [PATCH 09/10] Add MM Connect button --- src/App.tsx | 14 +++++++++++++- src/sdk/SDK.ts | 3 ++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index c3f5dcc..4295f7c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -31,7 +31,7 @@ import { } from './helpers/MethodInvocationHelpers'; import { generateSolanaMethodExamples } from './helpers/solana-method-signatures'; import { useSDK } from './sdk'; -import { WINDOW_POST_MESSAGE_ID } from './sdk/SDK'; +import { MM_CONNECT_ID, WINDOW_POST_MESSAGE_ID } from './sdk/SDK'; function App() { const [caipAccountIds, setCaipAccountIds] = useState(['']); @@ -857,6 +857,18 @@ function App() { > Auto Connect via postMessage +
diff --git a/src/sdk/SDK.ts b/src/sdk/SDK.ts index 7ad03f3..8900f31 100644 --- a/src/sdk/SDK.ts +++ b/src/sdk/SDK.ts @@ -6,6 +6,7 @@ import type MetaMaskMultichainBaseProvider from './providers/MetaMaskMultichainB import MetaMaskMultichainExternallyConnectableProvider from './providers/MetaMaskMultichainExternallyConnectableProvider'; import MetaMaskMultichainWindowPostMessageProvider from './providers/MetaMaskMultichainWindowPostMessageProvider'; +export const MM_CONNECT_ID = 'mm-connect'; export const WINDOW_POST_MESSAGE_ID = 'window.postMessage'; export const METAMASK_PROD_CHROME_ID = 'nkbihfbeogaeaoehlefnkodbefgpgknn'; @@ -114,7 +115,7 @@ export class SDK { if (extensionId === WINDOW_POST_MESSAGE_ID) { this.#provider = new MetaMaskMultichainWindowPostMessageProvider(); connected = await this.#provider.connect(); - } else if (extensionId === 'connect') { + } else if (extensionId === MM_CONNECT_ID) { this.#provider = new MetaMaskConnectProvider() as unknown as MetaMaskMultichainBaseProvider; connected = await this.#provider.connect(); From 62c642adbc3cbca3afadedcdd7afee56c65afe66 Mon Sep 17 00:00:00 2001 From: Jiexi Luan Date: Wed, 29 Oct 2025 09:53:14 -0700 Subject: [PATCH 10/10] dedupe --- yarn.lock | 37 +++++++++++-------------------------- 1 file changed, 11 insertions(+), 26 deletions(-) diff --git a/yarn.lock b/yarn.lock index d86a340..97a1e65 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3567,16 +3567,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^18.18": - version: 18.19.34 - resolution: "@types/node@npm:18.19.34" - dependencies: - undici-types: "npm:~5.26.4" - checksum: 10/5c8daed0c672e824c36d31312377fc4dddf3e91006fadad719527bb2bd710d4207193c1c7034da9d2d6cbc03da89d3693c86207f751540c18a7d38802040fbd9 - languageName: node - linkType: hard - -"@types/node@npm:>=13.7.0": +"@types/node@npm:*, @types/node@npm:>=13.7.0": version: 24.9.1 resolution: "@types/node@npm:24.9.1" dependencies: @@ -3592,6 +3583,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^18.18": + version: 18.19.34 + resolution: "@types/node@npm:18.19.34" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 10/5c8daed0c672e824c36d31312377fc4dddf3e91006fadad719527bb2bd710d4207193c1c7034da9d2d6cbc03da89d3693c86207f751540c18a7d38802040fbd9 + languageName: node + linkType: hard + "@types/parse-json@npm:^4.0.0": version: 4.0.0 resolution: "@types/parse-json@npm:4.0.0" @@ -15616,22 +15616,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.13.0, ws@npm:^8.5.0": - version: 8.18.1 - resolution: "ws@npm:8.18.1" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10/3f38e9594f2af5b6324138e86b74df7d77bbb8e310bf8188679dd80bac0d1f47e51536a1923ac3365f31f3d8b25ea0b03e4ade466aa8292a86cd5defca64b19b - languageName: node - linkType: hard - -"ws@npm:^8.18.3": +"ws@npm:^8.13.0, ws@npm:^8.18.3, ws@npm:^8.5.0": version: 8.18.3 resolution: "ws@npm:8.18.3" peerDependencies: