@dynamic-labs-sdk/evm 1.31.0 → 1.31.2

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 (126) hide show
  1. package/README.md +22 -0
  2. package/dist/{addWaasEvmExtension-CyXCTxGv.esm.js → addWaasEvmExtension-BMR_gR6B.esm.js} +10 -6
  3. package/dist/addWaasEvmExtension-BMR_gR6B.esm.js.map +1 -0
  4. package/dist/{addWaasEvmExtension-CP2ibnvq.cjs → addWaasEvmExtension-BjoGfmQX.cjs} +9 -5
  5. package/dist/addWaasEvmExtension-BjoGfmQX.cjs.map +1 -0
  6. package/dist/{addWaasEvmExtension-DYKWl5DG.native.esm.js → addWaasEvmExtension-KdZlXrUW.native.esm.js} +10 -6
  7. package/dist/addWaasEvmExtension-KdZlXrUW.native.esm.js.map +1 -0
  8. package/dist/baseAccount.cjs +1 -1
  9. package/dist/baseAccount.esm.js +1 -1
  10. package/dist/baseAccount.native.esm.js +1 -1
  11. package/dist/core.cjs +1 -1
  12. package/dist/core.esm.js +1 -1
  13. package/dist/core.native.esm.js +1 -1
  14. package/dist/eip6963.cjs +1 -1
  15. package/dist/eip6963.esm.js +1 -1
  16. package/dist/eip6963.native.esm.js +1 -1
  17. package/dist/errors/MetaMaskDirectConnectNotSupportedError/MetaMaskDirectConnectNotSupportedError.d.ts +14 -0
  18. package/dist/errors/MetaMaskDirectConnectNotSupportedError/MetaMaskDirectConnectNotSupportedError.d.ts.map +1 -0
  19. package/dist/errors/MetaMaskDirectConnectNotSupportedError/index.d.ts +2 -0
  20. package/dist/errors/MetaMaskDirectConnectNotSupportedError/index.d.ts.map +1 -0
  21. package/dist/exports/metamask.d.ts +3 -0
  22. package/dist/exports/metamask.d.ts.map +1 -1
  23. package/dist/index.cjs +2 -2
  24. package/dist/index.esm.js +2 -2
  25. package/dist/index.native.esm.js +2 -2
  26. package/dist/metamask/addMetaMaskEvmExtension/addMetaMaskEvmExtension.d.ts +23 -0
  27. package/dist/metamask/addMetaMaskEvmExtension/addMetaMaskEvmExtension.d.ts.map +1 -0
  28. package/dist/metamask/addMetaMaskEvmExtension/index.d.ts +2 -0
  29. package/dist/metamask/addMetaMaskEvmExtension/index.d.ts.map +1 -0
  30. package/dist/metamask/connectAndVerifyWithMetaMaskUriEvm/connectAndVerifyWithMetaMaskUriEvm.d.ts.map +1 -1
  31. package/dist/metamask/connectWithMetaMaskUriEvm/connectWithMetaMaskUriEvm.d.ts.map +1 -1
  32. package/dist/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.d.ts +20 -3
  33. package/dist/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.d.ts.map +1 -1
  34. package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/getMetaMaskEvmSdkWalletProviderKey.d.ts +17 -0
  35. package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/getMetaMaskEvmSdkWalletProviderKey.d.ts.map +1 -0
  36. package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/index.d.ts +2 -0
  37. package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/index.d.ts.map +1 -0
  38. package/dist/metamask/registerMetaMaskEvmUriConnectionStarter/index.d.ts +2 -0
  39. package/dist/metamask/registerMetaMaskEvmUriConnectionStarter/index.d.ts.map +1 -0
  40. package/dist/metamask/registerMetaMaskEvmUriConnectionStarter/registerMetaMaskEvmUriConnectionStarter.d.ts +22 -0
  41. package/dist/metamask/registerMetaMaskEvmUriConnectionStarter/registerMetaMaskEvmUriConnectionStarter.d.ts.map +1 -0
  42. package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/index.d.ts +2 -0
  43. package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/index.d.ts.map +1 -0
  44. package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/warnMetaMaskEvmIntegrationIncomplete.d.ts +18 -0
  45. package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/warnMetaMaskEvmIntegrationIncomplete.d.ts.map +1 -0
  46. package/dist/metamask.cjs +230 -247
  47. package/dist/metamask.cjs.map +1 -1
  48. package/dist/metamask.esm.js +231 -251
  49. package/dist/metamask.esm.js.map +1 -1
  50. package/dist/metamask.native.esm.js +231 -251
  51. package/dist/metamask.native.esm.js.map +1 -1
  52. package/dist/{package--hhb8lj2.native.esm.js → package-DHXe8K1l.native.esm.js} +2 -2
  53. package/dist/package-DHXe8K1l.native.esm.js.map +1 -0
  54. package/dist/{package-CIdQu8lB.cjs → package-cXTEEW7P.cjs} +2 -2
  55. package/dist/package-cXTEEW7P.cjs.map +1 -0
  56. package/dist/{package-D0IvC55z.esm.js → package-wISL2vMS.esm.js} +2 -2
  57. package/dist/package-wISL2vMS.esm.js.map +1 -0
  58. package/dist/tempo.cjs +1 -1
  59. package/dist/tempo.esm.js +1 -1
  60. package/dist/tempo.native.esm.js +1 -1
  61. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  62. package/dist/viem.cjs +1 -1
  63. package/dist/viem.esm.js +1 -1
  64. package/dist/viem.native.esm.js +1 -1
  65. package/dist/waas/utils/createWalletProviderForWaasEvm/signAuthorization/signAuthorization.d.ts.map +1 -1
  66. package/dist/waas/utils/createWalletProviderForWaasEvm/signTypedData/signTypedData.d.ts.map +1 -1
  67. package/dist/waas.cjs +2 -2
  68. package/dist/waas.esm.js +2 -2
  69. package/dist/waas.native.esm.js +2 -2
  70. package/dist/walletConnect/addWalletConnectEvmExtension/addWalletConnectEvmExtension.d.ts.map +1 -1
  71. package/dist/walletConnect/registerWalletConnectEvmUriConnectionStarter/index.d.ts +2 -0
  72. package/dist/walletConnect/registerWalletConnectEvmUriConnectionStarter/index.d.ts.map +1 -0
  73. package/dist/walletConnect/registerWalletConnectEvmUriConnectionStarter/registerWalletConnectEvmUriConnectionStarter.d.ts +19 -0
  74. package/dist/walletConnect/registerWalletConnectEvmUriConnectionStarter/registerWalletConnectEvmUriConnectionStarter.d.ts.map +1 -0
  75. package/dist/walletConnect.cjs +98 -58
  76. package/dist/walletConnect.cjs.map +1 -1
  77. package/dist/walletConnect.esm.js +99 -59
  78. package/dist/walletConnect.esm.js.map +1 -1
  79. package/dist/walletConnect.native.esm.js +99 -59
  80. package/dist/walletConnect.native.esm.js.map +1 -1
  81. package/dist/windowInjected/utils/detectEvmWalletFromProvider/detectEvmWalletFromProvider.d.ts.map +1 -1
  82. package/dist/windowInjected/utils/isProviderSelectionRouter/index.d.ts +2 -0
  83. package/dist/windowInjected/utils/isProviderSelectionRouter/index.d.ts.map +1 -0
  84. package/dist/windowInjected/utils/isProviderSelectionRouter/isProviderSelectionRouter.d.ts +30 -0
  85. package/dist/windowInjected/utils/isProviderSelectionRouter/isProviderSelectionRouter.d.ts.map +1 -0
  86. package/dist/windowInjected.cjs +34 -1
  87. package/dist/windowInjected.cjs.map +1 -1
  88. package/dist/windowInjected.esm.js +34 -1
  89. package/dist/windowInjected.esm.js.map +1 -1
  90. package/dist/windowInjected.native.esm.js +34 -1
  91. package/dist/windowInjected.native.esm.js.map +1 -1
  92. package/package.json +5 -6
  93. package/dist/addWaasEvmExtension-CP2ibnvq.cjs.map +0 -1
  94. package/dist/addWaasEvmExtension-CyXCTxGv.esm.js.map +0 -1
  95. package/dist/addWaasEvmExtension-DYKWl5DG.native.esm.js.map +0 -1
  96. package/dist/getEvmNetworksData-CGZjI4hV.native.esm.js +0 -18
  97. package/dist/getEvmNetworksData-CGZjI4hV.native.esm.js.map +0 -1
  98. package/dist/getEvmNetworksData-ChkgLvCg.esm.js +0 -18
  99. package/dist/getEvmNetworksData-ChkgLvCg.esm.js.map +0 -1
  100. package/dist/getEvmNetworksData-DBJIMiOH.cjs +0 -23
  101. package/dist/getEvmNetworksData-DBJIMiOH.cjs.map +0 -1
  102. package/dist/metamask/metamask.types.d.ts +0 -14
  103. package/dist/metamask/metamask.types.d.ts.map +0 -1
  104. package/dist/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.d.ts +0 -18
  105. package/dist/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.d.ts.map +0 -1
  106. package/dist/metamask/utils/createMetaMaskEvmController/index.d.ts +0 -2
  107. package/dist/metamask/utils/createMetaMaskEvmController/index.d.ts.map +0 -1
  108. package/dist/metamask/utils/getOrCreateMetaMaskEvmController/getOrCreateMetaMaskEvmController.d.ts +0 -27
  109. package/dist/metamask/utils/getOrCreateMetaMaskEvmController/getOrCreateMetaMaskEvmController.d.ts.map +0 -1
  110. package/dist/metamask/utils/getOrCreateMetaMaskEvmController/index.d.ts +0 -2
  111. package/dist/metamask/utils/getOrCreateMetaMaskEvmController/index.d.ts.map +0 -1
  112. package/dist/metamask/utils/getSupportedNetworks/getSupportedNetworks.d.ts +0 -6
  113. package/dist/metamask/utils/getSupportedNetworks/getSupportedNetworks.d.ts.map +0 -1
  114. package/dist/metamask/utils/getSupportedNetworks/index.d.ts +0 -2
  115. package/dist/metamask/utils/getSupportedNetworks/index.d.ts.map +0 -1
  116. package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/index.d.ts +0 -3
  117. package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/index.d.ts.map +0 -1
  118. package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/subscribeMetaMaskEvmFacadeListener.d.ts +0 -40
  119. package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/subscribeMetaMaskEvmFacadeListener.d.ts.map +0 -1
  120. package/dist/metamask/utils/warnWhenChainNotConfigured/index.d.ts +0 -3
  121. package/dist/metamask/utils/warnWhenChainNotConfigured/index.d.ts.map +0 -1
  122. package/dist/metamask/utils/warnWhenChainNotConfigured/warnWhenChainNotConfigured.d.ts +0 -28
  123. package/dist/metamask/utils/warnWhenChainNotConfigured/warnWhenChainNotConfigured.d.ts.map +0 -1
  124. package/dist/package--hhb8lj2.native.esm.js.map +0 -1
  125. package/dist/package-CIdQu8lB.cjs.map +0 -1
  126. package/dist/package-D0IvC55z.esm.js.map +0 -1
@@ -0,0 +1,18 @@
1
+ import type { DynamicClient } from '@dynamic-labs-sdk/client';
2
+ /**
3
+ * Warns when `addMetaMaskEvmExtension()` hasn't been added, since a wallet
4
+ * connected via `connectWithMetaMaskUriEvm` without it won't be restored
5
+ * after a page reload.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * warnMetaMaskEvmIntegrationIncomplete(client);
10
+ * ```
11
+ * @param client - The Dynamic client instance.
12
+ * @returns void
13
+ * @see connectWithMetaMaskUriEvm
14
+ * @see addMetaMaskEvmExtension
15
+ * @notInstrumented
16
+ */
17
+ export declare const warnMetaMaskEvmIntegrationIncomplete: (client: DynamicClient) => void;
18
+ //# sourceMappingURL=warnMetaMaskEvmIntegrationIncomplete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warnMetaMaskEvmIntegrationIncomplete.d.ts","sourceRoot":"","sources":["../../../src/metamask/warnMetaMaskEvmIntegrationIncomplete/warnMetaMaskEvmIntegrationIncomplete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAK9D;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,oCAAoC,GAC/C,QAAQ,aAAa,KACpB,IAeF,CAAC"}
package/dist/metamask.cjs CHANGED
@@ -1,216 +1,59 @@
1
- const require_package = require('./package-CIdQu8lB.cjs');
1
+ const require_package = require('./package-cXTEEW7P.cjs');
2
2
  const require_evmTransferAmount = require('./evmTransferAmount-Ddvx91b0.cjs');
3
3
  require('./createPublicClientFromNetworkData-BAC8YTrK.cjs');
4
4
  const require_createWalletProviderFromEIP1193Provider = require('./createWalletProviderFromEIP1193Provider-E1WbEBET.cjs');
5
- const require_getEvmNetworksData = require('./getEvmNetworksData-DBJIMiOH.cjs');
6
5
  let _dynamic_labs_sdk_assert_package_version = require("@dynamic-labs-sdk/assert-package-version");
7
6
  let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
8
7
  let _dynamic_labs_sdk_client_core = require("@dynamic-labs-sdk/client/core");
9
8
  let _dynamic_labs_sdk_api_core = require("@dynamic-labs/sdk-api-core");
9
+ let _dynamic_labs_sdk_metamask_core = require("@dynamic-labs-sdk/metamask/core");
10
10
  let _dynamic_labs_sdk_metamask = require("@dynamic-labs-sdk/metamask");
11
- let _metamask_connect_evm = require("@metamask/connect-evm");
12
11
 
13
- //#region src/metamask/utils/getSupportedNetworks/getSupportedNetworks.ts
14
- /** @notInstrumented */
15
- const getSupportedNetworks = (client) => {
16
- const evmNetworks = require_getEvmNetworksData.getEvmNetworksData(client).sort((a, b) => {
17
- if (a.networkId === "1") return -1;
18
- if (b.networkId === "1") return 1;
19
- return 0;
20
- });
21
- (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.");
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
- (0, _dynamic_labs_sdk_client_core.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 } = (0, _dynamic_labs_sdk_client_core.getAppMetadata)(client);
70
- const { logger } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
71
- await (0, _dynamic_labs_sdk_metamask.clearMetaMaskSessionStorage)(client);
72
- const listeners = /* @__PURE__ */ new Set();
73
- let latestDisplayUri;
74
- const sdk = await (0, _metamask_connect_evm.createEVMClient)({
75
- api: { supportedNetworks },
76
- dapp: {
77
- iconUrl: appLogoUrl,
78
- name: appName,
79
- nativeScheme: (0, _dynamic_labs_sdk_client_core.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 } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
107
- logger$1.debug("[metamask] opening MWP deeplink", deeplink);
108
- (0, _dynamic_labs_sdk_client_core.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
- (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);
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 _dynamic_labs_sdk_client.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";
35
+ //#region src/metamask/getMetaMaskEvmSdkWalletProviderKey/getMetaMaskEvmSdkWalletProviderKey.ts
36
+ const METAMASK_EVM_SDK_DISPLAY_NAME = "MetaMask";
159
37
  /**
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.
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`.
181
42
  *
43
+ * @example
44
+ * ```ts
45
+ * const key = getMetaMaskEvmSdkWalletProviderKey();
46
+ * ```
47
+ * @returns The deterministic wallet provider key.
48
+ * @see createMetaMaskEvmWalletProvider
49
+ * @see reconcileMetaMaskWalletProvider
182
50
  * @notInstrumented
183
51
  */
184
- const getOrCreateMetaMaskEvmController = (0, _dynamic_labs_sdk_client_core.createRuntimeServiceAccessKey)(RUNTIME_SERVICE_KEY, (client) => createMetaMaskEvmController(client));
185
-
186
- //#endregion
187
- //#region src/metamask/utils/subscribeMetaMaskEvmFacadeListener/subscribeMetaMaskEvmFacadeListener.ts
188
- const NOOP_UNSUBSCRIBE = () => void 0;
189
- /**
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).
203
- *
204
- * @notInstrumented
205
- */
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
- (0, _dynamic_labs_sdk_client_core.getCore)(client).logger.debug("[metamask] subscribeMetaMaskEvmFacadeListener: unhandled event", exhaustiveCheck.event);
212
- return NOOP_UNSUBSCRIBE;
213
- };
52
+ const getMetaMaskEvmSdkWalletProviderKey = () => (0, _dynamic_labs_sdk_client_core.formatWalletProviderKey)({
53
+ chain: "EVM",
54
+ displayName: METAMASK_EVM_SDK_DISPLAY_NAME,
55
+ walletProviderType: _dynamic_labs_sdk_api_core.WalletProviderEnum.QrCode
56
+ });
214
57
 
215
58
  //#endregion
216
59
  //#region src/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.ts
@@ -219,70 +62,149 @@ const METAMASK_ICON = `${_dynamic_labs_sdk_client_core.DYNAMIC_ICONIC_SPRITE_URL
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 _dynamic_labs_sdk_metamask.MetaMaskWalletNotConnectedError();
235
- const provider = controller.sdk.getProvider();
236
- const subscriberCleanups = /* @__PURE__ */ new Set();
237
- return {
238
- ...require_createWalletProviderFromEIP1193Provider.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
- (0, _dynamic_labs_sdk_client_core.getCore)(client).logger.error("[metamask] removeAllListeners: unsubscribe failed", error);
257
- }
258
- subscriberCleanups.clear();
259
- },
260
- request: async (request) => {
261
- const { logger } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
262
- logger.debug("[metamask] eip1193 request dispatched", {
92
+ const createMetaMaskEvmWalletProvider = (client) => {
93
+ const metaMaskClientInstanceManager = (0, _dynamic_labs_sdk_metamask_core.getOrCreateMetaMaskClientInstanceManager)(client);
94
+ const walletProviderKey = getMetaMaskEvmSdkWalletProviderKey();
95
+ const metaMaskEvents = (0, _dynamic_labs_sdk_metamask_core.createMetaMaskWalletProviderEventEmitter)();
96
+ const walletProvider = require_createWalletProviderFromEIP1193Provider.createWalletProviderFromEIP1193Provider({
97
+ displayName: METAMASK_DISPLAY_NAME,
98
+ eip1193: {
99
+ on: () => {},
100
+ removeAllListeners: () => {},
101
+ request: async (request) => {
102
+ const { logger } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
103
+ const metaMaskClient = await metaMaskClientInstanceManager.getMetaMaskClient();
104
+ try {
105
+ const { networkId } = await (0, _dynamic_labs_sdk_metamask_core.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
114
+ });
115
+ if (request.method === "eth_chainId") return `0x${Number(networkId).toString(16)}`;
116
+ const result = await metaMaskClient.invokeMethod({
117
+ request,
118
+ scope: `eip155:${networkId}`
265
119
  });
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
- }
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: _dynamic_labs_sdk_api_core.WalletProviderEnum.QrCode
281
- }, client),
282
- connect: void 0
129
+ }
130
+ },
131
+ icon: METAMASK_ICON,
132
+ walletProviderType: _dynamic_labs_sdk_api_core.WalletProviderEnum.QrCode
133
+ }, client);
134
+ const switchActiveNetwork = async ({ networkId }) => {
135
+ await (0, _dynamic_labs_sdk_metamask_core.assertMetaMaskNetworkIsGranted)({
136
+ chain: "EVM",
137
+ metaMaskClient: await metaMaskClientInstanceManager.getMetaMaskClient(),
138
+ networkId
139
+ }, client);
140
+ const { networkId: previousNetworkId } = await (0, _dynamic_labs_sdk_client_core.getActiveNetworkIdFromLastKnownRegistry)({
141
+ client,
142
+ walletProviderKey
143
+ });
144
+ await (0, _dynamic_labs_sdk_client_core.switchActiveNetworkInLastKnownRegistry)({
145
+ client,
146
+ networkId,
147
+ walletProviderKey
148
+ });
149
+ if (networkId !== previousNetworkId) metaMaskEvents.emitNetworkChanged({ networkId });
150
+ };
151
+ const disconnectWalletAccount = async () => {
152
+ await (0, _dynamic_labs_sdk_metamask_core.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 = (0, _dynamic_labs_sdk_client_core.getDefaultClient)()) => {
199
+ if ((0, _dynamic_labs_sdk_client_core.hasExtension)({ extensionKey: METAMASK_EVM_EXTENSION_KEY }, client)) return;
200
+ require_evmTransferAmount.registerEvmNetworkProviderBuilder(client);
201
+ (0, _dynamic_labs_sdk_client_core.registerExtension)({ extensionKey: METAMASK_EVM_EXTENSION_KEY }, client);
202
+ (0, _dynamic_labs_sdk_metamask_core.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 = (0, _dynamic_labs_sdk
304
226
  const { approval, uri } = await (0, _dynamic_labs_sdk_metamask.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 = (0, _dynamic_labs_sdk
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 ((0, _dynamic_labs_sdk_client_core.hasExtension)({ extensionKey: METAMASK_EVM_EXTENSION_KEY }, client)) return;
262
+ (0, _dynamic_labs_sdk_client_core.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 = (0, _dynamic_labs_sdk
332
282
  * @notInstrumented
333
283
  */
334
284
  const connectWithMetaMaskUriEvm = ({ addToDynamicWalletAccounts = true } = {}, client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => {
285
+ warnMetaMaskEvmIntegrationIncomplete(client);
335
286
  require_evmTransferAmount.registerEvmNetworkProviderBuilder(client);
336
287
  return (0, _dynamic_labs_sdk_metamask.connectWithMetaMaskUri)({
337
288
  addToDynamicWalletAccounts,
338
289
  chain: "EVM",
339
- getController: getOrCreateMetaMaskEvmController,
340
290
  walletProviderBuilder: createMetaMaskEvmWalletProvider
341
291
  }, client);
342
292
  };
@@ -353,18 +303,51 @@ const connectWithMetaMaskUriEvm = ({ addToDynamicWalletAccounts = true } = {}, c
353
303
  */
354
304
  const getMetaMaskEvmExtensionWalletProviderKey = (client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => (0, _dynamic_labs_sdk_metamask.getMetaMaskExtensionWalletProviderKey)({ chain: "EVM" }, client);
355
305
 
306
+ //#endregion
307
+ //#region src/metamask/registerMetaMaskEvmUriConnectionStarter/registerMetaMaskEvmUriConnectionStarter.ts
308
+ /**
309
+ * Registers the MetaMask SDK URI pairing for EVM with the client, so higher
310
+ * level connection APIs can mint a MetaMask URI for EVM without depending on
311
+ * this package.
312
+ *
313
+ * Call it during app setup to opt into the MetaMask URI path — it is kept out
314
+ * of the EVM extension so apps that never pair with MetaMask over a URI don't
315
+ * bundle the MetaMask SDK.
316
+ *
317
+ * @example
318
+ * ```ts
319
+ * registerMetaMaskEvmUriConnectionStarter();
320
+ * ```
321
+ *
322
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
323
+ * @returns Nothing.
324
+ * @see connectWithMetaMaskUriEvm
325
+ * @see getUriConnectionStarterRegistry
326
+ * @notInstrumented
327
+ */
328
+ const registerMetaMaskEvmUriConnectionStarter = (client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => {
329
+ (0, _dynamic_labs_sdk_client_core.getUriConnectionStarterRegistry)(client).register({
330
+ chain: "EVM",
331
+ start: ({ addToDynamicWalletAccounts }) => connectWithMetaMaskUriEvm({ addToDynamicWalletAccounts }, client),
332
+ type: "metamaskSdkUri"
333
+ });
334
+ };
335
+
356
336
  //#endregion
357
337
  //#region src/exports/metamask.ts
358
338
  (0, _dynamic_labs_sdk_assert_package_version.assertPackageVersion)(require_package.name, require_package.version);
359
339
 
360
340
  //#endregion
341
+ exports.MetaMaskDirectConnectNotSupportedError = MetaMaskDirectConnectNotSupportedError;
361
342
  Object.defineProperty(exports, 'MetaMaskDisplayUriMissingError', {
362
343
  enumerable: true,
363
344
  get: function () {
364
345
  return _dynamic_labs_sdk_metamask.MetaMaskDisplayUriMissingError;
365
346
  }
366
347
  });
348
+ exports.addMetaMaskEvmExtension = addMetaMaskEvmExtension;
367
349
  exports.connectAndVerifyWithMetaMaskUriEvm = connectAndVerifyWithMetaMaskUriEvm;
368
350
  exports.connectWithMetaMaskUriEvm = connectWithMetaMaskUriEvm;
369
351
  exports.getMetaMaskEvmExtensionWalletProviderKey = getMetaMaskEvmExtensionWalletProviderKey;
352
+ exports.registerMetaMaskEvmUriConnectionStarter = registerMetaMaskEvmUriConnectionStarter;
370
353
  //# sourceMappingURL=metamask.cjs.map