@dynamic-labs-sdk/metamask 1.31.0 → 1.31.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/assertMetaMaskNetworkIsGranted/assertMetaMaskNetworkIsGranted.d.ts +37 -0
  2. package/dist/assertMetaMaskNetworkIsGranted/assertMetaMaskNetworkIsGranted.d.ts.map +1 -0
  3. package/dist/assertMetaMaskNetworkIsGranted/index.d.ts +2 -0
  4. package/dist/assertMetaMaskNetworkIsGranted/index.d.ts.map +1 -0
  5. package/dist/clearMetaMaskSessionStorage/clearMetaMaskSessionStorage.d.ts +6 -6
  6. package/dist/clearMetaMaskSessionStorage/clearMetaMaskSessionStorage.d.ts.map +1 -1
  7. package/dist/connectWithMetaMaskUri/connectWithMetaMaskUri.d.ts +3 -8
  8. package/dist/connectWithMetaMaskUri/connectWithMetaMaskUri.d.ts.map +1 -1
  9. package/dist/constants.d.ts +8 -0
  10. package/dist/constants.d.ts.map +1 -0
  11. package/dist/core.cjs +465 -0
  12. package/dist/core.cjs.map +1 -0
  13. package/dist/core.esm.js +459 -0
  14. package/dist/core.esm.js.map +1 -0
  15. package/dist/core.native.esm.js +459 -0
  16. package/dist/core.native.esm.js.map +1 -0
  17. package/dist/createMetaMaskWalletProviderEventEmitter/createMetaMaskWalletProviderEventEmitter.d.ts +44 -0
  18. package/dist/createMetaMaskWalletProviderEventEmitter/createMetaMaskWalletProviderEventEmitter.d.ts.map +1 -0
  19. package/dist/createMetaMaskWalletProviderEventEmitter/index.d.ts +3 -0
  20. package/dist/createMetaMaskWalletProviderEventEmitter/index.d.ts.map +1 -0
  21. package/dist/disconnectMetaMaskWalletProvider/disconnectMetaMaskWalletProvider.d.ts +56 -0
  22. package/dist/disconnectMetaMaskWalletProvider/disconnectMetaMaskWalletProvider.d.ts.map +1 -0
  23. package/dist/disconnectMetaMaskWalletProvider/index.d.ts +3 -0
  24. package/dist/disconnectMetaMaskWalletProvider/index.d.ts.map +1 -0
  25. package/dist/errors/MetaMaskClientNotInitializedError/MetaMaskClientNotInitializedError.d.ts +12 -0
  26. package/dist/errors/MetaMaskClientNotInitializedError/MetaMaskClientNotInitializedError.d.ts.map +1 -0
  27. package/dist/errors/MetaMaskClientNotInitializedError/index.d.ts +2 -0
  28. package/dist/errors/MetaMaskClientNotInitializedError/index.d.ts.map +1 -0
  29. package/dist/errors/MetaMaskDisplayUriMissingError/MetaMaskDisplayUriMissingError.d.ts +21 -0
  30. package/dist/errors/MetaMaskDisplayUriMissingError/MetaMaskDisplayUriMissingError.d.ts.map +1 -1
  31. package/dist/errors/MetaMaskStorageError/MetaMaskStorageError.d.ts +12 -0
  32. package/dist/errors/MetaMaskStorageError/MetaMaskStorageError.d.ts.map +1 -0
  33. package/dist/errors/MetaMaskStorageError/index.d.ts +2 -0
  34. package/dist/errors/MetaMaskStorageError/index.d.ts.map +1 -0
  35. package/dist/errors/MetaMaskUnscopedNetworkError/MetaMaskUnscopedNetworkError.d.ts +29 -0
  36. package/dist/errors/MetaMaskUnscopedNetworkError/MetaMaskUnscopedNetworkError.d.ts.map +1 -0
  37. package/dist/errors/MetaMaskUnscopedNetworkError/index.d.ts +2 -0
  38. package/dist/errors/MetaMaskUnscopedNetworkError/index.d.ts.map +1 -0
  39. package/dist/errors/UnsupportedMetaMaskChainError/UnsupportedMetaMaskChainError.d.ts +9 -0
  40. package/dist/errors/UnsupportedMetaMaskChainError/UnsupportedMetaMaskChainError.d.ts.map +1 -0
  41. package/dist/errors/UnsupportedMetaMaskChainError/index.d.ts +2 -0
  42. package/dist/errors/UnsupportedMetaMaskChainError/index.d.ts.map +1 -0
  43. package/dist/exports/core.d.ts +21 -0
  44. package/dist/exports/core.d.ts.map +1 -0
  45. package/dist/exports/index.d.ts +2 -2
  46. package/dist/exports/index.d.ts.map +1 -1
  47. package/dist/getGrantedMetaMaskScopes/getGrantedMetaMaskScopes.d.ts +40 -0
  48. package/dist/getGrantedMetaMaskScopes/getGrantedMetaMaskScopes.d.ts.map +1 -0
  49. package/dist/getGrantedMetaMaskScopes/index.d.ts +3 -0
  50. package/dist/getGrantedMetaMaskScopes/index.d.ts.map +1 -0
  51. package/dist/getMetaMaskExtensionWalletProviderKey/getMetaMaskExtensionWalletProviderKey.d.ts +1 -1
  52. package/dist/getMetaMaskScopeForNetworkId/getMetaMaskScopeForNetworkId.d.ts +39 -0
  53. package/dist/getMetaMaskScopeForNetworkId/getMetaMaskScopeForNetworkId.d.ts.map +1 -0
  54. package/dist/getMetaMaskScopeForNetworkId/index.d.ts +2 -0
  55. package/dist/getMetaMaskScopeForNetworkId/index.d.ts.map +1 -0
  56. package/dist/getMetaMaskScopes/getMetaMaskScopes.d.ts +28 -0
  57. package/dist/getMetaMaskScopes/getMetaMaskScopes.d.ts.map +1 -0
  58. package/dist/getMetaMaskScopes/index.d.ts +2 -0
  59. package/dist/getMetaMaskScopes/index.d.ts.map +1 -0
  60. package/dist/getMetaMaskSupportedNetworks/getMetaMaskSupportedNetworks.d.ts +23 -0
  61. package/dist/getMetaMaskSupportedNetworks/getMetaMaskSupportedNetworks.d.ts.map +1 -0
  62. package/dist/getMetaMaskSupportedNetworks/index.d.ts +2 -0
  63. package/dist/getMetaMaskSupportedNetworks/index.d.ts.map +1 -0
  64. package/dist/getNetworkIdFromMetaMaskScope/getNetworkIdFromMetaMaskScope.d.ts +35 -0
  65. package/dist/getNetworkIdFromMetaMaskScope/getNetworkIdFromMetaMaskScope.d.ts.map +1 -0
  66. package/dist/getNetworkIdFromMetaMaskScope/index.d.ts +2 -0
  67. package/dist/getNetworkIdFromMetaMaskScope/index.d.ts.map +1 -0
  68. package/dist/getOrCreateMetaMaskClientInstanceManager-DWd07xVz.esm.js +621 -0
  69. package/dist/getOrCreateMetaMaskClientInstanceManager-DWd07xVz.esm.js.map +1 -0
  70. package/dist/getOrCreateMetaMaskClientInstanceManager-Dz57S3Bm.native.esm.js +621 -0
  71. package/dist/getOrCreateMetaMaskClientInstanceManager-Dz57S3Bm.native.esm.js.map +1 -0
  72. package/dist/getOrCreateMetaMaskClientInstanceManager-l6T7WUT5.cjs +708 -0
  73. package/dist/getOrCreateMetaMaskClientInstanceManager-l6T7WUT5.cjs.map +1 -0
  74. package/dist/getScopeAccountsFromMetaMaskClient/getScopeAccountsFromMetaMaskClient.d.ts +38 -0
  75. package/dist/getScopeAccountsFromMetaMaskClient/getScopeAccountsFromMetaMaskClient.d.ts.map +1 -0
  76. package/dist/getScopeAccountsFromMetaMaskClient/index.d.ts +2 -0
  77. package/dist/getScopeAccountsFromMetaMaskClient/index.d.ts.map +1 -0
  78. package/dist/index.cjs +57 -57
  79. package/dist/index.cjs.map +1 -1
  80. package/dist/index.esm.js +56 -56
  81. package/dist/index.esm.js.map +1 -1
  82. package/dist/index.native.esm.js +56 -78
  83. package/dist/index.native.esm.js.map +1 -1
  84. package/dist/metaMaskClientInstanceManager/createMetaMaskClientInstanceManager/createMetaMaskClientInstanceManager.d.ts +45 -0
  85. package/dist/metaMaskClientInstanceManager/createMetaMaskClientInstanceManager/createMetaMaskClientInstanceManager.d.ts.map +1 -0
  86. package/dist/metaMaskClientInstanceManager/createMetaMaskClientInstanceManager/index.d.ts +2 -0
  87. package/dist/metaMaskClientInstanceManager/createMetaMaskClientInstanceManager/index.d.ts.map +1 -0
  88. package/dist/metaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager.d.ts +18 -0
  89. package/dist/metaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager.d.ts.map +1 -0
  90. package/dist/metaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager/index.d.ts +2 -0
  91. package/dist/metaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager/index.d.ts.map +1 -0
  92. package/dist/metaMaskStorage/clearMetaMaskStorage/clearMetaMaskStorage.d.ts +23 -0
  93. package/dist/metaMaskStorage/clearMetaMaskStorage/clearMetaMaskStorage.d.ts.map +1 -0
  94. package/dist/metaMaskStorage/clearMetaMaskStorage/index.d.ts +2 -0
  95. package/dist/metaMaskStorage/clearMetaMaskStorage/index.d.ts.map +1 -0
  96. package/dist/metaMaskStorage/createInitialMetaMaskStoreValue/createInitialMetaMaskStoreValue.d.ts +19 -0
  97. package/dist/metaMaskStorage/createInitialMetaMaskStoreValue/createInitialMetaMaskStoreValue.d.ts.map +1 -0
  98. package/dist/metaMaskStorage/createMetaMaskStorageClient/createMetaMaskStorageClient.d.ts +30 -0
  99. package/dist/metaMaskStorage/createMetaMaskStorageClient/createMetaMaskStorageClient.d.ts.map +1 -0
  100. package/dist/metaMaskStorage/createMetaMaskStorageClient/index.d.ts +2 -0
  101. package/dist/metaMaskStorage/createMetaMaskStorageClient/index.d.ts.map +1 -0
  102. package/dist/metaMaskStorage/metaMaskStorage.schema.d.ts +30 -0
  103. package/dist/metaMaskStorage/metaMaskStorage.schema.d.ts.map +1 -0
  104. package/dist/metaMaskStorage/queueMetaMaskStorageWrite/queueMetaMaskStorageWrite.d.ts +20 -0
  105. package/dist/metaMaskStorage/queueMetaMaskStorageWrite/queueMetaMaskStorageWrite.d.ts.map +1 -0
  106. package/dist/metamask.types.d.ts +0 -20
  107. package/dist/metamask.types.d.ts.map +1 -1
  108. package/dist/reconcileMetaMaskWalletProvider/index.d.ts +3 -0
  109. package/dist/reconcileMetaMaskWalletProvider/index.d.ts.map +1 -0
  110. package/dist/reconcileMetaMaskWalletProvider/reconcileMetaMaskWalletProvider.d.ts +60 -0
  111. package/dist/reconcileMetaMaskWalletProvider/reconcileMetaMaskWalletProvider.d.ts.map +1 -0
  112. package/dist/resolveActiveMetaMaskScope/index.d.ts +3 -0
  113. package/dist/resolveActiveMetaMaskScope/index.d.ts.map +1 -0
  114. package/dist/resolveActiveMetaMaskScope/resolveActiveMetaMaskScope.d.ts +67 -0
  115. package/dist/resolveActiveMetaMaskScope/resolveActiveMetaMaskScope.d.ts.map +1 -0
  116. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  117. package/dist/utils/clearMetaMaskSdkSingleton/clearMetaMaskSdkSingleton.d.ts +23 -0
  118. package/dist/utils/clearMetaMaskSdkSingleton/clearMetaMaskSdkSingleton.d.ts.map +1 -0
  119. package/dist/utils/createMetaMaskPreferredOpenLink/createMetaMaskPreferredOpenLink.d.ts +21 -0
  120. package/dist/utils/createMetaMaskPreferredOpenLink/createMetaMaskPreferredOpenLink.d.ts.map +1 -0
  121. package/dist/utils/createMetaMaskPreferredOpenLink/index.d.ts +2 -0
  122. package/dist/utils/createMetaMaskPreferredOpenLink/index.d.ts.map +1 -0
  123. package/package.json +11 -3
  124. package/dist/errors/MetaMaskWalletNotConnectedError/MetaMaskWalletNotConnectedError.d.ts +0 -5
  125. package/dist/errors/MetaMaskWalletNotConnectedError/MetaMaskWalletNotConnectedError.d.ts.map +0 -1
  126. package/dist/errors/MetaMaskWalletNotConnectedError/index.d.ts +0 -2
  127. package/dist/errors/MetaMaskWalletNotConnectedError/index.d.ts.map +0 -1
@@ -0,0 +1,708 @@
1
+ //#region rolldown:runtime
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) {
13
+ __defProp(to, key, {
14
+ get: ((k) => from[k]).bind(null, key),
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ });
17
+ }
18
+ }
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
23
+ value: mod,
24
+ enumerable: true
25
+ }) : target, mod));
26
+
27
+ //#endregion
28
+ let _dynamic_labs_sdk_client_core = require("@dynamic-labs-sdk/client/core");
29
+ let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
30
+ let _metamask_connect_multichain = require("@metamask/connect-multichain");
31
+ let zod_mini = require("zod/mini");
32
+ zod_mini = __toESM(zod_mini);
33
+
34
+ //#region package.json
35
+ var name = "@dynamic-labs-sdk/metamask";
36
+ var version = "1.31.1";
37
+
38
+ //#endregion
39
+ //#region src/errors/MetaMaskUnscopedNetworkError/MetaMaskUnscopedNetworkError.ts
40
+ /**
41
+ * Thrown when attempting to switch a MetaMask multichain wallet provider to
42
+ * a network whose CAIP-2 scope was requested at connect time but never
43
+ * granted an account by MetaMask in the current session (e.g. the user only
44
+ * approved mainnet, not a preconfigured devnet, during pairing). Switching
45
+ * to it anyway would silently break every subsequent signing/sending call
46
+ * on that network, since MetaMask rejects those against an ungranted scope.
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * try {
51
+ * await switchActiveNetwork({ networkId: '103', walletAccount });
52
+ * } catch (error) {
53
+ * if (error instanceof MetaMaskUnscopedNetworkError) {
54
+ * // Tell the user to approve this network in MetaMask, then retry.
55
+ * }
56
+ * }
57
+ * ```
58
+ * @see assertMetaMaskNetworkIsGranted
59
+ * @see resolveActiveMetaMaskScope
60
+ */
61
+ var MetaMaskUnscopedNetworkError = class extends _dynamic_labs_sdk_client.BaseError {
62
+ constructor({ networkId, scope }) {
63
+ super({
64
+ cause: null,
65
+ code: "metamask_unscoped_network",
66
+ docsUrl: null,
67
+ metaMessages: [`scope: ${scope}`],
68
+ name: "MetaMaskUnscopedNetworkError",
69
+ shortMessage: `Cannot switch to network "${networkId}": MetaMask did not grant an account for scope "${scope}" in the current session.`
70
+ });
71
+ }
72
+ };
73
+
74
+ //#endregion
75
+ //#region src/constants.ts
76
+ /**
77
+ * Chains MetaMask's multichain client can build a CAIP-2 scope for. Shared by
78
+ * every scope/network-mapping helper so the supported set only needs to
79
+ * change in one place.
80
+ */
81
+ const SUPPORTED_METAMASK_CHAINS = ["EVM", "SOL"];
82
+
83
+ //#endregion
84
+ //#region src/errors/UnsupportedMetaMaskChainError/UnsupportedMetaMaskChainError.ts
85
+ /** Thrown when a chain has no MetaMask multichain scope mapping defined. */
86
+ var UnsupportedMetaMaskChainError = class extends _dynamic_labs_sdk_client.BaseError {
87
+ constructor({ chain, supportedChains }) {
88
+ super({
89
+ cause: null,
90
+ code: "metamask_unsupported_chain",
91
+ docsUrl: null,
92
+ name: "UnsupportedMetaMaskChainError",
93
+ shortMessage: `Unsupported chain "${chain}" for MetaMask. Supported chains: ${supportedChains.join(", ")}`
94
+ });
95
+ }
96
+ };
97
+
98
+ //#endregion
99
+ //#region src/getMetaMaskScopeForNetworkId/getMetaMaskScopeForNetworkId.ts
100
+ /**
101
+ * Maps a single Dynamic-configured network to its CAIP-2 MetaMask
102
+ * multichain scope -- the same per-network mapping `getMetaMaskScopes`
103
+ * applies to every configured network at once, extracted so callers that
104
+ * already have one `networkId` (e.g. the "active network" registry) don't
105
+ * need to rebuild and filter the whole configured list to find it.
106
+ *
107
+ * EVM's `networkId` IS the CAIP-2 reference (`eip155:<networkId>`); SOL's
108
+ * `networkId` is an internal routing id, so the network's base58 genesis
109
+ * hash is used instead (`solana:<genesisHash>`). Returns `undefined` when no
110
+ * configured SOL network matches, or matches but has no genesis hash --
111
+ * these are normal ("this networkId isn't usable as a MetaMask scope"), not
112
+ * error conditions.
113
+ *
114
+ * @example
115
+ * ```ts
116
+ * const scope = getMetaMaskScopeForNetworkId(
117
+ * { chain: 'SOL', networkId: '101' },
118
+ * client
119
+ * );
120
+ * // 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp'
121
+ * ```
122
+ *
123
+ * @returns The CAIP-2 scope for `networkId`, or `undefined` if it can't be
124
+ * expressed as one (e.g. a SOL network with no genesis hash configured).
125
+ * @throws {UnsupportedMetaMaskChainError} If `chain` isn't a chain MetaMask
126
+ * scopes can be built for.
127
+ * @see getMetaMaskScopes
128
+ * @see getNetworkIdFromMetaMaskScope
129
+ * @notInstrumented
130
+ */
131
+ const getMetaMaskScopeForNetworkId = ({ chain, networkId }, client) => {
132
+ if (chain === "EVM") return `eip155:${networkId}`;
133
+ if (chain === "SOL") {
134
+ const network = (0, _dynamic_labs_sdk_client.getNetworksData)(client).find((candidate) => candidate.chain === "SOL" && candidate.networkId === networkId);
135
+ return network?.genesisHash ? `solana:${network.genesisHash}` : void 0;
136
+ }
137
+ throw new UnsupportedMetaMaskChainError({
138
+ chain,
139
+ supportedChains: SUPPORTED_METAMASK_CHAINS
140
+ });
141
+ };
142
+
143
+ //#endregion
144
+ //#region src/getMetaMaskScopes/getMetaMaskScopes.ts
145
+ /**
146
+ * Builds the CAIP-2 scopes to request for a chain's MetaMask multichain
147
+ * session, one per configured network. SOL scopes use the network's genesis
148
+ * hash (not `networkId`, which is an internal routing id for SOL) since
149
+ * that's the CAIP-2 reference MetaMask expects.
150
+ *
151
+ * @example
152
+ * ```ts
153
+ * const scopes = getMetaMaskScopes({ chain: 'EVM' }, client);
154
+ * // ['eip155:1', 'eip155:137']
155
+ * ```
156
+ *
157
+ * @returns The CAIP-2 scopes for every configured network of `chain` that
158
+ * can be expressed as one.
159
+ * @throws {UnsupportedMetaMaskChainError} If `chain` isn't a chain MetaMask
160
+ * scopes can be built for.
161
+ * @see getMetaMaskScopeForNetworkId
162
+ * @see getMetaMaskSupportedNetworks
163
+ * @notInstrumented
164
+ */
165
+ const getMetaMaskScopes = ({ chain }, client) => {
166
+ if (!chain || !SUPPORTED_METAMASK_CHAINS.includes(chain)) throw new UnsupportedMetaMaskChainError({
167
+ chain,
168
+ supportedChains: SUPPORTED_METAMASK_CHAINS
169
+ });
170
+ return (0, _dynamic_labs_sdk_client.getNetworksData)(client).filter((network) => network.chain === chain).flatMap((network) => {
171
+ const scope = getMetaMaskScopeForNetworkId({
172
+ chain: network.chain,
173
+ networkId: network.networkId
174
+ }, client);
175
+ return scope ? [scope] : [];
176
+ });
177
+ };
178
+
179
+ //#endregion
180
+ //#region src/errors/MetaMaskClientNotInitializedError/MetaMaskClientNotInitializedError.ts
181
+ /**
182
+ * Thrown when `getMetaMaskClient()` is called but the underlying
183
+ * `@metamask/connect-multichain` client failed to initialize -- this should
184
+ * be unreachable in practice, since `getMetaMaskClient` always triggers
185
+ * `refreshMetaMaskClient` first when no client promise exists yet, but it
186
+ * guards against a future change silently returning `undefined` instead.
187
+ */
188
+ var MetaMaskClientNotInitializedError = class extends _dynamic_labs_sdk_client.BaseError {
189
+ constructor() {
190
+ super({
191
+ cause: null,
192
+ code: "metamask_client_not_initialized",
193
+ docsUrl: null,
194
+ name: "MetaMaskClientNotInitializedError",
195
+ shortMessage: "MetaMask client not initialized"
196
+ });
197
+ }
198
+ };
199
+
200
+ //#endregion
201
+ //#region src/getMetaMaskSupportedNetworks/getMetaMaskSupportedNetworks.ts
202
+ /**
203
+ * Builds the `api.supportedNetworks` map for MetaMask's multichain client:
204
+ * EVM networks keyed by their CAIP-2 `eip155:<networkId>` scope, SOL networks
205
+ * keyed by their CAIP-2 `solana:<genesisHash>` scope (SOL's `networkId` is an
206
+ * internal routing id, not usable as a CAIP-2 reference).
207
+ *
208
+ * @example
209
+ * ```ts
210
+ * const supportedNetworks = getMetaMaskSupportedNetworks(client);
211
+ * // { 'eip155:1': 'https://...', 'solana:5eykt4...': 'https://...' }
212
+ * ```
213
+ *
214
+ * @returns The RPC URL for every configured EVM/SOL network, keyed by its
215
+ * MetaMask-recognized network identifier.
216
+ * @see getMetaMaskScopes
217
+ * @see createMetaMaskClientInstanceManager
218
+ * @notInstrumented
219
+ */
220
+ const getMetaMaskSupportedNetworks = (client) => {
221
+ const { logger } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
222
+ const networks = (0, _dynamic_labs_sdk_client.getNetworksData)(client).filter((network) => SUPPORTED_METAMASK_CHAINS.includes(network.chain));
223
+ const supportedNetworks = {};
224
+ for (const network of networks) {
225
+ if (network.chain === "EVM") supportedNetworks[`eip155:${network.networkId}`] = network.rpcUrls.http[0];
226
+ if (network.chain === "SOL" && network.genesisHash) supportedNetworks[`solana:${network.genesisHash}`] = network.rpcUrls.http[0];
227
+ }
228
+ logger.debug("[MetaMask:Client] Resolved supported networks", { supportedNetworks });
229
+ return supportedNetworks;
230
+ };
231
+
232
+ //#endregion
233
+ //#region src/metaMaskStorage/createInitialMetaMaskStoreValue/createInitialMetaMaskStoreValue.ts
234
+ /**
235
+ * Builds the persisted store blob's value for when there is nothing stored
236
+ * yet, or after a clear. A function rather than a shared constant, so every
237
+ * caller gets its own object and can't mutate a value other callers rely on.
238
+ *
239
+ * @example
240
+ * ```ts
241
+ * const initial = createInitialMetaMaskStoreValue();
242
+ * // { entries: {}, schemaVersion: 1 }
243
+ * ```
244
+ *
245
+ * @returns A fresh, empty `MetaMaskStoreValue`.
246
+ * @see createMetaMaskStorageClient
247
+ * @see clearMetaMaskStorage
248
+ * @notInstrumented
249
+ */
250
+ const createInitialMetaMaskStoreValue = () => ({
251
+ entries: {},
252
+ schemaVersion: 1
253
+ });
254
+
255
+ //#endregion
256
+ //#region src/metaMaskStorage/queueMetaMaskStorageWrite/queueMetaMaskStorageWrite.ts
257
+ /**
258
+ * Single shared queue serializing every read-modify-write against
259
+ * `metaMaskStoreStorageKeySchema` -- `createMetaMaskStorageClient`'s adapter
260
+ * reads/writes/anonId operations and `clearMetaMaskStorage`'s reset all go
261
+ * through this same instance, so a write that started before a clear can't
262
+ * land after it and resurrect the data the clear was meant to erase.
263
+ *
264
+ * @example
265
+ * ```ts
266
+ * await queueMetaMaskStorageWrite(() => storage.setItem(key, value), client);
267
+ * ```
268
+ *
269
+ * @returns A `SequenceQueue` that runs one queued task at a time, in order.
270
+ * @see createMetaMaskStorageClient
271
+ * @see clearMetaMaskStorage
272
+ * @notInstrumented
273
+ */
274
+ const queueMetaMaskStorageWrite = (0, _dynamic_labs_sdk_client_core.createSequenceQueue)();
275
+
276
+ //#endregion
277
+ //#region src/metaMaskStorage/metaMaskStorage.schema.ts
278
+ /**
279
+ * Single storage key holding every value the MetaMask multichain SDK writes
280
+ * through our `StoreAdapter` (sessions, nonces, cached accounts/chain,
281
+ * pending pairing requests, transport ids, ...), keyed by whatever key string
282
+ * the SDK itself hands us -- the SDK controls every key name, including ones
283
+ * that embed an unpredictable id (`session:<id>`), so this can't be split
284
+ * into one storage key per SDK key.
285
+ *
286
+ * `entries[ANON_ID_ENTRY_KEY]` also lives in here, alongside `extensionId`
287
+ * and the other transport keys.
288
+ *
289
+ * `clearMetaMaskStorage` resets this key back to its initial value; nothing
290
+ * else needs to know the individual key names the SDK is using.
291
+ */
292
+ const metaMaskStoreStorageKeySchema = (0, _dynamic_labs_sdk_client_core.createStorageKeySchema)({
293
+ key: "metaMaskStore",
294
+ schema: zod_mini.object({
295
+ entries: zod_mini.record(zod_mini.string(), zod_mini.string()),
296
+ schemaVersion: zod_mini.literal(1)
297
+ })
298
+ });
299
+ /**
300
+ * Reserved `entries` key the MetaMask SDK itself never writes to, used to
301
+ * carry the SDK's anonymous analytics id inside the same store blob.
302
+ */
303
+ const ANON_ID_ENTRY_KEY = "anonId";
304
+
305
+ //#endregion
306
+ //#region src/metaMaskStorage/clearMetaMaskStorage/clearMetaMaskStorage.ts
307
+ const FAILED_TO_CLEAR_STORAGE_MESSAGE = "[MetaMask:Session] Failed to clear the persisted store; the next pairing may resume a stale session instead of showing a new one";
308
+ /**
309
+ * Resets the MetaMask SDK's persisted store blob back to its initial
310
+ * (empty) value, so the next connect call starts a fresh pairing and emits a
311
+ * `display_uri` instead of silently resuming a session that no longer works.
312
+ *
313
+ * @example
314
+ * ```ts
315
+ * await clearMetaMaskStorage(client);
316
+ * // Next connectWithMetaMaskUri call will emit a fresh URI immediately.
317
+ * ```
318
+ *
319
+ * @param client - The Dynamic client instance. Required (rather than
320
+ * defaulting to the last-initialized client) so a storage-clear failure is
321
+ * always logged against the client that actually requested it.
322
+ * @returns A promise that resolves once the blob is reset. Never rejects -- a
323
+ * storage failure must not take down the connect flow that depends on it.
324
+ * @see connectWithMetaMaskUri
325
+ * @see createMetaMaskStorageClient
326
+ * @notInstrumented
327
+ */
328
+ const clearMetaMaskStorage = async (client) => {
329
+ const { logger, storage } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
330
+ try {
331
+ await queueMetaMaskStorageWrite(() => storage.setItem(metaMaskStoreStorageKeySchema, createInitialMetaMaskStoreValue()), client);
332
+ logger.debug("[MetaMask:Session] Cleared persisted store");
333
+ } catch (error) {
334
+ logger.warn(FAILED_TO_CLEAR_STORAGE_MESSAGE, { error });
335
+ }
336
+ };
337
+
338
+ //#endregion
339
+ //#region src/errors/MetaMaskStorageError/MetaMaskStorageError.ts
340
+ /** Thrown when the underlying storage service rejects a read/write/delete for the MetaMask multichain client's own store (e.g. quota exceeded, private-browsing restrictions). */
341
+ var MetaMaskStorageError = class extends _dynamic_labs_sdk_client.BaseError {
342
+ constructor({ cause, key, operation }) {
343
+ super({
344
+ cause: cause instanceof Error ? cause : null,
345
+ code: "metamask_storage_error",
346
+ docsUrl: null,
347
+ name: "MetaMaskStorageError",
348
+ shortMessage: `Failed to ${operation} MetaMask multichain client storage key "${key}"`
349
+ });
350
+ }
351
+ };
352
+
353
+ //#endregion
354
+ //#region src/metaMaskStorage/createMetaMaskStorageClient/createMetaMaskStorageClient.ts
355
+ const TRANSPORT_TYPE_KEY = "multichain-transport";
356
+ const EXTENSION_ID_KEY = "extensionId";
357
+ /** Maps this SDK's platform literal onto the one `@metamask/connect-multichain`'s `StoreAdapter` expects. */
358
+ const toStoreAdapterPlatform = (platform) => platform === "react-native" ? "rn" : "web";
359
+ /**
360
+ * Builds a storage-service-backed store for the MetaMask multichain client,
361
+ * in place of its own default web adapter (IndexedDB) and React Native
362
+ * adapter (raw `AsyncStorage`), so every platform persists through the same
363
+ * core `Storage` service and `clearMetaMaskStorage` can reliably wipe it.
364
+ *
365
+ * The SDK controls every key name it reads/writes through `adapter`,
366
+ * including ones that embed an unpredictable id (`session:<id>`), so every
367
+ * key it uses is folded into a single stored blob (`metaMaskStoreStorageKeySchema`)
368
+ * rather than one storage key per SDK key. `DEBUG` is never persisted at all,
369
+ * answered live from the client's own logger.
370
+ *
371
+ * @example
372
+ * ```ts
373
+ * const storeClient = createMetaMaskStorageClient(client);
374
+ * const multichainClient = createMultichainClient({ storage: storeClient });
375
+ * ```
376
+ *
377
+ * @returns A `StoreClient` backed by the client's core `Storage` service.
378
+ * @throws {MetaMaskStorageError} If the underlying `Storage` service's
379
+ * `getItem`/`setItem` calls fail for any of the adapter's read/write/delete
380
+ * operations.
381
+ * @see createInitialMetaMaskStoreValue
382
+ * @see clearMetaMaskStorage
383
+ * @notInstrumented
384
+ */
385
+ const createMetaMaskStorageClient = (client) => {
386
+ const { logger, storage } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
387
+ const read = async (key) => {
388
+ try {
389
+ const { entries } = await storage.getItem(metaMaskStoreStorageKeySchema) ?? createInitialMetaMaskStoreValue();
390
+ return entries[key] ?? null;
391
+ } catch (error) {
392
+ throw new MetaMaskStorageError({
393
+ cause: error,
394
+ key,
395
+ operation: "get"
396
+ });
397
+ }
398
+ };
399
+ const write = async (key, value) => {
400
+ try {
401
+ await queueMetaMaskStorageWrite(async () => {
402
+ const current = await storage.getItem(metaMaskStoreStorageKeySchema) ?? createInitialMetaMaskStoreValue();
403
+ await storage.setItem(metaMaskStoreStorageKeySchema, {
404
+ ...current,
405
+ entries: {
406
+ ...current.entries,
407
+ [key]: value
408
+ }
409
+ });
410
+ }, client);
411
+ } catch (error) {
412
+ throw new MetaMaskStorageError({
413
+ cause: error,
414
+ key,
415
+ operation: "set"
416
+ });
417
+ }
418
+ };
419
+ const remove = async (key) => {
420
+ try {
421
+ await queueMetaMaskStorageWrite(async () => {
422
+ const current = await storage.getItem(metaMaskStoreStorageKeySchema) ?? createInitialMetaMaskStoreValue();
423
+ const remainingEntries = Object.fromEntries(Object.entries(current.entries).filter(([entryKey]) => entryKey !== key));
424
+ await storage.setItem(metaMaskStoreStorageKeySchema, {
425
+ ...current,
426
+ entries: remainingEntries
427
+ });
428
+ }, client);
429
+ } catch (error) {
430
+ throw new MetaMaskStorageError({
431
+ cause: error,
432
+ key,
433
+ operation: "delete"
434
+ });
435
+ }
436
+ };
437
+ const adapter = {
438
+ delete: remove,
439
+ get: read,
440
+ platform: toStoreAdapterPlatform((0, _dynamic_labs_sdk_client_core.getPlatform)()),
441
+ set: write
442
+ };
443
+ return {
444
+ adapter,
445
+ getAnonId: () => queueMetaMaskStorageWrite(async () => {
446
+ const current = await storage.getItem(metaMaskStoreStorageKeySchema) ?? createInitialMetaMaskStoreValue();
447
+ const existing = current.entries[ANON_ID_ENTRY_KEY];
448
+ if (existing) return existing;
449
+ const anonId = crypto.randomUUID();
450
+ await storage.setItem(metaMaskStoreStorageKeySchema, {
451
+ ...current,
452
+ entries: {
453
+ ...current.entries,
454
+ [ANON_ID_ENTRY_KEY]: anonId
455
+ }
456
+ });
457
+ return anonId;
458
+ }, client),
459
+ getDebug: () => Promise.resolve(logger.isEnabled("debug") ? "metamask-sdk:*" : null),
460
+ getExtensionId: () => adapter.get(EXTENSION_ID_KEY),
461
+ getTransportType: async () => {
462
+ const value = await adapter.get(TRANSPORT_TYPE_KEY);
463
+ return value ? (0, _metamask_connect_multichain.getTransportType)(value) : null;
464
+ },
465
+ removeAnonId: () => remove(ANON_ID_ENTRY_KEY),
466
+ removeExtensionId: () => adapter.delete(EXTENSION_ID_KEY),
467
+ removeTransportType: () => adapter.delete(TRANSPORT_TYPE_KEY),
468
+ setAnonId: (anonId) => write(ANON_ID_ENTRY_KEY, anonId),
469
+ setExtensionId: (extensionId) => adapter.set(EXTENSION_ID_KEY, extensionId),
470
+ setTransportType: (transportType) => adapter.set(TRANSPORT_TYPE_KEY, transportType)
471
+ };
472
+ };
473
+
474
+ //#endregion
475
+ //#region src/utils/clearMetaMaskSdkSingleton/clearMetaMaskSdkSingleton.ts
476
+ const METAMASK_SDK_SINGLETON_GLOBAL_KEY = "__METAMASK_CONNECT_MULTICHAIN_SINGLETON__";
477
+ /**
478
+ * Deletes the upstream `@metamask/connect-multichain` SDK's own cached
479
+ * client instance off `globalThis`.
480
+ *
481
+ * The SDK's `createMultichainClient` reuses a private `globalThis` singleton
482
+ * and only merges in a subset of options on repeat calls -- notably not
483
+ * `storage` -- so it keeps talking to its original `StoreAdapter` even after
484
+ * a fresh `clearMetaMaskStorage` call. Deleting this key forces a genuinely
485
+ * new instance (and storage adapter) on the next `createMultichainClient` call.
486
+ *
487
+ * @example
488
+ * ```ts
489
+ * clearMetaMaskSdkSingleton();
490
+ * // Next createMultichainClient call builds a fresh client and adapter.
491
+ * ```
492
+ *
493
+ * @returns Nothing -- the singleton key is deleted synchronously.
494
+ * @see createMetaMaskClientInstanceManager
495
+ * @see clearMetaMaskStorage
496
+ * @notInstrumented
497
+ */
498
+ const clearMetaMaskSdkSingleton = () => {
499
+ delete globalThis[METAMASK_SDK_SINGLETON_GLOBAL_KEY];
500
+ };
501
+
502
+ //#endregion
503
+ //#region src/utils/createMetaMaskPreferredOpenLink/createMetaMaskPreferredOpenLink.ts
504
+ /**
505
+ * Builds the `preferredOpenLink` callback handed to `@metamask/connect-multichain`,
506
+ * routing wallet deeplinks through the core `deeplink` service instead of the
507
+ * SDK's own default handling, so every platform (web, React Native, Expo)
508
+ * opens them the same way the rest of the SDK does.
509
+ *
510
+ * @example
511
+ * ```ts
512
+ * const preferredOpenLink = createMetaMaskPreferredOpenLink(client);
513
+ * preferredOpenLink('https://metamask.app.link/...');
514
+ * ```
515
+ *
516
+ * @returns A callback that opens a MetaMask-issued deeplink through the
517
+ * core `deeplink` service.
518
+ * @see createMetaMaskClientInstanceManager
519
+ * @see createMetaMaskStorageClient
520
+ * @notInstrumented
521
+ */
522
+ const createMetaMaskPreferredOpenLink = (client) => (deeplink) => {
523
+ const { logger, openDeeplink } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
524
+ logger.debug("[MetaMask:Client] Opening MetaMask deeplink", { deeplink });
525
+ openDeeplink(deeplink).then(() => logger.debug("[MetaMask:Client] Deeplink opened")).catch((error) => logger.error("[MetaMask:Client] Failed to open deeplink", {
526
+ deeplink,
527
+ error
528
+ }));
529
+ };
530
+
531
+ //#endregion
532
+ //#region src/metaMaskClientInstanceManager/createMetaMaskClientInstanceManager/createMetaMaskClientInstanceManager.ts
533
+ /**
534
+ * Creates the per-client manager that lazily builds, tears down, and rebuilds
535
+ * the shared `@metamask/connect-multichain` client instance, and forwards its
536
+ * `display_uri` event to callers that don't hold a reference to the raw SDK
537
+ * client.
538
+ *
539
+ * @example
540
+ * ```ts
541
+ * const manager = createMetaMaskClientInstanceManager(client);
542
+ * const metaMaskClient = await manager.getMetaMaskClient();
543
+ * ```
544
+ *
545
+ * @returns A `MetaMaskClientInstanceManager` scoped to `client`.
546
+ * @throws {MetaMaskClientNotInitializedError} From `getMetaMaskClient` if a
547
+ * build was never started -- a defensive guard, since `refreshMetaMaskClient`
548
+ * always starts one. A build that starts but fails instead rejects
549
+ * `getMetaMaskClient()` with its original error.
550
+ * @see createMetaMaskStorageClient
551
+ * @see clearMetaMaskStorage
552
+ * @notInstrumented
553
+ */
554
+ const createMetaMaskClientInstanceManager = (client) => {
555
+ let metaMaskClientPromise;
556
+ let clearEventListeners;
557
+ const { logger } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
558
+ const events = (0, _dynamic_labs_sdk_client_core.createEventEmitter)();
559
+ const refreshMetaMaskClient = () => {
560
+ if (metaMaskClientPromise) return;
561
+ const { appName, appLogoUrl, appUniversalLink, appNativeLink } = (0, _dynamic_labs_sdk_client_core.getAppMetadata)(client);
562
+ const supportedNetworks = getMetaMaskSupportedNetworks(client);
563
+ const nativeScheme = (0, _dynamic_labs_sdk_client_core.getNativeLinkScheme)({ nativeLink: appNativeLink });
564
+ const debug = logger.isEnabled("debug");
565
+ logger.debug("[MetaMask:Client] Creating MetaMask client", {
566
+ appLogoUrl,
567
+ appName,
568
+ appUniversalLink,
569
+ debug,
570
+ nativeScheme,
571
+ supportedNetworks
572
+ });
573
+ if (clearEventListeners) clearEventListeners();
574
+ clearMetaMaskSdkSingleton();
575
+ const builtClientPromise = (0, _metamask_connect_multichain.createMultichainClient)({
576
+ api: { supportedNetworks },
577
+ dapp: {
578
+ iconUrl: appLogoUrl,
579
+ name: appName,
580
+ nativeScheme,
581
+ url: appUniversalLink ?? ""
582
+ },
583
+ debug,
584
+ mobile: { preferredOpenLink: createMetaMaskPreferredOpenLink(client) },
585
+ storage: createMetaMaskStorageClient(client),
586
+ ui: { headless: true }
587
+ }).then((metaMaskClient) => {
588
+ const createEventMapper = (event) => {
589
+ return (...args) => {
590
+ logger.debug(`[MetaMask:Events] ${event} event received`, { args });
591
+ events.emit(event, ...args);
592
+ };
593
+ };
594
+ const onDisplayUri = createEventMapper("display_uri");
595
+ metaMaskClient.on("display_uri", onDisplayUri);
596
+ const detachListeners = () => {
597
+ metaMaskClient.off("display_uri", onDisplayUri);
598
+ };
599
+ if (metaMaskClientPromise !== builtClientPromise) {
600
+ detachListeners();
601
+ return metaMaskClient;
602
+ }
603
+ clearEventListeners = detachListeners;
604
+ return metaMaskClient;
605
+ });
606
+ metaMaskClientPromise = builtClientPromise;
607
+ builtClientPromise.catch(() => {
608
+ if (metaMaskClientPromise === builtClientPromise) metaMaskClientPromise = null;
609
+ });
610
+ };
611
+ return {
612
+ clearMetaMaskStorageAndInstance: async () => {
613
+ await clearMetaMaskStorage(client);
614
+ metaMaskClientPromise = null;
615
+ refreshMetaMaskClient();
616
+ },
617
+ events,
618
+ getMetaMaskClient: async () => {
619
+ if (!metaMaskClientPromise) refreshMetaMaskClient();
620
+ if (!metaMaskClientPromise) throw new MetaMaskClientNotInitializedError();
621
+ return metaMaskClientPromise;
622
+ }
623
+ };
624
+ };
625
+
626
+ //#endregion
627
+ //#region src/metaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager.ts
628
+ const META_MASK_CLIENT_INSTANCE_MANAGER_KEY = "META_MASK_CLIENT_INSTANCE_MANAGER";
629
+ /**
630
+ * Returns this client's `MetaMaskClientInstanceManager`, creating it on first
631
+ * access. Every chain's MetaMask wallet provider (EVM, Solana, ...) calls
632
+ * this to reach the SAME manager -- and therefore the same shared multichain
633
+ * session -- rather than each building its own.
634
+ *
635
+ * @example
636
+ * ```ts
637
+ * const manager = getOrCreateMetaMaskClientInstanceManager(client);
638
+ * const metaMaskClient = await manager.getMetaMaskClient();
639
+ * ```
640
+ * @param client - The Dynamic client instance.
641
+ * @returns The client's `MetaMaskClientInstanceManager`.
642
+ * @see createMetaMaskClientInstanceManager
643
+ * @see disconnectMetaMaskWalletProvider
644
+ */
645
+ const getOrCreateMetaMaskClientInstanceManager = (0, _dynamic_labs_sdk_client_core.createRuntimeServiceAccessKey)(META_MASK_CLIENT_INSTANCE_MANAGER_KEY, (client) => createMetaMaskClientInstanceManager(client));
646
+
647
+ //#endregion
648
+ Object.defineProperty(exports, 'MetaMaskUnscopedNetworkError', {
649
+ enumerable: true,
650
+ get: function () {
651
+ return MetaMaskUnscopedNetworkError;
652
+ }
653
+ });
654
+ Object.defineProperty(exports, 'SUPPORTED_METAMASK_CHAINS', {
655
+ enumerable: true,
656
+ get: function () {
657
+ return SUPPORTED_METAMASK_CHAINS;
658
+ }
659
+ });
660
+ Object.defineProperty(exports, 'UnsupportedMetaMaskChainError', {
661
+ enumerable: true,
662
+ get: function () {
663
+ return UnsupportedMetaMaskChainError;
664
+ }
665
+ });
666
+ Object.defineProperty(exports, '__toESM', {
667
+ enumerable: true,
668
+ get: function () {
669
+ return __toESM;
670
+ }
671
+ });
672
+ Object.defineProperty(exports, 'clearMetaMaskStorage', {
673
+ enumerable: true,
674
+ get: function () {
675
+ return clearMetaMaskStorage;
676
+ }
677
+ });
678
+ Object.defineProperty(exports, 'getMetaMaskScopeForNetworkId', {
679
+ enumerable: true,
680
+ get: function () {
681
+ return getMetaMaskScopeForNetworkId;
682
+ }
683
+ });
684
+ Object.defineProperty(exports, 'getMetaMaskScopes', {
685
+ enumerable: true,
686
+ get: function () {
687
+ return getMetaMaskScopes;
688
+ }
689
+ });
690
+ Object.defineProperty(exports, 'getOrCreateMetaMaskClientInstanceManager', {
691
+ enumerable: true,
692
+ get: function () {
693
+ return getOrCreateMetaMaskClientInstanceManager;
694
+ }
695
+ });
696
+ Object.defineProperty(exports, 'name', {
697
+ enumerable: true,
698
+ get: function () {
699
+ return name;
700
+ }
701
+ });
702
+ Object.defineProperty(exports, 'version', {
703
+ enumerable: true,
704
+ get: function () {
705
+ return version;
706
+ }
707
+ });
708
+ //# sourceMappingURL=getOrCreateMetaMaskClientInstanceManager-l6T7WUT5.cjs.map