@metamask/connect-multichain 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/README.md +409 -3
  3. package/dist/browser/es/connect-multichain.d.mts +6 -5
  4. package/dist/browser/es/connect-multichain.mjs +311 -226
  5. package/dist/browser/es/connect-multichain.mjs.map +1 -1
  6. package/dist/browser/es/metafile-esm.json +1 -1
  7. package/dist/browser/iife/connect-multichain.d.ts +6 -5
  8. package/dist/browser/iife/connect-multichain.js +24212 -24110
  9. package/dist/browser/iife/connect-multichain.js.map +1 -1
  10. package/dist/browser/iife/metafile-iife.json +1 -1
  11. package/dist/browser/umd/connect-multichain.d.ts +6 -5
  12. package/dist/browser/umd/connect-multichain.js +312 -227
  13. package/dist/browser/umd/connect-multichain.js.map +1 -1
  14. package/dist/browser/umd/metafile-cjs.json +1 -1
  15. package/dist/node/cjs/connect-multichain.d.ts +6 -5
  16. package/dist/node/cjs/connect-multichain.js +314 -230
  17. package/dist/node/cjs/connect-multichain.js.map +1 -1
  18. package/dist/node/cjs/metafile-cjs.json +1 -1
  19. package/dist/node/es/connect-multichain.d.mts +6 -5
  20. package/dist/node/es/connect-multichain.mjs +314 -228
  21. package/dist/node/es/connect-multichain.mjs.map +1 -1
  22. package/dist/node/es/metafile-esm.json +1 -1
  23. package/dist/react-native/es/connect-multichain.d.mts +6 -5
  24. package/dist/react-native/es/connect-multichain.mjs +311 -226
  25. package/dist/react-native/es/connect-multichain.mjs.map +1 -1
  26. package/dist/react-native/es/metafile-esm.json +1 -1
  27. package/dist/src/domain/logger/index.d.ts +1 -1
  28. package/dist/src/domain/logger/index.d.ts.map +1 -1
  29. package/dist/src/domain/logger/index.js.map +1 -1
  30. package/dist/src/domain/multichain/api/constants.js.map +1 -1
  31. package/dist/src/domain/multichain/api/types.d.ts +1 -1
  32. package/dist/src/domain/multichain/api/types.d.ts.map +1 -1
  33. package/dist/src/domain/multichain/index.d.ts.map +1 -1
  34. package/dist/src/domain/multichain/index.js.map +1 -1
  35. package/dist/src/domain/multichain/types.d.ts +2 -0
  36. package/dist/src/domain/multichain/types.d.ts.map +1 -1
  37. package/dist/src/domain/platform/index.d.ts.map +1 -1
  38. package/dist/src/domain/platform/index.js +1 -0
  39. package/dist/src/domain/platform/index.js.map +1 -1
  40. package/dist/src/index.browser.d.ts.map +1 -1
  41. package/dist/src/index.browser.js +9 -4
  42. package/dist/src/index.browser.js.map +1 -1
  43. package/dist/src/index.native.d.ts.map +1 -1
  44. package/dist/src/index.native.js +9 -4
  45. package/dist/src/index.native.js.map +1 -1
  46. package/dist/src/index.node.d.ts.map +1 -1
  47. package/dist/src/index.node.js +8 -4
  48. package/dist/src/index.node.js.map +1 -1
  49. package/dist/src/multichain/index.d.ts +1 -1
  50. package/dist/src/multichain/index.d.ts.map +1 -1
  51. package/dist/src/multichain/index.js +37 -10
  52. package/dist/src/multichain/index.js.map +1 -1
  53. package/dist/src/multichain/rpc/handlers/rpcClient.d.ts +9 -2
  54. package/dist/src/multichain/rpc/handlers/rpcClient.d.ts.map +1 -1
  55. package/dist/src/multichain/rpc/handlers/rpcClient.js +13 -3
  56. package/dist/src/multichain/rpc/handlers/rpcClient.js.map +1 -1
  57. package/dist/src/multichain/rpc/requestRouter.d.ts +14 -1
  58. package/dist/src/multichain/rpc/requestRouter.d.ts.map +1 -1
  59. package/dist/src/multichain/rpc/requestRouter.js +27 -5
  60. package/dist/src/multichain/rpc/requestRouter.js.map +1 -1
  61. package/dist/src/multichain/transports/default/index.d.ts +2 -2
  62. package/dist/src/multichain/transports/default/index.d.ts.map +1 -1
  63. package/dist/src/multichain/transports/default/index.js +14 -17
  64. package/dist/src/multichain/transports/default/index.js.map +1 -1
  65. package/dist/src/multichain/transports/multichainApiClientWrapper/index.d.ts +0 -2
  66. package/dist/src/multichain/transports/multichainApiClientWrapper/index.d.ts.map +1 -1
  67. package/dist/src/multichain/transports/multichainApiClientWrapper/index.js +18 -11
  68. package/dist/src/multichain/transports/multichainApiClientWrapper/index.js.map +1 -1
  69. package/dist/src/multichain/transports/mwp/KeyManager.d.ts.map +1 -1
  70. package/dist/src/multichain/transports/mwp/KeyManager.js.map +1 -1
  71. package/dist/src/multichain/transports/mwp/index.d.ts +1 -1
  72. package/dist/src/multichain/transports/mwp/index.d.ts.map +1 -1
  73. package/dist/src/multichain/transports/mwp/index.js +2 -1
  74. package/dist/src/multichain/transports/mwp/index.js.map +1 -1
  75. package/dist/src/multichain/utils/analytics.d.ts.map +1 -1
  76. package/dist/src/multichain/utils/analytics.js +1 -0
  77. package/dist/src/multichain/utils/analytics.js.map +1 -1
  78. package/dist/src/multichain/utils/index.d.ts +25 -0
  79. package/dist/src/multichain/utils/index.d.ts.map +1 -1
  80. package/dist/src/multichain/utils/index.js +38 -6
  81. package/dist/src/multichain/utils/index.js.map +1 -1
  82. package/dist/src/polyfills/buffer-shim.js +7 -3
  83. package/dist/src/polyfills/buffer-shim.js.map +1 -1
  84. package/dist/src/store/adapters/node.d.ts +1 -1
  85. package/dist/src/store/adapters/node.d.ts.map +1 -1
  86. package/dist/src/store/adapters/node.js +11 -4
  87. package/dist/src/store/adapters/node.js.map +1 -1
  88. package/dist/src/store/adapters/rn.d.ts.map +1 -1
  89. package/dist/src/store/adapters/rn.js +1 -0
  90. package/dist/src/store/adapters/rn.js.map +1 -1
  91. package/dist/src/store/adapters/web.d.ts +4 -4
  92. package/dist/src/store/adapters/web.d.ts.map +1 -1
  93. package/dist/src/store/adapters/web.js +6 -0
  94. package/dist/src/store/adapters/web.js.map +1 -1
  95. package/dist/src/store/index.d.ts.map +1 -1
  96. package/dist/src/store/index.js +2 -0
  97. package/dist/src/store/index.js.map +1 -1
  98. package/dist/src/ui/ModalFactory.d.ts.map +1 -1
  99. package/dist/src/ui/ModalFactory.js +1 -4
  100. package/dist/src/ui/ModalFactory.js.map +1 -1
  101. package/dist/src/ui/index.d.ts.map +1 -1
  102. package/dist/src/ui/index.js +2 -0
  103. package/dist/src/ui/index.js.map +1 -1
  104. package/dist/src/ui/index.native.d.ts.map +1 -1
  105. package/dist/src/ui/index.native.js +4 -1
  106. package/dist/src/ui/index.native.js.map +1 -1
  107. package/dist/src/ui/modals/base/AbstractInstallModal.d.ts +2 -3
  108. package/dist/src/ui/modals/base/AbstractInstallModal.d.ts.map +1 -1
  109. package/dist/src/ui/modals/base/AbstractInstallModal.js +28 -12
  110. package/dist/src/ui/modals/base/AbstractInstallModal.js.map +1 -1
  111. package/dist/src/ui/modals/base/AbstractOTPModal.d.ts +2 -2
  112. package/dist/src/ui/modals/base/AbstractOTPModal.d.ts.map +1 -1
  113. package/dist/src/ui/modals/base/AbstractOTPModal.js.map +1 -1
  114. package/dist/src/ui/modals/base/utils.d.ts +12 -0
  115. package/dist/src/ui/modals/base/utils.d.ts.map +1 -1
  116. package/dist/src/ui/modals/base/utils.js +16 -5
  117. package/dist/src/ui/modals/base/utils.js.map +1 -1
  118. package/dist/src/ui/modals/node/install.d.ts.map +1 -1
  119. package/dist/src/ui/modals/node/install.js +1 -1
  120. package/dist/src/ui/modals/node/install.js.map +1 -1
  121. package/dist/src/ui/modals/node/otp.d.ts.map +1 -1
  122. package/dist/src/ui/modals/node/otp.js +6 -2
  123. package/dist/src/ui/modals/node/otp.js.map +1 -1
  124. package/dist/src/ui/modals/rn/install.d.ts.map +1 -1
  125. package/dist/src/ui/modals/rn/install.js +7 -3
  126. package/dist/src/ui/modals/rn/install.js.map +1 -1
  127. package/dist/src/ui/modals/rn/otp.d.ts.map +1 -1
  128. package/dist/src/ui/modals/rn/otp.js +6 -2
  129. package/dist/src/ui/modals/rn/otp.js.map +1 -1
  130. package/dist/src/ui/modals/web/install.d.ts.map +1 -1
  131. package/dist/src/ui/modals/web/install.js +1 -1
  132. package/dist/src/ui/modals/web/install.js.map +1 -1
  133. package/dist/src/ui/modals/web/otp.d.ts.map +1 -1
  134. package/dist/src/ui/modals/web/otp.js +6 -2
  135. package/dist/src/ui/modals/web/otp.js.map +1 -1
  136. package/dist/types/connect-multichain.d.ts +6 -5
  137. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.5.3]
11
+
12
+ ### Added
13
+
14
+ - `createMultichainClient()` now accepts an optional `debug` param option which enables console debug logs when set to `true`. Defaults to `false`. ([#149](https://github.com/MetaMask/connect-monorepo/pull/149))
15
+
16
+ ### Fixed
17
+
18
+ - Fix `sessionProperties` not being passed to `wallet_createSession` when recreating a session after scope/account changes ([#123](https://github.com/MetaMask/connect-monorepo/pull/123))
19
+
20
+ ## [0.5.2]
21
+
22
+ ### Changed
23
+
24
+ - `ConnectMultichain.connect()` will send `sessionProperties` as undefined when called with an empty object `{}` in order to ensure that the initial `wallet_createSession` request does not fail immediately ([#138](https://github.com/MetaMask/connect-monorepo/pull/138))
25
+
10
26
  ## [0.5.1]
11
27
 
12
28
  ### Fixed
@@ -116,7 +132,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
116
132
 
117
133
  - Initial release
118
134
 
119
- [Unreleased]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-multichain@0.5.1...HEAD
135
+ [Unreleased]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-multichain@0.5.3...HEAD
136
+ [0.5.3]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-multichain@0.5.2...@metamask/connect-multichain@0.5.3
137
+ [0.5.2]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-multichain@0.5.1...@metamask/connect-multichain@0.5.2
120
138
  [0.5.1]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-multichain@0.5.0...@metamask/connect-multichain@0.5.1
121
139
  [0.5.0]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-multichain@0.4.0...@metamask/connect-multichain@0.5.0
122
140
  [0.4.0]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-multichain@0.3.2...@metamask/connect-multichain@0.4.0
package/README.md CHANGED
@@ -1,15 +1,421 @@
1
1
  # `@metamask/connect-multichain`
2
2
 
3
- multichain
3
+ > Core multichain connectivity library for MetaMask Connect SDK. Supports multiple blockchain networks including EVM chains (Ethereum, Polygon, etc.) and non-EVM chains (Solana, etc.).
4
+
5
+ This package provides support for connecting to MetaMask and using the [CAIP Multichain API](https://github.com/MetaMask/metamask-improvement-proposals/blob/main/MIPs/mip-5.md) which agnostically supports making requests to multiple blockchain ecosystems simultaneously.
4
6
 
5
7
  ## Installation
6
8
 
7
- `yarn add @metamask/connect-multichain`
9
+ ```bash
10
+ yarn add @metamask/connect-multichain
11
+ ```
8
12
 
9
13
  or
10
14
 
11
- `npm install @metamask/connect-multichain`
15
+ ```bash
16
+ npm install @metamask/connect-multichain
17
+ ```
18
+
19
+ ## Quick Start
20
+
21
+ ```typescript
22
+ import {
23
+ createMultichainClient,
24
+ getInfuraRpcUrls,
25
+ } from '@metamask/connect-multichain';
26
+
27
+ const client = await createMultichainClient({
28
+ dapp: {
29
+ name: 'My DApp',
30
+ url: 'https://mydapp.com',
31
+ },
32
+ api: {
33
+ supportedNetworks: {
34
+ // use the `getInfuraRpcUrls` helper to generate a map of Infura RPC endpoints
35
+ ...getInfuraRpcUrls(INFURA_API_KEY),
36
+ // or specify your own CAIP Chain ID to rpc endpoint mapping
37
+ 'eip155:1': 'https://mainnet.example.io/rpc',
38
+ 'eip155:137': 'https://polygon-mainnet.example.io/rpc',
39
+ },
40
+ },
41
+ });
42
+
43
+ // Connect to MetaMask with specific chain scopes
44
+ await client.connect(['eip155:1', 'eip155:137'], []);
45
+
46
+ // Invoke methods on specific chains
47
+ const blockNumber = await client.invokeMethod({
48
+ scope: 'eip155:1',
49
+ request: {
50
+ method: 'eth_blockNumber',
51
+ params: [],
52
+ },
53
+ });
54
+ ```
55
+
56
+ ## Usage
57
+
58
+ ### Browser (Web)
59
+
60
+ ```typescript
61
+ import { createMultichainClient } from '@metamask/connect-multichain';
62
+
63
+ const client = await createMultichainClient({
64
+ dapp: {
65
+ name: 'My Web DApp',
66
+ url: 'https://mydapp.com',
67
+ iconUrl: 'https://mydapp.com/icon.png',
68
+ },
69
+ api: {
70
+ supportedNetworks: {
71
+ 'eip155:1': 'https://mainnet.infura.io/v3/YOUR_KEY',
72
+ },
73
+ },
74
+ ui: {
75
+ preferExtension: true, // Prefer browser extension over mobile QR
76
+ showInstallModal: false, // Show modal to install extension
77
+ headless: false, // Set true for custom QR UI
78
+ },
79
+ });
80
+ ```
81
+
82
+ ### Node.js
83
+
84
+ ```typescript
85
+ import { createMultichainClient } from '@metamask/connect-multichain';
86
+
87
+ const client = await createMultichainClient({
88
+ dapp: {
89
+ name: 'My Node App',
90
+ url: 'https://mydapp.com',
91
+ },
92
+ api: {
93
+ supportedNetworks: {
94
+ 'eip155:1': 'https://mainnet.infura.io/v3/YOUR_KEY',
95
+ },
96
+ },
97
+ });
98
+
99
+ // Connect will display QR code in terminal
100
+ await client.connect(['eip155:1'], []);
101
+ ```
102
+
103
+ ### React Native
104
+
105
+ ```typescript
106
+ import { Linking } from 'react-native';
107
+ import { createMultichainClient } from '@metamask/connect-multichain';
108
+
109
+ const client = await createMultichainClient({
110
+ dapp: {
111
+ name: 'My RN App',
112
+ url: 'https://mydapp.com',
113
+ },
114
+ api: {
115
+ supportedNetworks: {
116
+ 'eip155:1': 'https://mainnet.infura.io/v3/YOUR_KEY',
117
+ },
118
+ },
119
+ mobile: {
120
+ preferredOpenLink: (deeplink) => {
121
+ Linking.openURL(deeplink);
122
+ },
123
+ },
124
+ });
125
+ ```
126
+
127
+ ## TypeScript
128
+
129
+ This package is written in TypeScript and includes full type definitions. No additional `@types` package is required.
130
+
131
+ ## API Reference
132
+
133
+ ### `createMultichainClient(options)`
134
+
135
+ Factory function to create a new Multichain SDK instance.
136
+
137
+ #### Parameters
138
+
139
+ | Option | Type | Required | Description |
140
+ | --------------------------- | --------------------------------------------- | -------- | ---------------------------------------------- |
141
+ | `dapp.name` | `string` | Yes | Name of your dApp |
142
+ | `api.supportedNetworks` | `RpcUrlsMap` | Yes | Map of CAIP chain IDs to RPC URLs |
143
+ | `dapp.url` | `string` | No | URL of your dApp |
144
+ | `dapp.iconUrl` | `string` | No | Icon URL for your dApp |
145
+ | `dapp.base64Icon` | `string` | No | Base64-encoded icon (alternative to iconUrl) |
146
+ | `storage` | `StoreClient` | No | Custom storage adapter |
147
+ | `ui.factory` | `BaseModalFactory` | No | Custom modal factory |
148
+ | `ui.headless` | `boolean` | No | Run without UI (for custom QR implementations) |
149
+ | `ui.preferExtension` | `boolean` | No | Prefer browser extension (default: true) |
150
+ | `ui.showInstallModal` | `boolean` | No | Show installation modal |
151
+ | `mobile.preferredOpenLink` | `(deeplink: string, target?: string) => void` | No | Custom deeplink handler |
152
+ | `mobile.useDeeplink` | `boolean` | No | Use `metamask://` instead of universal links |
153
+ | `analytics.integrationType` | `string` | No | Integration type for analytics |
154
+ | `transport.extensionId` | `string` | No | Custom extension ID |
155
+ | `transport.onNotification` | `(notification: unknown) => void` | No | Notification handler |
156
+ | `debug` | `boolean` | No | Enable debug logging |
157
+
158
+ #### Returns
159
+
160
+ `Promise<MetaMaskConnectMultichain>` - A fully initialized SDK instance.
161
+
162
+ ```typescript
163
+ const client = await createMultichainClient({
164
+ dapp: { name: 'My DApp', url: 'https://mydapp.com' },
165
+ api: {
166
+ supportedNetworks: {
167
+ 'eip155:1': 'https://mainnet.infura.io/v3/KEY',
168
+ 'eip155:137': 'https://polygon-mainnet.infura.io/v3/KEY',
169
+ },
170
+ },
171
+ });
172
+ ```
173
+
174
+ ---
175
+
176
+ ### `MetaMaskConnectMultichain`
177
+
178
+ The main SDK class extending `MultichainCore`.
179
+
180
+ #### Methods
181
+
182
+ ##### `connect(scopes, caipAccountIds, sessionProperties?, forceRequest?)`
183
+
184
+ Connects to MetaMask with specified chain scopes.
185
+
186
+ **Parameters**
187
+
188
+ | Name | Type | Required | Description |
189
+ | ------------------- | ------------------- | -------- | ------------------------------------------------------------------------------------------------------- |
190
+ | `scopes` | `Scope[]` | Yes | Array of CAIP-2 chain identifiers to request permission for |
191
+ | `caipAccountIds` | `CaipAccountId[]` | Yes | Array of CAIP-10 account identifiers to request (pass `[]` if no specific accounts should be requested) |
192
+ | `sessionProperties` | `SessionProperties` | No | Additional session properties |
193
+ | `forceRequest` | `boolean` | No | Force a new connection request even if already connected |
194
+
195
+ **Returns**
196
+
197
+ `Promise<void>`
198
+
199
+ ```typescript
200
+ await client.connect(
201
+ ['eip155:1', 'eip155:137'], // Chain scopes to request
202
+ ['eip155:1:0x...'], // Specific accounts to request
203
+ );
204
+ ```
205
+
206
+ ##### `disconnect()`
207
+
208
+ Disconnects from the wallet and cleans up resources.
209
+
210
+ **Parameters**
211
+
212
+ None.
213
+
214
+ **Returns**
215
+
216
+ `Promise<void>`
217
+
218
+ ```typescript
219
+ await client.disconnect();
220
+ ```
221
+
222
+ ##### `invokeMethod(options)`
223
+
224
+ Invokes an RPC method on a specific chain.
225
+
226
+ **Parameters**
227
+
228
+ | Name | Type | Required | Description |
229
+ | ------------------------ | ----------- | -------- | --------------------------------------------------- |
230
+ | `options.scope` | `Scope` | Yes | The CAIP-2 chain identifier to invoke the method on |
231
+ | `options.request.method` | `string` | Yes | The RPC method name |
232
+ | `options.request.params` | `unknown[]` | No | The method parameters |
233
+
234
+ **Returns**
235
+
236
+ `Promise<Json>` - The result of the RPC method call.
237
+
238
+ ```typescript
239
+ const result = await client.invokeMethod({
240
+ scope: 'eip155:1',
241
+ request: {
242
+ method: 'eth_getBalance',
243
+ params: ['0x...', 'latest'],
244
+ },
245
+ });
246
+ ```
247
+
248
+ #### Properties
249
+
250
+ | Property | Type | Description |
251
+ | ----------- | --------------------- | --------------------------------------------------------------------------------------------- |
252
+ | `status` | `ConnectionStatus` | Connection status ( `'loaded'`, `'pending'`, `'connecting'`, `'connected'`, `'disconnected'`) |
253
+ | `provider` | `MultichainApiClient` | Multichain API client |
254
+ | `transport` | `ExtendedTransport` | Active transport layer |
255
+
256
+ #### Events
257
+
258
+ ```typescript
259
+ // Session changes
260
+ client.on('wallet_sessionChanged', (session) => {
261
+ console.log('Session updated:', session);
262
+ });
263
+
264
+ // QR code display (for custom UI)
265
+ client.on('display_uri', (uri) => {
266
+ console.log('Display QR code:', uri);
267
+ });
268
+
269
+ // Connection state changes
270
+ client.on('stateChanged', (status) => {
271
+ console.log('Status:', status);
272
+ });
273
+ ```
274
+
275
+ ---
276
+
277
+ ### `MultichainCore`
278
+
279
+ Abstract base class providing core multichain functionality.
280
+
281
+ #### Methods
282
+
283
+ ##### `on(event, handler)`
284
+
285
+ Registers an event handler.
286
+
287
+ **Parameters**
288
+
289
+ | Name | Type | Required | Description |
290
+ | --------- | ---------- | -------- | --------------------------------------------------------- |
291
+ | `event` | `string` | Yes | The event name to listen for |
292
+ | `handler` | `Function` | Yes | The callback function to invoke when the event is emitted |
293
+
294
+ **Returns**
295
+
296
+ `void`
297
+
298
+ ##### `off(event, handler)`
299
+
300
+ Removes an event handler.
301
+
302
+ **Parameters**
303
+
304
+ | Name | Type | Required | Description |
305
+ | --------- | ---------- | -------- | ------------------------------------ |
306
+ | `event` | `string` | Yes | The event name to stop listening for |
307
+ | `handler` | `Function` | Yes | The callback function to remove |
308
+
309
+ **Returns**
310
+
311
+ `void`
312
+
313
+ ##### `emit(event, args)`
314
+
315
+ Emits an event to all registered handlers.
316
+
317
+ **Parameters**
318
+
319
+ | Name | Type | Required | Description |
320
+ | ------- | -------- | -------- | --------------------------------------- |
321
+ | `event` | `string` | Yes | The event name to emit |
322
+ | `args` | `any` | No | Arguments to pass to the event handlers |
323
+
324
+ **Returns**
325
+
326
+ `void`
327
+
328
+ ---
329
+
330
+ ### Utilities
331
+
332
+ #### `getInfuraRpcUrls(infuraApiKey)`
333
+
334
+ Generates Infura RPC URLs for common networks keyed by CAIP Chain ID.
335
+
336
+ **Parameters**
337
+
338
+ | Name | Type | Required | Description |
339
+ | -------------- | -------- | -------- | ------------------- |
340
+ | `infuraApiKey` | `string` | Yes | Your Infura API key |
341
+
342
+ **Returns**
343
+
344
+ A map of hex chain IDs to Infura RPC URLs. See https://docs.metamask.io/services
345
+
346
+ ```typescript
347
+ import { getInfuraRpcUrls } from '@metamask/connect-multichain';
348
+
349
+ const rpcUrls = getInfuraRpcUrls('YOUR_INFURA_KEY');
350
+ // {
351
+ // 'eip155:1': 'https://mainnet.infura.io/v3/YOUR_KEY',
352
+ // 'eip155:137': 'https://polygon-mainnet.infura.io/v3/YOUR_KEY',
353
+ // 'eip155:11155111': 'https://sepolia.infura.io/v3/YOUR_KEY',
354
+ // ...
355
+ // }
356
+ ```
357
+
358
+ ---
359
+
360
+ ### Errors
361
+
362
+ The package exports various error classes for handling specific error conditions:
363
+
364
+ - `ProtocolError` - Base protocol error
365
+ - `StorageError` - Storage operation errors
366
+ - `RpcError` - RPC request errors
367
+
368
+ ```typescript
369
+ import { ProtocolError } from '@metamask/connect-multichain';
370
+
371
+ try {
372
+ await client.connect(['eip155:1'], []);
373
+ } catch (error) {
374
+ if (error instanceof ProtocolError) {
375
+ console.log('Protocol error:', error.code, error.message);
376
+ }
377
+ }
378
+ ```
379
+
380
+ ---
381
+
382
+ ## Headless Mode
383
+
384
+ For custom QR code implementations, use headless mode:
385
+
386
+ ```typescript
387
+ const client = await createMultichainClient({
388
+ dapp: { name: 'My DApp' },
389
+ api: { supportedNetworks: { 'eip155:1': 'https://...' } },
390
+ ui: { headless: true },
391
+ });
392
+
393
+ // Listen for QR code URIs
394
+ client.on('display_uri', (uri) => {
395
+ // Display your custom QR code with this URI
396
+ displayMyCustomQRCode(uri);
397
+ });
398
+
399
+ await client.connect(['eip155:1'], []);
400
+ ```
401
+
402
+ ## Standards
403
+
404
+ - [CAIP-25](https://chainagnostic.org/CAIPs/caip-25) (please see CAIP Multichain API)
405
+ - [CAIP-27](https://chainagnostic.org/CAIPs/caip-27)
406
+ - [CAIP-2](https://chainagnostic.org/CAIPs/caip-2)
407
+ - [CAIP-10](https://chainagnostic.org/CAIPs/caip-10)
408
+ - [CAIP-217](https://chainagnostic.org/CAIPs/caip-217)
409
+ - [CAIP-316](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-316.md)
410
+ - [CAIP-312](https://chainagnostic.org/CAIPs/caip-312)
411
+ - [CAIP-311](https://chainagnostic.org/CAIPs/caip-311)
412
+ - [CAIP-285](https://chainagnostic.org/CAIPs/caip-285)
413
+ - [CAIP Multichain API](https://github.com/MetaMask/metamask-improvement-proposals/blob/main/MIPs/mip-5.md)
12
414
 
13
415
  ## Contributing
14
416
 
15
417
  This package is part of a monorepo. Instructions for contributing can be found in the [monorepo README](https://github.com/MetaMask/connect-monorepo#readme).
418
+
419
+ ## License
420
+
421
+ MIT
@@ -265,17 +265,16 @@ type RPCResponse = {
265
265
  result: unknown;
266
266
  };
267
267
 
268
- declare abstract class AbstractOTPCodeModal extends Modal<OTPCodeWidgetProps, OTPCode> {
268
+ declare abstract class AbstractOTPCodeModal extends Modal<OTPCodeWidgetProps> {
269
269
  protected instance?: HTMLMmOtpModalElement | undefined;
270
270
  get otpCode(): string;
271
271
  set otpCode(code: string);
272
272
  updateOTPCode(code: string): void;
273
273
  }
274
274
 
275
- declare abstract class AbstractInstallModal extends Modal<InstallWidgetProps, QRLink> {
275
+ declare abstract class AbstractInstallModal extends Modal<InstallWidgetProps> {
276
+ #private;
276
277
  protected instance?: HTMLMmInstallModalElement | undefined;
277
- private expirationInterval;
278
- private lastLoggedCountdown;
279
278
  abstract renderQRCode(link: QRLink, connectionRequest: ConnectionRequest): void;
280
279
  get link(): QRLink;
281
280
  set link(link: QRLink);
@@ -428,6 +427,8 @@ type MultichainOptions = {
428
427
  extensionId?: string;
429
428
  onNotification?: (notification: unknown) => void;
430
429
  };
430
+ /** Enable debug logging */
431
+ debug?: boolean;
431
432
  };
432
433
  type MultiChainFNOptions = Omit<MultichainOptions, 'storage' | 'ui'> & {
433
434
  ui?: Omit<MultichainOptions['ui'], 'factory'>;
@@ -521,7 +522,7 @@ declare abstract class StoreClient {
521
522
  * Supported debug namespace types for the MetaMask SDK logger.
522
523
  * These namespaces help categorize and filter debug output.
523
524
  */
524
- type LoggerNameSpaces = 'metamask-sdk' | 'metamask-sdk:core' | 'metamask-sdk:provider' | 'metamask-sdk:ui' | 'metamask-sdk:transport';
525
+ type LoggerNameSpaces = 'metamask-sdk:*' | 'metamask-sdk' | 'metamask-sdk:core' | 'metamask-sdk:provider' | 'metamask-sdk:ui' | 'metamask-sdk:transport';
525
526
  /**
526
527
  * Creates a debug logger instance with the specified namespace and color.
527
528
  *