@dynamic-labs-sdk/evm 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 (98) hide show
  1. package/README.md +22 -0
  2. package/dist/baseAccount.cjs +1 -1
  3. package/dist/baseAccount.esm.js +1 -1
  4. package/dist/baseAccount.native.esm.js +1 -1
  5. package/dist/core.cjs +1 -1
  6. package/dist/core.esm.js +1 -1
  7. package/dist/core.native.esm.js +1 -1
  8. package/dist/eip6963.cjs +1 -1
  9. package/dist/eip6963.esm.js +1 -1
  10. package/dist/eip6963.native.esm.js +1 -1
  11. package/dist/errors/MetaMaskDirectConnectNotSupportedError/MetaMaskDirectConnectNotSupportedError.d.ts +14 -0
  12. package/dist/errors/MetaMaskDirectConnectNotSupportedError/MetaMaskDirectConnectNotSupportedError.d.ts.map +1 -0
  13. package/dist/errors/MetaMaskDirectConnectNotSupportedError/index.d.ts +2 -0
  14. package/dist/errors/MetaMaskDirectConnectNotSupportedError/index.d.ts.map +1 -0
  15. package/dist/exports/metamask.d.ts +2 -0
  16. package/dist/exports/metamask.d.ts.map +1 -1
  17. package/dist/index.cjs +1 -1
  18. package/dist/index.esm.js +1 -1
  19. package/dist/index.native.esm.js +1 -1
  20. package/dist/metamask/addMetaMaskEvmExtension/addMetaMaskEvmExtension.d.ts +23 -0
  21. package/dist/metamask/addMetaMaskEvmExtension/addMetaMaskEvmExtension.d.ts.map +1 -0
  22. package/dist/metamask/addMetaMaskEvmExtension/index.d.ts +2 -0
  23. package/dist/metamask/addMetaMaskEvmExtension/index.d.ts.map +1 -0
  24. package/dist/metamask/connectAndVerifyWithMetaMaskUriEvm/connectAndVerifyWithMetaMaskUriEvm.d.ts.map +1 -1
  25. package/dist/metamask/connectWithMetaMaskUriEvm/connectWithMetaMaskUriEvm.d.ts.map +1 -1
  26. package/dist/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.d.ts +20 -3
  27. package/dist/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.d.ts.map +1 -1
  28. package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/getMetaMaskEvmSdkWalletProviderKey.d.ts +17 -0
  29. package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/getMetaMaskEvmSdkWalletProviderKey.d.ts.map +1 -0
  30. package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/index.d.ts +2 -0
  31. package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/index.d.ts.map +1 -0
  32. package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/index.d.ts +2 -0
  33. package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/index.d.ts.map +1 -0
  34. package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/warnMetaMaskEvmIntegrationIncomplete.d.ts +18 -0
  35. package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/warnMetaMaskEvmIntegrationIncomplete.d.ts.map +1 -0
  36. package/dist/metamask.cjs +199 -247
  37. package/dist/metamask.cjs.map +1 -1
  38. package/dist/metamask.esm.js +201 -251
  39. package/dist/metamask.esm.js.map +1 -1
  40. package/dist/metamask.native.esm.js +201 -251
  41. package/dist/metamask.native.esm.js.map +1 -1
  42. package/dist/{package--hhb8lj2.native.esm.js → package-BnSw-03C.native.esm.js} +2 -2
  43. package/dist/package-BnSw-03C.native.esm.js.map +1 -0
  44. package/dist/{package-CIdQu8lB.cjs → package-Dk-SYXOE.cjs} +2 -2
  45. package/dist/package-Dk-SYXOE.cjs.map +1 -0
  46. package/dist/{package-D0IvC55z.esm.js → package-DrSY9NJE.esm.js} +2 -2
  47. package/dist/package-DrSY9NJE.esm.js.map +1 -0
  48. package/dist/tempo.cjs +1 -1
  49. package/dist/tempo.esm.js +1 -1
  50. package/dist/tempo.native.esm.js +1 -1
  51. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  52. package/dist/viem.cjs +1 -1
  53. package/dist/viem.esm.js +1 -1
  54. package/dist/viem.native.esm.js +1 -1
  55. package/dist/waas.cjs +1 -1
  56. package/dist/waas.esm.js +1 -1
  57. package/dist/waas.native.esm.js +1 -1
  58. package/dist/walletConnect.cjs +17 -4
  59. package/dist/walletConnect.cjs.map +1 -1
  60. package/dist/walletConnect.esm.js +16 -3
  61. package/dist/walletConnect.esm.js.map +1 -1
  62. package/dist/walletConnect.native.esm.js +16 -3
  63. package/dist/walletConnect.native.esm.js.map +1 -1
  64. package/dist/windowInjected.cjs +1 -1
  65. package/dist/windowInjected.esm.js +1 -1
  66. package/dist/windowInjected.native.esm.js +1 -1
  67. package/package.json +5 -6
  68. package/dist/getEvmNetworksData-CGZjI4hV.native.esm.js +0 -18
  69. package/dist/getEvmNetworksData-CGZjI4hV.native.esm.js.map +0 -1
  70. package/dist/getEvmNetworksData-ChkgLvCg.esm.js +0 -18
  71. package/dist/getEvmNetworksData-ChkgLvCg.esm.js.map +0 -1
  72. package/dist/getEvmNetworksData-DBJIMiOH.cjs +0 -23
  73. package/dist/getEvmNetworksData-DBJIMiOH.cjs.map +0 -1
  74. package/dist/metamask/metamask.types.d.ts +0 -14
  75. package/dist/metamask/metamask.types.d.ts.map +0 -1
  76. package/dist/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.d.ts +0 -18
  77. package/dist/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.d.ts.map +0 -1
  78. package/dist/metamask/utils/createMetaMaskEvmController/index.d.ts +0 -2
  79. package/dist/metamask/utils/createMetaMaskEvmController/index.d.ts.map +0 -1
  80. package/dist/metamask/utils/getOrCreateMetaMaskEvmController/getOrCreateMetaMaskEvmController.d.ts +0 -27
  81. package/dist/metamask/utils/getOrCreateMetaMaskEvmController/getOrCreateMetaMaskEvmController.d.ts.map +0 -1
  82. package/dist/metamask/utils/getOrCreateMetaMaskEvmController/index.d.ts +0 -2
  83. package/dist/metamask/utils/getOrCreateMetaMaskEvmController/index.d.ts.map +0 -1
  84. package/dist/metamask/utils/getSupportedNetworks/getSupportedNetworks.d.ts +0 -6
  85. package/dist/metamask/utils/getSupportedNetworks/getSupportedNetworks.d.ts.map +0 -1
  86. package/dist/metamask/utils/getSupportedNetworks/index.d.ts +0 -2
  87. package/dist/metamask/utils/getSupportedNetworks/index.d.ts.map +0 -1
  88. package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/index.d.ts +0 -3
  89. package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/index.d.ts.map +0 -1
  90. package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/subscribeMetaMaskEvmFacadeListener.d.ts +0 -40
  91. package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/subscribeMetaMaskEvmFacadeListener.d.ts.map +0 -1
  92. package/dist/metamask/utils/warnWhenChainNotConfigured/index.d.ts +0 -3
  93. package/dist/metamask/utils/warnWhenChainNotConfigured/index.d.ts.map +0 -1
  94. package/dist/metamask/utils/warnWhenChainNotConfigured/warnWhenChainNotConfigured.d.ts +0 -28
  95. package/dist/metamask/utils/warnWhenChainNotConfigured/warnWhenChainNotConfigured.d.ts.map +0 -1
  96. package/dist/package--hhb8lj2.native.esm.js.map +0 -1
  97. package/dist/package-CIdQu8lB.cjs.map +0 -1
  98. package/dist/package-D0IvC55z.esm.js.map +0 -1
@@ -1,216 +1,59 @@
1
- import { n as version, t as name } from "./package-D0IvC55z.esm.js";
1
+ import { n as version, t as name } from "./package-DrSY9NJE.esm.js";
2
2
  import { s as registerEvmNetworkProviderBuilder } from "./evmTransferAmount-BQy79Fgj.esm.js";
3
3
  import "./createPublicClientFromNetworkData-CKikh3WW.esm.js";
4
4
  import { t as createWalletProviderFromEIP1193Provider } from "./createWalletProviderFromEIP1193Provider-HOkyZ1dS.esm.js";
5
- import { t as getEvmNetworksData } from "./getEvmNetworksData-ChkgLvCg.esm.js";
6
5
  import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
7
- import { getDefaultClient, verifyWalletAccount } from "@dynamic-labs-sdk/client";
8
- import { DYNAMIC_ICONIC_SPRITE_URL, assertNonEmptyArray, createRuntimeServiceAccessKey, getAppMetadata, getCore, getNativeLinkScheme } from "@dynamic-labs-sdk/client/core";
6
+ import { BaseError, getDefaultClient, verifyWalletAccount } from "@dynamic-labs-sdk/client";
7
+ import { DYNAMIC_ICONIC_SPRITE_URL, formatWalletProviderKey, getActiveNetworkIdFromLastKnownRegistry, getCore, getDefaultClient as getDefaultClient$1, hasExtension as hasExtension$1, registerExtension, switchActiveNetworkInLastKnownRegistry } from "@dynamic-labs-sdk/client/core";
9
8
  import { WalletProviderEnum } from "@dynamic-labs/sdk-api-core";
10
- import { MetaMaskDisplayUriMissingError, MetaMaskWalletNotConnectedError, clearMetaMaskSessionStorage, connectWithMetaMaskUri, getMetaMaskExtensionWalletProviderKey } from "@dynamic-labs-sdk/metamask";
11
- import { createEVMClient } from "@metamask/connect-evm";
9
+ import { assertMetaMaskNetworkIsGranted, createMetaMaskWalletProviderEventEmitter, disconnectMetaMaskWalletProvider, getOrCreateMetaMaskClientInstanceManager, reconcileMetaMaskWalletProvider, resolveActiveMetaMaskScope } from "@dynamic-labs-sdk/metamask/core";
10
+ import { MetaMaskDisplayUriMissingError, connectWithMetaMaskUri, getMetaMaskExtensionWalletProviderKey } from "@dynamic-labs-sdk/metamask";
12
11
 
13
- //#region src/metamask/utils/getSupportedNetworks/getSupportedNetworks.ts
14
- /** @notInstrumented */
15
- const getSupportedNetworks = (client) => {
16
- const evmNetworks = getEvmNetworksData(client).sort((a, b) => {
17
- if (a.networkId === "1") return -1;
18
- if (b.networkId === "1") return 1;
19
- return 0;
20
- });
21
- assertNonEmptyArray(evmNetworks, "No EVM networks have been configured. Make sure to add at least one EVM network to your project settings in the Dynamic Dashboard.");
22
- const supportedNetworks = {};
23
- for (const network of evmNetworks) {
24
- const hexChainId = `0x${Number.parseInt(network.networkId, 10).toString(16)}`;
25
- supportedNetworks[hexChainId] = network.rpcUrls.http[0];
26
- }
27
- return supportedNetworks;
28
- };
29
-
30
- //#endregion
31
- //#region src/metamask/utils/warnWhenChainNotConfigured/warnWhenChainNotConfigured.ts
32
- /**
33
- * Warns when the chain MetaMask reports -- via its `connect` or
34
- * `chainChanged` events -- is not among the project's configured EVM
35
- * networks. MetaMask's SDK gates every signing request
36
- * (`personal_sign`, `eth_sendTransaction`, `eth_signTypedData_v4`) on
37
- * `supportedNetworks` and throws before the wallet is ever contacted when
38
- * the chain isn't listed, while `eth_accounts`/`eth_chainId` bypass that
39
- * gate entirely -- so connect appears to succeed and only signing fails,
40
- * with no deeplink and no obvious cause. This warn surfaces the mismatch
41
- * the moment it arises instead of leaving it to be diagnosed from a
42
- * cryptic signing failure.
43
- * @notInstrumented
44
- */
45
- const warnWhenChainNotConfigured = ({ chainId, supportedNetworks }, client) => {
46
- const configuredChainIds = Object.keys(supportedNetworks);
47
- if (configuredChainIds.includes(chainId)) return;
48
- getCore(client).logger.warn(`[metamask] Wallet chain ${chainId} is not in the project's configured EVM networks (${configuredChainIds.join(", ")}). Signing requests will fail before MetaMask opens until this network is added to your project's EVM networks in the Dynamic Dashboard.`);
49
- };
50
-
51
- //#endregion
52
- //#region src/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.ts
12
+ //#region src/errors/MetaMaskDirectConnectNotSupportedError/MetaMaskDirectConnectNotSupportedError.ts
53
13
  /**
54
- * Builds a fully-initialised `MetaMaskEvmController` for the given Dynamic
55
- * client. Runs the SDK in headless mode so consumers render their own QR /
56
- * deep-link surface, and registers `display_uri` handling as an
57
- * `eventHandlers` callback at construction time so the first URI emission
58
- * cannot be lost to a subscription race. Dapp metadata is sourced from the
59
- * client's `getAppMetadata`. The MWP deep-link hand-off is routed through the
60
- * client's configured `openDeeplink`, so this works on both web and native.
61
- * The MetaMask SDK's own verbose logging is tied to the Dynamic client's log
62
- * level, so turning on `debug` logging for the Dynamic SDK also surfaces
63
- * MetaMask's internal SDK trace output.
64
- *
65
- * @notInstrumented
14
+ * Thrown when `connect()` is called directly on the MetaMask SDK placeholder
15
+ * wallet provider (the entry `addMetaMaskEvmExtension` registers so MetaMask
16
+ * still shows up in the wallet picker when no browser extension is
17
+ * installed). That placeholder has no generic connect flow of its own --
18
+ * connecting requires the QR / deeplink pairing flow, so callers must drive
19
+ * `connectWithMetaMaskUriEvm` (or `connectAndVerifyWithMetaMaskUriEvm`)
20
+ * instead of the picker's default connect.
66
21
  */
67
- const createMetaMaskEvmController = async (client) => {
68
- const supportedNetworks = getSupportedNetworks(client);
69
- const { appName, appLogoUrl, appUniversalLink, appNativeLink } = getAppMetadata(client);
70
- const { logger } = getCore(client);
71
- await clearMetaMaskSessionStorage(client);
72
- const listeners = /* @__PURE__ */ new Set();
73
- let latestDisplayUri;
74
- const sdk = await createEVMClient({
75
- api: { supportedNetworks },
76
- dapp: {
77
- iconUrl: appLogoUrl,
78
- name: appName,
79
- nativeScheme: getNativeLinkScheme({ nativeLink: appNativeLink }),
80
- url: appUniversalLink ?? ""
81
- },
82
- debug: logger.isEnabled("debug"),
83
- eventHandlers: {
84
- chainChanged: (chainId) => {
85
- warnWhenChainNotConfigured({
86
- chainId,
87
- supportedNetworks
88
- }, client);
89
- },
90
- connect: ({ chainId }) => {
91
- latestDisplayUri = void 0;
92
- warnWhenChainNotConfigured({
93
- chainId,
94
- supportedNetworks
95
- }, client);
96
- },
97
- disconnect: () => {
98
- latestDisplayUri = void 0;
99
- },
100
- displayUri: (uri) => {
101
- latestDisplayUri = uri;
102
- for (const listener of listeners) listener(uri);
103
- }
104
- },
105
- mobile: { preferredOpenLink: (deeplink) => {
106
- const { logger: logger$1 } = getCore(client);
107
- logger$1.debug("[metamask] opening MWP deeplink", deeplink);
108
- getCore(client).openDeeplink(deeplink).then(() => {
109
- logger$1.debug("[metamask] opened MWP deeplink", deeplink);
110
- }).catch((error) => {
111
- logger$1.warn("[metamask] failed to open MWP deeplink", error);
112
- });
113
- } },
114
- ui: {
115
- headless: true,
116
- preferExtension: true
117
- }
118
- });
119
- latestDisplayUri = void 0;
120
- const onDisplayUri = (listener) => {
121
- listeners.add(listener);
122
- if (latestDisplayUri !== void 0) listener(latestDisplayUri);
123
- return () => {
124
- listeners.delete(listener);
125
- };
126
- };
127
- const chainIds = Object.keys(supportedNetworks);
128
- let inFlightConnect = null;
129
- const connect = () => {
130
- if (inFlightConnect) return inFlightConnect;
131
- inFlightConnect = (async () => {
132
- try {
133
- if (sdk.status === "connecting") try {
134
- await sdk.disconnect();
135
- } catch (error) {
136
- getCore(client).logger.debug("[metamask] pre-connect disconnect rejected (expected when aborting a pairing the wallet never accepted)", error);
137
- }
138
- await sdk.connect({ chainIds });
139
- } finally {
140
- inFlightConnect = null;
141
- }
142
- })();
143
- return inFlightConnect;
144
- };
145
- return {
146
- clearCachedDisplayUri: () => {
147
- latestDisplayUri = void 0;
148
- },
149
- connect,
150
- getLatestDisplayUri: () => latestDisplayUri,
151
- onDisplayUri,
152
- sdk
153
- };
22
+ var MetaMaskDirectConnectNotSupportedError = class extends BaseError {
23
+ constructor() {
24
+ super({
25
+ cause: null,
26
+ code: "metamask_direct_connect_not_supported",
27
+ docsUrl: null,
28
+ name: "MetaMaskDirectConnectNotSupportedError",
29
+ shortMessage: "MetaMask cannot be connected directly; call connectWithMetaMaskUriEvm (or connectAndVerifyWithMetaMaskUriEvm) to get a QR/URI pairing flow instead"
30
+ });
31
+ }
154
32
  };
155
33
 
156
34
  //#endregion
157
- //#region src/metamask/utils/getOrCreateMetaMaskEvmController/getOrCreateMetaMaskEvmController.ts
158
- const RUNTIME_SERVICE_KEY = "metaMaskEvmController";
159
- /**
160
- * Per-`DynamicClient` accessor for the lazily-constructed MetaMask EVM
161
- * controller. Wraps `createMetaMaskEvmController` with the standard
162
- * `runtimeServices` cache so every caller — the EIP-1193 wallet-provider
163
- * façade, the `display_uri` subscription helper, and the
164
- * `connectWithMetaMaskEvm` URI-returning helper — shares the same
165
- * controller (and therefore the same SDK instance, display-URI cache, and
166
- * listener registry) per Dynamic client.
167
- *
168
- * This matches the pattern used by the WalletConnect `getSignClient`
169
- * accessor: the first call triggers construction; subsequent calls
170
- * (within the same client) return the cached promise without re-running
171
- * the builder.
172
- *
173
- * The cache is **per-Dynamic-client, not per-SDK-instance**:
174
- * `@metamask/connect-evm`'s `createEVMClient` is itself a singleton —
175
- * a second call returns the same underlying SDK — so when multiple
176
- * Dynamic clients coexist they end up sharing the same MetaMask SDK
177
- * instance (and therefore the same active pairing session) regardless
178
- * of this cache. The wrapper exists to own the controller's
179
- * `display_uri` cache and listener registry per Dynamic client, which
180
- * the SDK itself does not expose.
181
- *
182
- * @notInstrumented
183
- */
184
- const getOrCreateMetaMaskEvmController = createRuntimeServiceAccessKey(RUNTIME_SERVICE_KEY, (client) => createMetaMaskEvmController(client));
185
-
186
- //#endregion
187
- //#region src/metamask/utils/subscribeMetaMaskEvmFacadeListener/subscribeMetaMaskEvmFacadeListener.ts
188
- const NOOP_UNSUBSCRIBE = () => void 0;
35
+ //#region src/metamask/getMetaMaskEvmSdkWalletProviderKey/getMetaMaskEvmSdkWalletProviderKey.ts
36
+ const METAMASK_EVM_SDK_DISPLAY_NAME = "MetaMask";
189
37
  /**
190
- * Subscribes a facade listener to the underlying MetaMask SDK provider,
191
- * forwarding events through per-event adapters:
192
- *
193
- * - `accountsChanged` — clones the readonly addresses array
194
- * `@metamask/connect-evm` hands the listener, since the Dynamic SDK
195
- * facade contract emits a mutable `Address[]`.
196
- * - `chainChanged` — passes the chain id through verbatim.
197
- * - `disconnected` — bridged to the SDK's canonical `disconnect`
198
- * event, which the SDK actually emits.
199
- *
200
- * Returns the unsubscribe function returned by the SDK provider so the
201
- * caller can clean it up later (for example, when the facade's
202
- * `removeAllListeners` is invoked).
38
+ * Deterministic wallet provider key for the MetaMask SDK's connect-less EVM
39
+ * placeholder. Computed without building the wallet provider itself, so
40
+ * `addMetaMaskEvmExtension` can check for a matching wallet account before
41
+ * paying the cost of `createMetaMaskEvmWalletProvider`.
203
42
  *
43
+ * @example
44
+ * ```ts
45
+ * const key = getMetaMaskEvmSdkWalletProviderKey();
46
+ * ```
47
+ * @returns The deterministic wallet provider key.
48
+ * @see createMetaMaskEvmWalletProvider
49
+ * @see reconcileMetaMaskWalletProvider
204
50
  * @notInstrumented
205
51
  */
206
- const subscribeMetaMaskEvmFacadeListener = ({ client, pending, provider }) => {
207
- if (pending.event === "accountsChanged") return provider.on("accountsChanged", (addresses) => pending.listener([...addresses]));
208
- if (pending.event === "chainChanged") return provider.on("chainChanged", (chainId) => pending.listener(chainId));
209
- if (pending.event === "disconnected") return provider.on("disconnect", () => pending.listener());
210
- const exhaustiveCheck = pending;
211
- getCore(client).logger.debug("[metamask] subscribeMetaMaskEvmFacadeListener: unhandled event", exhaustiveCheck.event);
212
- return NOOP_UNSUBSCRIBE;
213
- };
52
+ const getMetaMaskEvmSdkWalletProviderKey = () => formatWalletProviderKey({
53
+ chain: "EVM",
54
+ displayName: METAMASK_EVM_SDK_DISPLAY_NAME,
55
+ walletProviderType: WalletProviderEnum.QrCode
56
+ });
214
57
 
215
58
  //#endregion
216
59
  //#region src/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.ts
@@ -219,70 +62,149 @@ const METAMASK_ICON = `${DYNAMIC_ICONIC_SPRITE_URL}#metamask`;
219
62
  /**
220
63
  * Builds the `EvmWalletProvider` registered AFTER a successful MetaMask
221
64
  * SDK URI pairing. Wraps the SDK's EIP-1193 provider behind the Dynamic
222
- * facade (`disconnect` `disconnected` event bridge, `removeAllListeners`
223
- * shim) and drops `connect` so the provider is filtered out of the
65
+ * facade and drops `connect` so the provider is filtered out of the
224
66
  * wallet picker by `getAvailableWalletProvidersData` — mirroring how
225
67
  * WalletConnect URI sessions register a signing-only provider. The facade's
226
68
  * `request` also traces dispatch/resolution at debug level, since a signing
227
69
  * request that never gets a deep-link back to the wallet otherwise leaves
228
70
  * no signal on the Dynamic side.
229
71
  *
72
+ * `on` is a no-op: the facade doesn't yet bridge MetaMask's own
73
+ * `accountsChanged`/`chainChanged`/`disconnected` events through to the
74
+ * EIP-1193 listener contract.
75
+ *
76
+ * `switchActiveNetwork` routes through `assertMetaMaskNetworkIsGranted`
77
+ * before persisting -- see its inline comment for why (every configured
78
+ * network is an *optional* MetaMask scope, so signing/sending calls on an
79
+ * ungranted one would otherwise fail). The facade's `request` similarly
80
+ * routes its active-network lookup through `resolveActiveMetaMaskScope`
81
+ * rather than reading the registry directly, so a default network MetaMask
82
+ * never granted self-heals before it reaches a real signing/sending call.
83
+ *
84
+ * `switchActiveNetwork`/`disconnectWalletAccount` are local, Dynamic-side
85
+ * actions with no live wallet event to bridge, so they emit `networkChanged`/
86
+ * `disconnected` themselves via `metaMaskEvents` -- otherwise `events` would
87
+ * never fire for MetaMask at all (unlike every other EVM wallet provider,
88
+ * whose events come from bridging the wallet's own EIP-1193 events).
89
+ *
230
90
  * @notInstrumented
231
91
  */
232
- const createMetaMaskEvmWalletProvider = async (client) => {
233
- const controller = await getOrCreateMetaMaskEvmController(client);
234
- if (controller.sdk.getAccount() === void 0) throw new MetaMaskWalletNotConnectedError();
235
- const provider = controller.sdk.getProvider();
236
- const subscriberCleanups = /* @__PURE__ */ new Set();
237
- return {
238
- ...createWalletProviderFromEIP1193Provider({
239
- displayName: METAMASK_DISPLAY_NAME,
240
- eip1193: {
241
- on: (event, listener) => {
242
- const pending = {
243
- event,
244
- listener
245
- };
246
- subscriberCleanups.add(subscribeMetaMaskEvmFacadeListener({
247
- client,
248
- pending,
249
- provider
250
- }));
251
- },
252
- removeAllListeners: () => {
253
- for (const unsubscribe of subscriberCleanups) try {
254
- unsubscribe();
255
- } catch (error) {
256
- getCore(client).logger.error("[metamask] removeAllListeners: unsubscribe failed", error);
257
- }
258
- subscriberCleanups.clear();
259
- },
260
- request: async (request) => {
261
- const { logger } = getCore(client);
262
- logger.debug("[metamask] eip1193 request dispatched", {
92
+ const createMetaMaskEvmWalletProvider = (client) => {
93
+ const metaMaskClientInstanceManager = getOrCreateMetaMaskClientInstanceManager(client);
94
+ const walletProviderKey = getMetaMaskEvmSdkWalletProviderKey();
95
+ const metaMaskEvents = createMetaMaskWalletProviderEventEmitter();
96
+ const walletProvider = createWalletProviderFromEIP1193Provider({
97
+ displayName: METAMASK_DISPLAY_NAME,
98
+ eip1193: {
99
+ on: () => {},
100
+ removeAllListeners: () => {},
101
+ request: async (request) => {
102
+ const { logger } = getCore(client);
103
+ const metaMaskClient = await metaMaskClientInstanceManager.getMetaMaskClient();
104
+ try {
105
+ const { networkId } = await resolveActiveMetaMaskScope({
106
+ chain: "EVM",
107
+ metaMaskClient,
108
+ walletProviderKey
109
+ }, client);
110
+ logger.debug("[MetaMask:Provider] eip1193 request dispatched", {
263
111
  method: request.method,
264
- status: controller.sdk.status
112
+ networkId,
113
+ status: metaMaskClient.status
265
114
  });
266
- try {
267
- const result = await provider.request(request);
268
- logger.debug("[metamask] eip1193 request resolved", { method: request.method });
269
- return result;
270
- } catch (error) {
271
- logger.warn("[metamask] eip1193 request rejected", {
272
- error,
273
- method: request.method
274
- });
275
- throw error;
276
- }
115
+ if (request.method === "eth_chainId") return `0x${Number(networkId).toString(16)}`;
116
+ const result = await metaMaskClient.invokeMethod({
117
+ request,
118
+ scope: `eip155:${networkId}`
119
+ });
120
+ logger.debug("[MetaMask:Provider] eip1193 request resolved", { method: request.method });
121
+ return result;
122
+ } catch (error) {
123
+ logger.warn("[MetaMask:Provider] eip1193 request rejected", {
124
+ error,
125
+ method: request.method
126
+ });
127
+ throw error;
277
128
  }
278
- },
279
- icon: METAMASK_ICON,
280
- walletProviderType: WalletProviderEnum.QrCode
281
- }, client),
282
- connect: void 0
129
+ }
130
+ },
131
+ icon: METAMASK_ICON,
132
+ walletProviderType: WalletProviderEnum.QrCode
133
+ }, client);
134
+ const switchActiveNetwork = async ({ networkId }) => {
135
+ await assertMetaMaskNetworkIsGranted({
136
+ chain: "EVM",
137
+ metaMaskClient: await metaMaskClientInstanceManager.getMetaMaskClient(),
138
+ networkId
139
+ }, client);
140
+ const { networkId: previousNetworkId } = await getActiveNetworkIdFromLastKnownRegistry({
141
+ client,
142
+ walletProviderKey
143
+ });
144
+ await switchActiveNetworkInLastKnownRegistry({
145
+ client,
146
+ networkId,
147
+ walletProviderKey
148
+ });
149
+ if (networkId !== previousNetworkId) metaMaskEvents.emitNetworkChanged({ networkId });
150
+ };
151
+ const disconnectWalletAccount = async () => {
152
+ await disconnectMetaMaskWalletProvider({
153
+ chain: "EVM",
154
+ walletProviderKey
155
+ }, client);
156
+ metaMaskEvents.emitDisconnected();
157
+ };
158
+ const destroy = async (args) => {
159
+ await walletProvider.destroy?.(args);
160
+ metaMaskEvents.cleanupEventEmitter();
161
+ };
162
+ return {
163
+ ...walletProvider,
164
+ connect: async () => {
165
+ throw new MetaMaskDirectConnectNotSupportedError();
166
+ },
167
+ destroy,
168
+ disconnectWalletAccount,
169
+ get events() {
170
+ return metaMaskEvents.getEventEmitter();
171
+ },
172
+ switchActiveNetwork
283
173
  };
284
174
  };
285
175
 
176
+ //#endregion
177
+ //#region src/metamask/addMetaMaskEvmExtension/addMetaMaskEvmExtension.ts
178
+ const METAMASK_EVM_EXTENSION_KEY = "metaMaskEvm";
179
+ /**
180
+ * Integrates MetaMask Connect (MetaMask's multichain SDK) with the Dynamic
181
+ * client for EVM, letting users connect MetaMask on platforms where the
182
+ * browser extension isn't available — e.g. scanning a QR code, or opening
183
+ * the MetaMask mobile app from a website or React Native app. Call this
184
+ * once during setup.
185
+ *
186
+ * @example
187
+ * ```ts
188
+ * const client = createDynamicClient({ environmentId: '...' });
189
+ *
190
+ * addMetaMaskEvmExtension(client);
191
+ * ```
192
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
193
+ * @returns void
194
+ * @see connectWithMetaMaskUriEvm
195
+ * @see addEvmExtension
196
+ * @notInstrumented
197
+ */
198
+ const addMetaMaskEvmExtension = (client = getDefaultClient$1()) => {
199
+ if (hasExtension$1({ extensionKey: METAMASK_EVM_EXTENSION_KEY }, client)) return;
200
+ registerEvmNetworkProviderBuilder(client);
201
+ registerExtension({ extensionKey: METAMASK_EVM_EXTENSION_KEY }, client);
202
+ reconcileMetaMaskWalletProvider({
203
+ walletProviderBuilder: createMetaMaskEvmWalletProvider,
204
+ walletProviderKey: getMetaMaskEvmSdkWalletProviderKey()
205
+ }, client);
206
+ };
207
+
286
208
  //#endregion
287
209
  //#region src/metamask/connectAndVerifyWithMetaMaskUriEvm/connectAndVerifyWithMetaMaskUriEvm.ts
288
210
  /**
@@ -304,7 +226,6 @@ const connectAndVerifyWithMetaMaskUriEvm = async (client = getDefaultClient()) =
304
226
  const { approval, uri } = await connectWithMetaMaskUri({
305
227
  addToDynamicWalletAccounts: false,
306
228
  chain: "EVM",
307
- getController: getOrCreateMetaMaskEvmController,
308
229
  walletProviderBuilder: createMetaMaskEvmWalletProvider
309
230
  }, client);
310
231
  const verifiedApproval = async () => {
@@ -319,6 +240,35 @@ const connectAndVerifyWithMetaMaskUriEvm = async (client = getDefaultClient()) =
319
240
  };
320
241
  };
321
242
 
243
+ //#endregion
244
+ //#region src/metamask/warnMetaMaskEvmIntegrationIncomplete/warnMetaMaskEvmIntegrationIncomplete.ts
245
+ /**
246
+ * Warns when `addMetaMaskEvmExtension()` hasn't been added, since a wallet
247
+ * connected via `connectWithMetaMaskUriEvm` without it won't be restored
248
+ * after a page reload.
249
+ *
250
+ * @example
251
+ * ```ts
252
+ * warnMetaMaskEvmIntegrationIncomplete(client);
253
+ * ```
254
+ * @param client - The Dynamic client instance.
255
+ * @returns void
256
+ * @see connectWithMetaMaskUriEvm
257
+ * @see addMetaMaskEvmExtension
258
+ * @notInstrumented
259
+ */
260
+ const warnMetaMaskEvmIntegrationIncomplete = (client) => {
261
+ if (hasExtension$1({ extensionKey: METAMASK_EVM_EXTENSION_KEY }, client)) return;
262
+ getCore(client).logger.warn(`MetaMask integration is incomplete: addMetaMaskEvmExtension() is missing. Add it during setup:
263
+
264
+ import { addMetaMaskEvmExtension } from '@dynamic-labs-sdk/evm/metamask';
265
+ import { createDynamicClient } from '@dynamic-labs-sdk/client';
266
+
267
+ const client = createDynamicClient({ environmentId: '...' });
268
+
269
+ addMetaMaskEvmExtension(client);`);
270
+ };
271
+
322
272
  //#endregion
323
273
  //#region src/metamask/connectWithMetaMaskUriEvm/connectWithMetaMaskUriEvm.ts
324
274
  /**
@@ -332,11 +282,11 @@ const connectAndVerifyWithMetaMaskUriEvm = async (client = getDefaultClient()) =
332
282
  * @notInstrumented
333
283
  */
334
284
  const connectWithMetaMaskUriEvm = ({ addToDynamicWalletAccounts = true } = {}, client = getDefaultClient()) => {
285
+ warnMetaMaskEvmIntegrationIncomplete(client);
335
286
  registerEvmNetworkProviderBuilder(client);
336
287
  return connectWithMetaMaskUri({
337
288
  addToDynamicWalletAccounts,
338
289
  chain: "EVM",
339
- getController: getOrCreateMetaMaskEvmController,
340
290
  walletProviderBuilder: createMetaMaskEvmWalletProvider
341
291
  }, client);
342
292
  };
@@ -358,5 +308,5 @@ const getMetaMaskEvmExtensionWalletProviderKey = (client = getDefaultClient()) =
358
308
  assertPackageVersion(name, version);
359
309
 
360
310
  //#endregion
361
- export { MetaMaskDisplayUriMissingError, connectAndVerifyWithMetaMaskUriEvm, connectWithMetaMaskUriEvm, getMetaMaskEvmExtensionWalletProviderKey };
311
+ export { MetaMaskDirectConnectNotSupportedError, MetaMaskDisplayUriMissingError, addMetaMaskEvmExtension, connectAndVerifyWithMetaMaskUriEvm, connectWithMetaMaskUriEvm, getMetaMaskEvmExtensionWalletProviderKey };
362
312
  //# sourceMappingURL=metamask.esm.js.map