@dynamic-labs-sdk/evm 1.3.0 → 1.4.0

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 (82) hide show
  1. package/dist/{addEIP6963Extension-CSo4PZ83.esm.js → addEIP6963Extension-BuQG0WpY.esm.js} +3 -3
  2. package/dist/{addEIP6963Extension-CSo4PZ83.esm.js.map → addEIP6963Extension-BuQG0WpY.esm.js.map} +1 -1
  3. package/dist/{addEIP6963Extension-6q4uKJ2S.cjs → addEIP6963Extension-yntoSltr.cjs} +3 -3
  4. package/dist/{addEIP6963Extension-6q4uKJ2S.cjs.map → addEIP6963Extension-yntoSltr.cjs.map} +1 -1
  5. package/dist/{addWaasEvmExtension-FyQx6Qlo.cjs → addWaasEvmExtension-BBiZbJ2g.cjs} +3 -3
  6. package/dist/{addWaasEvmExtension-FyQx6Qlo.cjs.map → addWaasEvmExtension-BBiZbJ2g.cjs.map} +1 -1
  7. package/dist/{addWaasEvmExtension-DTmPsJ-R.esm.js → addWaasEvmExtension-Dw4qYTpt.esm.js} +3 -3
  8. package/dist/{addWaasEvmExtension-DTmPsJ-R.esm.js.map → addWaasEvmExtension-Dw4qYTpt.esm.js.map} +1 -1
  9. package/dist/baseAccount.cjs +3 -3
  10. package/dist/baseAccount.esm.js +3 -3
  11. package/dist/baseAccount.native.esm.js +1 -1
  12. package/dist/{createWalletClientForWalletAccount-CKBR4V6M.cjs → createWalletClientForWalletAccount-Ck2Ka1-V.cjs} +2 -2
  13. package/dist/{createWalletClientForWalletAccount-CKBR4V6M.cjs.map → createWalletClientForWalletAccount-Ck2Ka1-V.cjs.map} +1 -1
  14. package/dist/{createWalletClientForWalletAccount-DRs8Ja_I.esm.js → createWalletClientForWalletAccount-DOBeAtZw.esm.js} +2 -2
  15. package/dist/{createWalletClientForWalletAccount-DRs8Ja_I.esm.js.map → createWalletClientForWalletAccount-DOBeAtZw.esm.js.map} +1 -1
  16. package/dist/{createWalletProviderFromEIP1193Provider-D-6PlGdy.cjs → createWalletProviderFromEIP1193Provider-Dgg6TTOe.cjs} +2 -2
  17. package/dist/{createWalletProviderFromEIP1193Provider-D-6PlGdy.cjs.map → createWalletProviderFromEIP1193Provider-Dgg6TTOe.cjs.map} +1 -1
  18. package/dist/{createWalletProviderFromEIP1193Provider-p3Aa46Bi.esm.js → createWalletProviderFromEIP1193Provider-zffPjj9N.esm.js} +2 -2
  19. package/dist/{createWalletProviderFromEIP1193Provider-p3Aa46Bi.esm.js.map → createWalletProviderFromEIP1193Provider-zffPjj9N.esm.js.map} +1 -1
  20. package/dist/eip6963.cjs +4 -4
  21. package/dist/eip6963.esm.js +4 -4
  22. package/dist/eip6963.native.esm.js +1 -1
  23. package/dist/{evmTransferAmount-CkF4KIge.cjs → evmTransferAmount-CYAXsg0Z.cjs} +2 -2
  24. package/dist/{evmTransferAmount-CkF4KIge.cjs.map → evmTransferAmount-CYAXsg0Z.cjs.map} +1 -1
  25. package/dist/{evmTransferAmount-BJswh1ID.esm.js → evmTransferAmount-DZweef_q.esm.js} +2 -2
  26. package/dist/{evmTransferAmount-BJswh1ID.esm.js.map → evmTransferAmount-DZweef_q.esm.js.map} +1 -1
  27. package/dist/exports/metamask.d.ts +6 -0
  28. package/dist/exports/metamask.d.ts.map +1 -0
  29. package/dist/index.cjs +5 -5
  30. package/dist/index.esm.js +5 -5
  31. package/dist/index.native.esm.js +1 -1
  32. package/dist/metamask/connectAndVerifyWithMetaMaskUriEvm/connectAndVerifyWithMetaMaskUriEvm.d.ts +17 -0
  33. package/dist/metamask/connectAndVerifyWithMetaMaskUriEvm/connectAndVerifyWithMetaMaskUriEvm.d.ts.map +1 -0
  34. package/dist/metamask/connectAndVerifyWithMetaMaskUriEvm/index.d.ts +2 -0
  35. package/dist/metamask/connectAndVerifyWithMetaMaskUriEvm/index.d.ts.map +1 -0
  36. package/dist/metamask/connectWithMetaMaskUriEvm/connectWithMetaMaskUriEvm.d.ts +17 -0
  37. package/dist/metamask/connectWithMetaMaskUriEvm/connectWithMetaMaskUriEvm.d.ts.map +1 -0
  38. package/dist/metamask/connectWithMetaMaskUriEvm/index.d.ts +3 -0
  39. package/dist/metamask/connectWithMetaMaskUriEvm/index.d.ts.map +1 -0
  40. package/dist/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.d.ts +7 -12
  41. package/dist/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.d.ts.map +1 -1
  42. package/dist/metamask/createMetaMaskEvmWalletProvider/index.d.ts +0 -1
  43. package/dist/metamask/createMetaMaskEvmWalletProvider/index.d.ts.map +1 -1
  44. package/dist/metamask/getMetaMaskEvmExtensionWalletProviderKey/getMetaMaskEvmExtensionWalletProviderKey.d.ts +10 -0
  45. package/dist/metamask/getMetaMaskEvmExtensionWalletProviderKey/getMetaMaskEvmExtensionWalletProviderKey.d.ts.map +1 -0
  46. package/dist/metamask/getMetaMaskEvmExtensionWalletProviderKey/index.d.ts +2 -0
  47. package/dist/metamask/getMetaMaskEvmExtensionWalletProviderKey/index.d.ts.map +1 -0
  48. package/dist/metamask/metamask.types.d.ts +8 -36
  49. package/dist/metamask/metamask.types.d.ts.map +1 -1
  50. package/dist/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.d.ts +5 -27
  51. package/dist/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.d.ts.map +1 -1
  52. package/dist/metamask.cjs +306 -0
  53. package/dist/metamask.cjs.map +1 -0
  54. package/dist/metamask.esm.js +298 -0
  55. package/dist/metamask.esm.js.map +1 -0
  56. package/dist/metamask.native.esm.js +299 -0
  57. package/dist/metamask.native.esm.js.map +1 -0
  58. package/dist/{package-DGj3wg-e.native.esm.js → package-CVxJoayo.native.esm.js} +2 -2
  59. package/dist/package-CVxJoayo.native.esm.js.map +1 -0
  60. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  61. package/dist/viem.cjs +1 -1
  62. package/dist/viem.esm.js +1 -1
  63. package/dist/viem.native.esm.js +1 -1
  64. package/dist/waas.cjs +3 -3
  65. package/dist/waas.esm.js +3 -3
  66. package/dist/waas.native.esm.js +1 -1
  67. package/dist/walletConnect.cjs +2 -2
  68. package/dist/walletConnect.esm.js +2 -2
  69. package/dist/walletConnect.native.esm.js +1 -1
  70. package/dist/windowInjected.cjs +3 -3
  71. package/dist/windowInjected.esm.js +3 -3
  72. package/dist/windowInjected.native.esm.js +1 -1
  73. package/package.json +10 -4
  74. package/dist/metamask/utils/clearMetaMaskEvmSessionStorage/clearMetaMaskEvmSessionStorage.d.ts +0 -34
  75. package/dist/metamask/utils/clearMetaMaskEvmSessionStorage/clearMetaMaskEvmSessionStorage.d.ts.map +0 -1
  76. package/dist/metamask/utils/clearMetaMaskEvmSessionStorage/index.d.ts +0 -2
  77. package/dist/metamask/utils/clearMetaMaskEvmSessionStorage/index.d.ts.map +0 -1
  78. package/dist/metamask/utils/isConnectShapedResponse/index.d.ts +0 -3
  79. package/dist/metamask/utils/isConnectShapedResponse/index.d.ts.map +0 -1
  80. package/dist/metamask/utils/isConnectShapedResponse/isConnectShapedResponse.d.ts +0 -21
  81. package/dist/metamask/utils/isConnectShapedResponse/isConnectShapedResponse.d.ts.map +0 -1
  82. package/dist/package-DGj3wg-e.native.esm.js.map +0 -1
@@ -1,42 +1,14 @@
1
+ import type { MetaMaskController } from '@dynamic-labs-sdk/metamask';
1
2
  import type { MetamaskConnectEVM } from '@metamask/connect-evm';
2
- export type DisplayUriListener = (uri: string) => void;
3
3
  /**
4
- * Per-Dynamic-client wrapper around `@metamask/connect-evm`. Owns the SDK
5
- * instance and the bookkeeping required to surface the SDK's `display_uri`
6
- * event to multiple Dynamic-side consumers without races: a cache of the
7
- * latest URI plus a small listener registry.
8
- *
9
- * Returned by `createMetaMaskEvmController` and cached per Dynamic client by
10
- * `getOrCreateMetaMaskEvmController`.
4
+ * Per-Dynamic-client EVM-flavoured `MetaMaskController`. Extends the
5
+ * chain-agnostic surface with the typed `@metamask/connect-evm` SDK
6
+ * handle so the EIP-1193 facade can reach the SDK provider directly for
7
+ * signing. Returned by `createMetaMaskEvmController` and cached per
8
+ * Dynamic client by `getOrCreateMetaMaskEvmController`.
11
9
  */
12
- export type MetaMaskEvmController = {
13
- /**
14
- * Drops the cached `display_uri` value without touching the SDK. Used
15
- * by `disconnectMetaMaskEvm` to make sure a torn-down pairing's URI is
16
- * not replayed to late subscribers — the SDK's own `disconnect` event
17
- * handler is best-effort and may not fire (or may not fire
18
- * synchronously) when we abort a pairing that the wallet never
19
- * accepted.
20
- */
21
- clearCachedDisplayUri: () => void;
22
- /**
23
- * The latest URI captured by `eventHandlers.displayUri`, or `undefined`
24
- * if no pairing URI has been emitted yet (or the SDK routed to the
25
- * browser extension instead of the QR / deep-link transport, or a
26
- * pairing session just completed).
27
- */
28
- getLatestDisplayUri: () => string | undefined;
29
- /**
30
- * Subscribes a listener for `display_uri` events. The listener is
31
- * invoked immediately with the cached URI when one is already available
32
- * — so consumers that subscribe after the SDK has already started the
33
- * pairing flow do not need to coordinate timing with the connection
34
- * call. Returns a function that removes the listener.
35
- */
36
- onDisplayUri: (listener: DisplayUriListener) => () => void;
37
- /**
38
- * The underlying `@metamask/connect-evm` SDK instance.
39
- */
10
+ export type MetaMaskEvmController = MetaMaskController & {
11
+ /** The underlying `@metamask/connect-evm` SDK instance. */
40
12
  sdk: MetamaskConnectEVM;
41
13
  };
42
14
  //# sourceMappingURL=metamask.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metamask.types.d.ts","sourceRoot":"","sources":["../../src/metamask/metamask.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;;;;;OAOG;IACH,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAElC;;;;;OAKG;IACH,mBAAmB,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAE9C;;;;;;OAMG;IACH,YAAY,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,MAAM,IAAI,CAAC;IAE3D;;OAEG;IACH,GAAG,EAAE,kBAAkB,CAAC;CACzB,CAAC"}
1
+ {"version":3,"file":"metamask.types.d.ts","sourceRoot":"","sources":["../../src/metamask/metamask.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,MAAM,qBAAqB,GAAG,kBAAkB,GAAG;IACvD,2DAA2D;IAC3D,GAAG,EAAE,kBAAkB,CAAC;CACzB,CAAC"}
@@ -2,33 +2,11 @@ import type { DynamicClient } from '@dynamic-labs-sdk/client';
2
2
  import type { MetaMaskEvmController } from '../../metamask.types';
3
3
  /**
4
4
  * Builds a fully-initialised `MetaMaskEvmController` for the given Dynamic
5
- * client. Used internally by `getOrCreateMetaMaskEvmController`; not part
6
- * of the public API.
7
- *
8
- * Runs the SDK in headless mode (`ui.headless: true`) the SDK does not
9
- * render any built-in UI; consumers subscribe via `onDisplayUri` (or the
10
- * public `onMetaMaskEvmDisplayUri` helper) to render their own QR /
11
- * deep-link surface. `ui.preferExtension` is always `true`, so the SDK
12
- * auto-routes to the installed MetaMask browser extension whenever
13
- * available and only falls back to QR / deep-link when it isn't.
14
- *
15
- * `display_uri` handling is registered as an `eventHandlers` callback at
16
- * SDK construction time (rather than via `provider.on(...)` after the
17
- * fact) so the first URI emission can never be lost to a race between
18
- * subscription and the SDK's transport selection. The handler caches the
19
- * URI and broadcasts it to every subscribed listener. The `connect` /
20
- * `disconnect` handlers clear the cached URI so that a brand-new pairing
21
- * does not replay a stale URI.
22
- *
23
- * Dapp metadata is sourced from the Dynamic client's app metadata
24
- * (`getAppMetadata`) — name, icon, native scheme, and universal link. No
25
- * other configuration is exposed; the function is intentionally
26
- * parameterless aside from the client to keep the integration's behaviour
27
- * predictable across consumers.
28
- *
29
- * Only ever invoked from a browser context: the function sits behind the
30
- * lazy façade in `createMetaMaskEvmWalletProvider`, which only constructs
31
- * the SDK when the user clicks the MetaMask entry in the wallet picker.
5
+ * client. Runs the SDK in headless mode so consumers render their own QR /
6
+ * deep-link surface, and registers `display_uri` handling as an
7
+ * `eventHandlers` callback at construction time so the first URI emission
8
+ * cannot be lost to a subscription race. Dapp metadata is sourced from the
9
+ * client's `getAppMetadata`. Browser-only.
32
10
  *
33
11
  * @not-instrumented
34
12
  */
@@ -1 +1 @@
1
- {"version":3,"file":"createMetaMaskEvmController.d.ts","sourceRoot":"","sources":["../../../../src/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D,OAAO,KAAK,EAEV,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAI9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,2BAA2B,WAC9B,aAAa,KACpB,OAAO,CAAC,qBAAqB,CAwE/B,CAAC"}
1
+ {"version":3,"file":"createMetaMaskEvmController.d.ts","sourceRoot":"","sources":["../../../../src/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAO9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGlE;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B,WAC9B,aAAa,KACpB,OAAO,CAAC,qBAAqB,CA8F/B,CAAC"}
@@ -0,0 +1,306 @@
1
+ const require_createWalletClientForWalletAccount = require('./createWalletClientForWalletAccount-Ck2Ka1-V.cjs');
2
+ const require_evmTransferAmount = require('./evmTransferAmount-CYAXsg0Z.cjs');
3
+ const require_createWalletProviderFromEIP1193Provider = require('./createWalletProviderFromEIP1193Provider-Dgg6TTOe.cjs');
4
+ let _dynamic_labs_sdk_assert_package_version = require("@dynamic-labs-sdk/assert-package-version");
5
+ let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
6
+ let _dynamic_labs_sdk_client_core = require("@dynamic-labs-sdk/client/core");
7
+ let _dynamic_labs_sdk_api_core = require("@dynamic-labs/sdk-api-core");
8
+ let _dynamic_labs_sdk_metamask = require("@dynamic-labs-sdk/metamask");
9
+ let _metamask_connect_evm = require("@metamask/connect-evm");
10
+
11
+ //#region src/utils/getEvmNetworksData/getEvmNetworksData.ts
12
+ /**
13
+ * Returns the network configuration objects for the EVM networks configured
14
+ * on the Dynamic client. Generic helper available to any EVM extension that
15
+ * needs the full network metadata (RPC URLs, native currency, etc.) for the
16
+ * configured EVM chain set — for instance, to build the `supportedNetworks`
17
+ * map required by third-party SDKs such as MetaMask or Base Account.
18
+ *
19
+ * @param client - The Dynamic client whose project settings drive the result.
20
+ * @not-instrumented
21
+ */
22
+ const getEvmNetworksData = (client) => (0, _dynamic_labs_sdk_client.getNetworksData)(client).filter((network) => network.chain === "EVM");
23
+
24
+ //#endregion
25
+ //#region src/metamask/utils/getSupportedNetworks/getSupportedNetworks.ts
26
+ /** @not-instrumented */
27
+ const getSupportedNetworks = (client) => {
28
+ const evmNetworks = getEvmNetworksData(client).sort((a, b) => {
29
+ if (a.networkId === "1") return -1;
30
+ if (b.networkId === "1") return 1;
31
+ return 0;
32
+ });
33
+ (0, _dynamic_labs_sdk_client_core.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.");
34
+ const supportedNetworks = {};
35
+ for (const network of evmNetworks) {
36
+ const hexChainId = `0x${Number.parseInt(network.networkId, 10).toString(16)}`;
37
+ supportedNetworks[hexChainId] = network.rpcUrls.http[0];
38
+ }
39
+ return supportedNetworks;
40
+ };
41
+
42
+ //#endregion
43
+ //#region src/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.ts
44
+ /**
45
+ * Builds a fully-initialised `MetaMaskEvmController` for the given Dynamic
46
+ * client. Runs the SDK in headless mode so consumers render their own QR /
47
+ * deep-link surface, and registers `display_uri` handling as an
48
+ * `eventHandlers` callback at construction time so the first URI emission
49
+ * cannot be lost to a subscription race. Dapp metadata is sourced from the
50
+ * client's `getAppMetadata`. Browser-only.
51
+ *
52
+ * @not-instrumented
53
+ */
54
+ const createMetaMaskEvmController = async (client) => {
55
+ const supportedNetworks = getSupportedNetworks(client);
56
+ const { appName, appLogoUrl, appUniversalLink, appNativeLink } = (0, _dynamic_labs_sdk_client_core.getAppMetadata)(client);
57
+ await (0, _dynamic_labs_sdk_metamask.clearMetaMaskSessionStorage)();
58
+ const listeners = /* @__PURE__ */ new Set();
59
+ let latestDisplayUri;
60
+ const sdk = await (0, _metamask_connect_evm.createEVMClient)({
61
+ api: { supportedNetworks },
62
+ dapp: {
63
+ iconUrl: appLogoUrl,
64
+ name: appName,
65
+ nativeScheme: appNativeLink,
66
+ url: appUniversalLink ?? ""
67
+ },
68
+ debug: false,
69
+ eventHandlers: {
70
+ connect: () => {
71
+ latestDisplayUri = void 0;
72
+ },
73
+ disconnect: () => {
74
+ latestDisplayUri = void 0;
75
+ },
76
+ displayUri: (uri) => {
77
+ latestDisplayUri = uri;
78
+ for (const listener of listeners) listener(uri);
79
+ }
80
+ },
81
+ ui: {
82
+ headless: true,
83
+ preferExtension: true
84
+ }
85
+ });
86
+ latestDisplayUri = void 0;
87
+ const onDisplayUri = (listener) => {
88
+ listeners.add(listener);
89
+ if (latestDisplayUri !== void 0) listener(latestDisplayUri);
90
+ return () => {
91
+ listeners.delete(listener);
92
+ };
93
+ };
94
+ const chainIds = Object.keys(supportedNetworks);
95
+ const connect = async () => {
96
+ if (sdk.status === "connecting") try {
97
+ await sdk.disconnect();
98
+ } catch (error) {
99
+ (0, _dynamic_labs_sdk_client_core.getCore)(client).logger.debug("[metamask] pre-connect disconnect rejected (expected when aborting a pairing the wallet never accepted)", error);
100
+ }
101
+ await sdk.connect({ chainIds });
102
+ };
103
+ return {
104
+ clearCachedDisplayUri: () => {
105
+ latestDisplayUri = void 0;
106
+ },
107
+ connect,
108
+ getLatestDisplayUri: () => latestDisplayUri,
109
+ onDisplayUri,
110
+ sdk
111
+ };
112
+ };
113
+
114
+ //#endregion
115
+ //#region src/metamask/utils/getOrCreateMetaMaskEvmController/getOrCreateMetaMaskEvmController.ts
116
+ const RUNTIME_SERVICE_KEY = "metaMaskEvmController";
117
+ /**
118
+ * Per-`DynamicClient` accessor for the lazily-constructed MetaMask EVM
119
+ * controller. Wraps `createMetaMaskEvmController` with the standard
120
+ * `runtimeServices` cache so every caller — the EIP-1193 wallet-provider
121
+ * façade, the `display_uri` subscription helper, and the
122
+ * `connectWithMetaMaskEvm` URI-returning helper — shares the same
123
+ * controller (and therefore the same SDK instance, display-URI cache, and
124
+ * listener registry) per Dynamic client.
125
+ *
126
+ * This matches the pattern used by the WalletConnect `getSignClient`
127
+ * accessor: the first call triggers construction; subsequent calls
128
+ * (within the same client) return the cached promise without re-running
129
+ * the builder.
130
+ *
131
+ * The cache is **per-Dynamic-client, not per-SDK-instance**:
132
+ * `@metamask/connect-evm`'s `createEVMClient` is itself a singleton —
133
+ * a second call returns the same underlying SDK — so when multiple
134
+ * Dynamic clients coexist they end up sharing the same MetaMask SDK
135
+ * instance (and therefore the same active pairing session) regardless
136
+ * of this cache. The wrapper exists to own the controller's
137
+ * `display_uri` cache and listener registry per Dynamic client, which
138
+ * the SDK itself does not expose.
139
+ *
140
+ * @not-instrumented
141
+ */
142
+ const getOrCreateMetaMaskEvmController = (0, _dynamic_labs_sdk_client_core.createRuntimeServiceAccessKey)(RUNTIME_SERVICE_KEY, (client) => createMetaMaskEvmController(client));
143
+
144
+ //#endregion
145
+ //#region src/metamask/utils/subscribeMetaMaskEvmFacadeListener/subscribeMetaMaskEvmFacadeListener.ts
146
+ const NOOP_UNSUBSCRIBE = () => void 0;
147
+ /**
148
+ * Subscribes a facade listener to the underlying MetaMask SDK provider,
149
+ * forwarding events through per-event adapters:
150
+ *
151
+ * - `accountsChanged` — clones the readonly addresses array
152
+ * `@metamask/connect-evm` hands the listener, since the Dynamic SDK
153
+ * facade contract emits a mutable `Address[]`.
154
+ * - `chainChanged` — passes the chain id through verbatim.
155
+ * - `disconnected` — bridged to the SDK's canonical `disconnect`
156
+ * event, which the SDK actually emits.
157
+ *
158
+ * Returns the unsubscribe function returned by the SDK provider so the
159
+ * caller can clean it up later (for example, when the facade's
160
+ * `removeAllListeners` is invoked).
161
+ *
162
+ * @not-instrumented
163
+ */
164
+ const subscribeMetaMaskEvmFacadeListener = ({ client, pending, provider }) => {
165
+ if (pending.event === "accountsChanged") return provider.on("accountsChanged", (addresses) => pending.listener([...addresses]));
166
+ if (pending.event === "chainChanged") return provider.on("chainChanged", (chainId) => pending.listener(chainId));
167
+ if (pending.event === "disconnected") return provider.on("disconnect", () => pending.listener());
168
+ const exhaustiveCheck = pending;
169
+ (0, _dynamic_labs_sdk_client_core.getCore)(client).logger.debug("[metamask] subscribeMetaMaskEvmFacadeListener: unhandled event", exhaustiveCheck.event);
170
+ return NOOP_UNSUBSCRIBE;
171
+ };
172
+
173
+ //#endregion
174
+ //#region src/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.ts
175
+ const METAMASK_DISPLAY_NAME = "MetaMask";
176
+ const METAMASK_ICON = `${_dynamic_labs_sdk_client_core.DYNAMIC_ICONIC_SPRITE_URL}#metamask`;
177
+ /**
178
+ * Builds the `EvmWalletProvider` registered AFTER a successful MetaMask
179
+ * SDK URI pairing. Wraps the SDK's EIP-1193 provider behind the Dynamic
180
+ * facade (`disconnect` → `disconnected` event bridge, `removeAllListeners`
181
+ * shim) and drops `connect` so the provider is filtered out of the
182
+ * wallet picker by `getAvailableWalletProvidersData` — mirroring how
183
+ * WalletConnect URI sessions register a signing-only provider.
184
+ *
185
+ * @not-instrumented
186
+ */
187
+ const createMetaMaskEvmWalletProvider = async (client) => {
188
+ const provider = (await getOrCreateMetaMaskEvmController(client)).sdk.getProvider();
189
+ const subscriberCleanups = /* @__PURE__ */ new Set();
190
+ return {
191
+ ...require_createWalletProviderFromEIP1193Provider.createWalletProviderFromEIP1193Provider({
192
+ displayName: METAMASK_DISPLAY_NAME,
193
+ eip1193: {
194
+ on: (event, listener) => {
195
+ const pending = {
196
+ event,
197
+ listener
198
+ };
199
+ subscriberCleanups.add(subscribeMetaMaskEvmFacadeListener({
200
+ client,
201
+ pending,
202
+ provider
203
+ }));
204
+ },
205
+ removeAllListeners: () => {
206
+ for (const unsubscribe of subscriberCleanups) try {
207
+ unsubscribe();
208
+ } catch (error) {
209
+ (0, _dynamic_labs_sdk_client_core.getCore)(client).logger.error("[metamask] removeAllListeners: unsubscribe failed", error);
210
+ }
211
+ subscriberCleanups.clear();
212
+ },
213
+ request: (request) => provider.request(request)
214
+ },
215
+ icon: METAMASK_ICON,
216
+ walletProviderType: _dynamic_labs_sdk_api_core.WalletProviderEnum.QrCode
217
+ }, client),
218
+ connect: void 0
219
+ };
220
+ };
221
+
222
+ //#endregion
223
+ //#region src/metamask/connectAndVerifyWithMetaMaskUriEvm/connectAndVerifyWithMetaMaskUriEvm.ts
224
+ /**
225
+ * Drives a MetaMask SDK URI pairing for EVM and verifies ownership of the
226
+ * paired wallet account through message signing, returning `{ approval, uri }`
227
+ * so consumers can render the QR / hand the URI to a deeplink.
228
+ *
229
+ * Unlike `connectAndVerifyWithWalletConnectEvm`, the MetaMask SDK does not
230
+ * expose a single-round-trip authenticate primitive, so this drives two
231
+ * sequential interactions on the wallet side: the user first approves the
232
+ * pairing, then approves a sign-in message. The wallet account is added to
233
+ * the Dynamic client as a verified credential (not as an unverified
234
+ * account).
235
+ *
236
+ * @not-instrumented
237
+ */
238
+ const connectAndVerifyWithMetaMaskUriEvm = async (client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => {
239
+ require_evmTransferAmount.registerEvmNetworkProviderBuilder(client);
240
+ const { approval, uri } = await (0, _dynamic_labs_sdk_metamask.connectWithMetaMaskUri)({
241
+ addToDynamicWalletAccounts: false,
242
+ chain: "EVM",
243
+ getController: getOrCreateMetaMaskEvmController,
244
+ walletProviderBuilder: createMetaMaskEvmWalletProvider
245
+ }, client);
246
+ const verifiedApproval = async () => {
247
+ const { walletAccounts } = await approval();
248
+ const [walletAccount] = walletAccounts;
249
+ if (walletAccount) await (0, _dynamic_labs_sdk_client.verifyWalletAccount)({ walletAccount }, client);
250
+ return { walletAccounts };
251
+ };
252
+ return {
253
+ approval: verifiedApproval,
254
+ uri
255
+ };
256
+ };
257
+
258
+ //#endregion
259
+ //#region src/metamask/connectWithMetaMaskUriEvm/connectWithMetaMaskUriEvm.ts
260
+ /**
261
+ * Drives a MetaMask SDK URI pairing for EVM and returns `{ approval, uri }` so
262
+ * consumers can render the QR / hand the URI to a deeplink. Logs an advisory
263
+ * warning when the MetaMask extension is announced via EIP-6963; pairing still
264
+ * proceeds, but the consumer is told which announced provider key to route
265
+ * through for the best UX. The resulting wallet provider registers for signing
266
+ * only and is never surfaced in the wallet picker.
267
+ *
268
+ * @not-instrumented
269
+ */
270
+ const connectWithMetaMaskUriEvm = ({ addToDynamicWalletAccounts = true } = {}, client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => {
271
+ require_evmTransferAmount.registerEvmNetworkProviderBuilder(client);
272
+ return (0, _dynamic_labs_sdk_metamask.connectWithMetaMaskUri)({
273
+ addToDynamicWalletAccounts,
274
+ chain: "EVM",
275
+ getController: getOrCreateMetaMaskEvmController,
276
+ walletProviderBuilder: createMetaMaskEvmWalletProvider
277
+ }, client);
278
+ };
279
+
280
+ //#endregion
281
+ //#region src/metamask/getMetaMaskEvmExtensionWalletProviderKey/getMetaMaskEvmExtensionWalletProviderKey.ts
282
+ /**
283
+ * Returns the wallet provider key of the MetaMask browser extension announced
284
+ * for EVM, or `undefined` when none is announced. Pass the returned key to
285
+ * `connectWithWalletProvider` to route through the announced provider; fall
286
+ * back to `connectWithMetaMaskUriEvm` when `undefined`.
287
+ *
288
+ * @not-instrumented
289
+ */
290
+ const getMetaMaskEvmExtensionWalletProviderKey = (client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => (0, _dynamic_labs_sdk_metamask.getMetaMaskExtensionWalletProviderKey)({ chain: "EVM" }, client);
291
+
292
+ //#endregion
293
+ //#region src/exports/metamask.ts
294
+ (0, _dynamic_labs_sdk_assert_package_version.assertPackageVersion)(require_createWalletClientForWalletAccount.name, require_createWalletClientForWalletAccount.version);
295
+
296
+ //#endregion
297
+ Object.defineProperty(exports, 'MetaMaskDisplayUriMissingError', {
298
+ enumerable: true,
299
+ get: function () {
300
+ return _dynamic_labs_sdk_metamask.MetaMaskDisplayUriMissingError;
301
+ }
302
+ });
303
+ exports.connectAndVerifyWithMetaMaskUriEvm = connectAndVerifyWithMetaMaskUriEvm;
304
+ exports.connectWithMetaMaskUriEvm = connectWithMetaMaskUriEvm;
305
+ exports.getMetaMaskEvmExtensionWalletProviderKey = getMetaMaskEvmExtensionWalletProviderKey;
306
+ //# sourceMappingURL=metamask.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metamask.cjs","names":["supportedNetworks: MetaMaskSupportedNetworks","latestDisplayUri: string | undefined","exhaustiveCheck: never","DYNAMIC_ICONIC_SPRITE_URL","createWalletProviderFromEIP1193Provider","WalletProviderEnum","packageName","packageVersion"],"sources":["../src/utils/getEvmNetworksData/getEvmNetworksData.ts","../src/metamask/utils/getSupportedNetworks/getSupportedNetworks.ts","../src/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.ts","../src/metamask/utils/getOrCreateMetaMaskEvmController/getOrCreateMetaMaskEvmController.ts","../src/metamask/utils/subscribeMetaMaskEvmFacadeListener/subscribeMetaMaskEvmFacadeListener.ts","../src/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.ts","../src/metamask/connectAndVerifyWithMetaMaskUriEvm/connectAndVerifyWithMetaMaskUriEvm.ts","../src/metamask/connectWithMetaMaskUriEvm/connectWithMetaMaskUriEvm.ts","../src/metamask/getMetaMaskEvmExtensionWalletProviderKey/getMetaMaskEvmExtensionWalletProviderKey.ts","../src/exports/metamask.ts"],"sourcesContent":["import {\n type DynamicClient,\n type NetworkData,\n getNetworksData,\n} from '@dynamic-labs-sdk/client';\n\n/**\n * Returns the network configuration objects for the EVM networks configured\n * on the Dynamic client. Generic helper available to any EVM extension that\n * needs the full network metadata (RPC URLs, native currency, etc.) for the\n * configured EVM chain set — for instance, to build the `supportedNetworks`\n * map required by third-party SDKs such as MetaMask or Base Account.\n *\n * @param client - The Dynamic client whose project settings drive the result.\n * @not-instrumented\n */\nexport const getEvmNetworksData = (client: DynamicClient): NetworkData[] =>\n getNetworksData(client).filter((network) => network.chain === 'EVM');\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { assertNonEmptyArray } from '@dynamic-labs-sdk/client/core';\n\nimport { getEvmNetworksData } from '../../../utils/getEvmNetworksData';\n\ntype MetaMaskSupportedNetworks = Record<`0x${string}`, string>;\n\n/** @not-instrumented */\nexport const getSupportedNetworks = (\n client: DynamicClient\n): MetaMaskSupportedNetworks => {\n // Customer enabled networks, with mainnet first if available.\n const evmNetworks = getEvmNetworksData(client).sort((a, b) => {\n if (a.networkId === '1') return -1;\n if (b.networkId === '1') return 1;\n\n return 0;\n });\n\n assertNonEmptyArray(\n evmNetworks,\n 'No EVM networks have been configured. Make sure to add at least one EVM network to your project settings in the Dynamic Dashboard.'\n );\n\n const supportedNetworks: MetaMaskSupportedNetworks = {};\n\n for (const network of evmNetworks) {\n const numericChainId = Number.parseInt(network.networkId, 10);\n const hexChainId = `0x${numericChainId.toString(16)}` as `0x${string}`;\n supportedNetworks[hexChainId] = network.rpcUrls.http[0];\n }\n\n return supportedNetworks;\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getAppMetadata, getCore } from '@dynamic-labs-sdk/client/core';\nimport { clearMetaMaskSessionStorage } from '@dynamic-labs-sdk/metamask';\nimport type { DisplayUriListener } from '@dynamic-labs-sdk/metamask';\nimport { createEVMClient } from '@metamask/connect-evm';\nimport type { Hex } from '@metamask/connect-evm';\n\nimport type { MetaMaskEvmController } from '../../metamask.types';\nimport { getSupportedNetworks } from '../getSupportedNetworks';\n\n/**\n * Builds a fully-initialised `MetaMaskEvmController` for the given Dynamic\n * client. Runs the SDK in headless mode so consumers render their own QR /\n * deep-link surface, and registers `display_uri` handling as an\n * `eventHandlers` callback at construction time so the first URI emission\n * cannot be lost to a subscription race. Dapp metadata is sourced from the\n * client's `getAppMetadata`. Browser-only.\n *\n * @not-instrumented\n */\nexport const createMetaMaskEvmController = async (\n client: DynamicClient\n): Promise<MetaMaskEvmController> => {\n const supportedNetworks = getSupportedNetworks(client);\n const { appName, appLogoUrl, appUniversalLink, appNativeLink } =\n getAppMetadata(client);\n\n // Drop any IndexedDB session state left behind by a previous tab,\n // page reload, or abandoned pairing before the SDK initialises. The\n // SDK's auto-recovery path otherwise picks up a stale transport\n // descriptor and spends its (non-configurable) 10-second resume\n // timeout on every controller construction trying to revive a relay\n // session that no longer exists, surfacing as a long QR skeleton\n // delay on every page reload that follows an abandoned pairing.\n await clearMetaMaskSessionStorage();\n\n const listeners = new Set<DisplayUriListener>();\n let latestDisplayUri: string | undefined;\n\n const sdk = await createEVMClient({\n api: { supportedNetworks },\n dapp: {\n iconUrl: appLogoUrl,\n name: appName,\n nativeScheme: appNativeLink,\n url: appUniversalLink ?? '',\n },\n debug: false,\n eventHandlers: {\n connect: () => {\n latestDisplayUri = undefined;\n },\n disconnect: () => {\n latestDisplayUri = undefined;\n },\n displayUri: (uri) => {\n latestDisplayUri = uri;\n for (const listener of listeners) {\n listener(uri);\n }\n },\n },\n ui: {\n headless: true,\n preferExtension: true,\n },\n });\n\n // Defensive cleanup: even though we cleared IndexedDB before\n // constructing the SDK, an in-flight `display_uri` emission could\n // theoretically race the storage delete on slow devices. Clearing\n // the cache here guarantees late subscribers cannot replay an URI\n // that originated from any pairing attempt prior to this\n // construction.\n latestDisplayUri = undefined;\n\n const onDisplayUri = (listener: DisplayUriListener): (() => void) => {\n listeners.add(listener);\n if (latestDisplayUri !== undefined) {\n listener(latestDisplayUri);\n }\n return () => {\n listeners.delete(listener);\n };\n };\n\n const chainIds = Object.keys(supportedNetworks) as Hex[];\n\n const connect = async (): Promise<void> => {\n // If a previous pairing was cancelled mid-flight the SDK can be left in\n // `connecting` state with a dead transport descriptor; tear it down so\n // the next `connect` issues a fresh URI synchronously instead of waiting\n // for the SDK's (non-configurable) 10-second resume timeout.\n if (sdk.status === 'connecting') {\n try {\n await sdk.disconnect();\n } catch (error) {\n getCore(client).logger.debug(\n '[metamask] pre-connect disconnect rejected (expected when aborting a pairing the wallet never accepted)',\n error\n );\n }\n }\n\n await sdk.connect({ chainIds });\n };\n\n return {\n clearCachedDisplayUri: () => {\n latestDisplayUri = undefined;\n },\n connect,\n getLatestDisplayUri: () => latestDisplayUri,\n onDisplayUri,\n sdk,\n };\n};\n","import { createRuntimeServiceAccessKey } from '@dynamic-labs-sdk/client/core';\n\nimport { createMetaMaskEvmController } from '../createMetaMaskEvmController';\n\nconst RUNTIME_SERVICE_KEY = 'metaMaskEvmController';\n\n/**\n * Per-`DynamicClient` accessor for the lazily-constructed MetaMask EVM\n * controller. Wraps `createMetaMaskEvmController` with the standard\n * `runtimeServices` cache so every caller — the EIP-1193 wallet-provider\n * façade, the `display_uri` subscription helper, and the\n * `connectWithMetaMaskEvm` URI-returning helper — shares the same\n * controller (and therefore the same SDK instance, display-URI cache, and\n * listener registry) per Dynamic client.\n *\n * This matches the pattern used by the WalletConnect `getSignClient`\n * accessor: the first call triggers construction; subsequent calls\n * (within the same client) return the cached promise without re-running\n * the builder.\n *\n * The cache is **per-Dynamic-client, not per-SDK-instance**:\n * `@metamask/connect-evm`'s `createEVMClient` is itself a singleton —\n * a second call returns the same underlying SDK — so when multiple\n * Dynamic clients coexist they end up sharing the same MetaMask SDK\n * instance (and therefore the same active pairing session) regardless\n * of this cache. The wrapper exists to own the controller's\n * `display_uri` cache and listener registry per Dynamic client, which\n * the SDK itself does not expose.\n *\n * @not-instrumented\n */\nexport const getOrCreateMetaMaskEvmController = createRuntimeServiceAccessKey(\n RUNTIME_SERVICE_KEY,\n (client) => createMetaMaskEvmController(client)\n);\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getCore } from '@dynamic-labs-sdk/client/core';\nimport type {\n Address,\n Hex,\n EIP1193Provider as SdkEip1193Provider,\n} from '@metamask/connect-evm';\n\nimport type { EIP1193ProviderEvents } from '../../../EvmWalletProvider.types';\n\nconst NOOP_UNSUBSCRIBE = (): void => undefined;\n\n/**\n * A facade listener captured by the MetaMask EVM wallet-provider facade.\n *\n * The discriminated-union shape (rather than `{ event: string; listener:\n * (...args: unknown[]) => void }`) is what lets\n * `subscribeMetaMaskEvmFacadeListener` narrow the listener type per\n * event, so the per-event adapters stay type-safe without casts.\n */\nexport type PendingMetaMaskEvmFacadeListener = {\n [E in keyof EIP1193ProviderEvents]: {\n event: E;\n listener: EIP1193ProviderEvents[E];\n };\n}[keyof EIP1193ProviderEvents];\n\n/**\n * Subscribes a facade listener to the underlying MetaMask SDK provider,\n * forwarding events through per-event adapters:\n *\n * - `accountsChanged` — clones the readonly addresses array\n * `@metamask/connect-evm` hands the listener, since the Dynamic SDK\n * facade contract emits a mutable `Address[]`.\n * - `chainChanged` — passes the chain id through verbatim.\n * - `disconnected` — bridged to the SDK's canonical `disconnect`\n * event, which the SDK actually emits.\n *\n * Returns the unsubscribe function returned by the SDK provider so the\n * caller can clean it up later (for example, when the facade's\n * `removeAllListeners` is invoked).\n *\n * @not-instrumented\n */\nexport const subscribeMetaMaskEvmFacadeListener = ({\n client,\n pending,\n provider,\n}: {\n client: DynamicClient;\n pending: PendingMetaMaskEvmFacadeListener;\n provider: SdkEip1193Provider;\n}): (() => void) => {\n if (pending.event === 'accountsChanged') {\n return provider.on('accountsChanged', (addresses: readonly Address[]) =>\n pending.listener([...addresses])\n );\n }\n\n if (pending.event === 'chainChanged') {\n return provider.on('chainChanged', (chainId: Hex) =>\n pending.listener(chainId)\n );\n }\n\n if (pending.event === 'disconnected') {\n // The SDK emits its canonical `disconnect` event, which we bridge\n // to the facade's `disconnected` contract here.\n return provider.on('disconnect', () => pending.listener());\n }\n\n // Defensive fallthrough: a new entry was added to `EIP1193ProviderEvents`\n // but the per-event adapter list above was not updated. We log the\n // unhandled event and return a no-op unsubscribe so the consumer's\n // teardown loop still runs cleanly.\n const exhaustiveCheck: never = pending;\n getCore(client).logger.debug(\n '[metamask] subscribeMetaMaskEvmFacadeListener: unhandled event',\n (exhaustiveCheck as { event: unknown }).event\n );\n return NOOP_UNSUBSCRIBE;\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n DYNAMIC_ICONIC_SPRITE_URL,\n getCore,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\n\nimport type {\n EIP1193Provider,\n EIP1193ProviderEvents,\n EIP1193ProviderRequest,\n EvmWalletProvider,\n} from '../../EvmWalletProvider.types';\nimport { createWalletProviderFromEIP1193Provider } from '../../utils/createWalletProviderFromEIP1193Provider';\nimport { getOrCreateMetaMaskEvmController } from '../utils/getOrCreateMetaMaskEvmController';\nimport type { PendingMetaMaskEvmFacadeListener } from '../utils/subscribeMetaMaskEvmFacadeListener';\nimport { subscribeMetaMaskEvmFacadeListener } from '../utils/subscribeMetaMaskEvmFacadeListener';\n\nconst METAMASK_DISPLAY_NAME = 'MetaMask';\nconst METAMASK_ICON = `${DYNAMIC_ICONIC_SPRITE_URL}#metamask`;\n\n/**\n * Builds the `EvmWalletProvider` registered AFTER a successful MetaMask\n * SDK URI pairing. Wraps the SDK's EIP-1193 provider behind the Dynamic\n * facade (`disconnect` → `disconnected` event bridge, `removeAllListeners`\n * shim) and drops `connect` so the provider is filtered out of the\n * wallet picker by `getAvailableWalletProvidersData` — mirroring how\n * WalletConnect URI sessions register a signing-only provider.\n *\n * @not-instrumented\n */\nexport const createMetaMaskEvmWalletProvider = async (\n client: DynamicClient\n): Promise<EvmWalletProvider> => {\n const controller = await getOrCreateMetaMaskEvmController(client);\n const provider = controller.sdk.getProvider();\n\n const subscriberCleanups = new Set<() => void>();\n\n const eip1193Provider: EIP1193Provider = {\n // eslint-disable-next-line custom-rules/require-single-object-param -- EIP-1193 `on` signature is fixed by the interface contract.\n on: <E extends keyof EIP1193ProviderEvents>(\n event: E,\n listener: EIP1193ProviderEvents[E]\n ) => {\n const pending = { event, listener } as PendingMetaMaskEvmFacadeListener;\n subscriberCleanups.add(\n subscribeMetaMaskEvmFacadeListener({ client, pending, provider })\n );\n },\n removeAllListeners: () => {\n for (const unsubscribe of subscriberCleanups) {\n try {\n unsubscribe();\n } catch (error) {\n getCore(client).logger.error(\n '[metamask] removeAllListeners: unsubscribe failed',\n error\n );\n }\n }\n subscriberCleanups.clear();\n },\n request: <T = unknown>(request: EIP1193ProviderRequest): Promise<T> =>\n provider.request(request) as Promise<T>,\n };\n\n const walletProvider = createWalletProviderFromEIP1193Provider(\n {\n displayName: METAMASK_DISPLAY_NAME,\n eip1193: eip1193Provider,\n icon: METAMASK_ICON,\n walletProviderType: WalletProviderEnum.QrCode,\n },\n client\n );\n\n return {\n ...walletProvider,\n connect: undefined,\n };\n};\n","import {\n type WalletAccount,\n type WalletProviderUriConnectionResult,\n getDefaultClient,\n verifyWalletAccount,\n} from '@dynamic-labs-sdk/client';\nimport { connectWithMetaMaskUri } from '@dynamic-labs-sdk/metamask';\n\nimport { registerEvmNetworkProviderBuilder } from '../../registerEvmNetworkProviderBuilder';\nimport { createMetaMaskEvmWalletProvider } from '../createMetaMaskEvmWalletProvider';\nimport { getOrCreateMetaMaskEvmController } from '../utils/getOrCreateMetaMaskEvmController';\n\n/**\n * Drives a MetaMask SDK URI pairing for EVM and verifies ownership of the\n * paired wallet account through message signing, returning `{ approval, uri }`\n * so consumers can render the QR / hand the URI to a deeplink.\n *\n * Unlike `connectAndVerifyWithWalletConnectEvm`, the MetaMask SDK does not\n * expose a single-round-trip authenticate primitive, so this drives two\n * sequential interactions on the wallet side: the user first approves the\n * pairing, then approves a sign-in message. The wallet account is added to\n * the Dynamic client as a verified credential (not as an unverified\n * account).\n *\n * @not-instrumented\n */\nexport const connectAndVerifyWithMetaMaskUriEvm = async (\n client = getDefaultClient()\n): Promise<WalletProviderUriConnectionResult> => {\n registerEvmNetworkProviderBuilder(client);\n\n const { approval, uri } = await connectWithMetaMaskUri(\n {\n addToDynamicWalletAccounts: false,\n chain: 'EVM',\n getController: getOrCreateMetaMaskEvmController,\n walletProviderBuilder: createMetaMaskEvmWalletProvider,\n },\n client\n );\n\n const verifiedApproval = async (): Promise<{\n walletAccounts: WalletAccount[];\n }> => {\n const { walletAccounts } = await approval();\n\n // MetaMask SDK exposes a single active address per pairing (same\n // model as EIP-1193 `eth_accounts`), mirroring how the underlying\n // `connectWithMetaMaskUri` materializes a single account from\n // `addresses[0]`. Verify it directly.\n const [walletAccount] = walletAccounts;\n\n if (walletAccount) {\n await verifyWalletAccount({ walletAccount }, client);\n }\n\n return { walletAccounts };\n };\n\n return { approval: verifiedApproval, uri };\n};\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport type { WalletProviderUriConnectionResult } from '@dynamic-labs-sdk/client';\nimport { connectWithMetaMaskUri } from '@dynamic-labs-sdk/metamask';\n\nimport { registerEvmNetworkProviderBuilder } from '../../registerEvmNetworkProviderBuilder';\nimport { createMetaMaskEvmWalletProvider } from '../createMetaMaskEvmWalletProvider';\nimport { getOrCreateMetaMaskEvmController } from '../utils/getOrCreateMetaMaskEvmController';\n\nexport type ConnectWithMetaMaskUriEvmParams = {\n /** Whether to add the connected wallet account to the Dynamic client. Defaults to `true`. */\n addToDynamicWalletAccounts?: boolean;\n};\n\n/**\n * Drives a MetaMask SDK URI pairing for EVM and returns `{ approval, uri }` so\n * consumers can render the QR / hand the URI to a deeplink. Logs an advisory\n * warning when the MetaMask extension is announced via EIP-6963; pairing still\n * proceeds, but the consumer is told which announced provider key to route\n * through for the best UX. The resulting wallet provider registers for signing\n * only and is never surfaced in the wallet picker.\n *\n * @not-instrumented\n */\nexport const connectWithMetaMaskUriEvm = (\n { addToDynamicWalletAccounts = true }: ConnectWithMetaMaskUriEvmParams = {},\n client = getDefaultClient()\n): Promise<WalletProviderUriConnectionResult> => {\n registerEvmNetworkProviderBuilder(client);\n\n return connectWithMetaMaskUri(\n {\n addToDynamicWalletAccounts,\n chain: 'EVM',\n getController: getOrCreateMetaMaskEvmController,\n walletProviderBuilder: createMetaMaskEvmWalletProvider,\n },\n client\n );\n};\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { getMetaMaskExtensionWalletProviderKey } from '@dynamic-labs-sdk/metamask';\n\n/**\n * Returns the wallet provider key of the MetaMask browser extension announced\n * for EVM, or `undefined` when none is announced. Pass the returned key to\n * `connectWithWalletProvider` to route through the announced provider; fall\n * back to `connectWithMetaMaskUriEvm` when `undefined`.\n *\n * @not-instrumented\n */\nexport const getMetaMaskEvmExtensionWalletProviderKey = (\n client = getDefaultClient()\n): string | undefined =>\n getMetaMaskExtensionWalletProviderKey({ chain: 'EVM' }, client);\n","import { assertPackageVersion } from '@dynamic-labs-sdk/assert-package-version';\n\nimport {\n name as packageName,\n version as packageVersion,\n} from '../../package.json';\nassertPackageVersion(packageName, packageVersion);\n\nexport { connectAndVerifyWithMetaMaskUriEvm } from '../metamask/connectAndVerifyWithMetaMaskUriEvm';\nexport { connectWithMetaMaskUriEvm } from '../metamask/connectWithMetaMaskUriEvm';\nexport type { ConnectWithMetaMaskUriEvmParams } from '../metamask/connectWithMetaMaskUriEvm/connectWithMetaMaskUriEvm';\nexport { getMetaMaskEvmExtensionWalletProviderKey } from '../metamask/getMetaMaskEvmExtensionWalletProviderKey';\nexport { MetaMaskDisplayUriMissingError } from '@dynamic-labs-sdk/metamask';\n"],"mappings":"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"}