@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.
- package/README.md +22 -0
- package/dist/baseAccount.cjs +1 -1
- package/dist/baseAccount.esm.js +1 -1
- package/dist/baseAccount.native.esm.js +1 -1
- package/dist/core.cjs +1 -1
- package/dist/core.esm.js +1 -1
- package/dist/core.native.esm.js +1 -1
- package/dist/eip6963.cjs +1 -1
- package/dist/eip6963.esm.js +1 -1
- package/dist/eip6963.native.esm.js +1 -1
- package/dist/errors/MetaMaskDirectConnectNotSupportedError/MetaMaskDirectConnectNotSupportedError.d.ts +14 -0
- package/dist/errors/MetaMaskDirectConnectNotSupportedError/MetaMaskDirectConnectNotSupportedError.d.ts.map +1 -0
- package/dist/errors/MetaMaskDirectConnectNotSupportedError/index.d.ts +2 -0
- package/dist/errors/MetaMaskDirectConnectNotSupportedError/index.d.ts.map +1 -0
- package/dist/exports/metamask.d.ts +2 -0
- package/dist/exports/metamask.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.native.esm.js +1 -1
- package/dist/metamask/addMetaMaskEvmExtension/addMetaMaskEvmExtension.d.ts +23 -0
- package/dist/metamask/addMetaMaskEvmExtension/addMetaMaskEvmExtension.d.ts.map +1 -0
- package/dist/metamask/addMetaMaskEvmExtension/index.d.ts +2 -0
- package/dist/metamask/addMetaMaskEvmExtension/index.d.ts.map +1 -0
- package/dist/metamask/connectAndVerifyWithMetaMaskUriEvm/connectAndVerifyWithMetaMaskUriEvm.d.ts.map +1 -1
- package/dist/metamask/connectWithMetaMaskUriEvm/connectWithMetaMaskUriEvm.d.ts.map +1 -1
- package/dist/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.d.ts +20 -3
- package/dist/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.d.ts.map +1 -1
- package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/getMetaMaskEvmSdkWalletProviderKey.d.ts +17 -0
- package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/getMetaMaskEvmSdkWalletProviderKey.d.ts.map +1 -0
- package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/index.d.ts +2 -0
- package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/index.d.ts.map +1 -0
- package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/index.d.ts +2 -0
- package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/index.d.ts.map +1 -0
- package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/warnMetaMaskEvmIntegrationIncomplete.d.ts +18 -0
- package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/warnMetaMaskEvmIntegrationIncomplete.d.ts.map +1 -0
- package/dist/metamask.cjs +199 -247
- package/dist/metamask.cjs.map +1 -1
- package/dist/metamask.esm.js +201 -251
- package/dist/metamask.esm.js.map +1 -1
- package/dist/metamask.native.esm.js +201 -251
- package/dist/metamask.native.esm.js.map +1 -1
- package/dist/{package--hhb8lj2.native.esm.js → package-BnSw-03C.native.esm.js} +2 -2
- package/dist/package-BnSw-03C.native.esm.js.map +1 -0
- package/dist/{package-CIdQu8lB.cjs → package-Dk-SYXOE.cjs} +2 -2
- package/dist/package-Dk-SYXOE.cjs.map +1 -0
- package/dist/{package-D0IvC55z.esm.js → package-DrSY9NJE.esm.js} +2 -2
- package/dist/package-DrSY9NJE.esm.js.map +1 -0
- package/dist/tempo.cjs +1 -1
- package/dist/tempo.esm.js +1 -1
- package/dist/tempo.native.esm.js +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/viem.cjs +1 -1
- package/dist/viem.esm.js +1 -1
- package/dist/viem.native.esm.js +1 -1
- package/dist/waas.cjs +1 -1
- package/dist/waas.esm.js +1 -1
- package/dist/waas.native.esm.js +1 -1
- package/dist/walletConnect.cjs +17 -4
- package/dist/walletConnect.cjs.map +1 -1
- package/dist/walletConnect.esm.js +16 -3
- package/dist/walletConnect.esm.js.map +1 -1
- package/dist/walletConnect.native.esm.js +16 -3
- package/dist/walletConnect.native.esm.js.map +1 -1
- package/dist/windowInjected.cjs +1 -1
- package/dist/windowInjected.esm.js +1 -1
- package/dist/windowInjected.native.esm.js +1 -1
- package/package.json +5 -6
- package/dist/getEvmNetworksData-CGZjI4hV.native.esm.js +0 -18
- package/dist/getEvmNetworksData-CGZjI4hV.native.esm.js.map +0 -1
- package/dist/getEvmNetworksData-ChkgLvCg.esm.js +0 -18
- package/dist/getEvmNetworksData-ChkgLvCg.esm.js.map +0 -1
- package/dist/getEvmNetworksData-DBJIMiOH.cjs +0 -23
- package/dist/getEvmNetworksData-DBJIMiOH.cjs.map +0 -1
- package/dist/metamask/metamask.types.d.ts +0 -14
- package/dist/metamask/metamask.types.d.ts.map +0 -1
- package/dist/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.d.ts +0 -18
- package/dist/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.d.ts.map +0 -1
- package/dist/metamask/utils/createMetaMaskEvmController/index.d.ts +0 -2
- package/dist/metamask/utils/createMetaMaskEvmController/index.d.ts.map +0 -1
- package/dist/metamask/utils/getOrCreateMetaMaskEvmController/getOrCreateMetaMaskEvmController.d.ts +0 -27
- package/dist/metamask/utils/getOrCreateMetaMaskEvmController/getOrCreateMetaMaskEvmController.d.ts.map +0 -1
- package/dist/metamask/utils/getOrCreateMetaMaskEvmController/index.d.ts +0 -2
- package/dist/metamask/utils/getOrCreateMetaMaskEvmController/index.d.ts.map +0 -1
- package/dist/metamask/utils/getSupportedNetworks/getSupportedNetworks.d.ts +0 -6
- package/dist/metamask/utils/getSupportedNetworks/getSupportedNetworks.d.ts.map +0 -1
- package/dist/metamask/utils/getSupportedNetworks/index.d.ts +0 -2
- package/dist/metamask/utils/getSupportedNetworks/index.d.ts.map +0 -1
- package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/index.d.ts +0 -3
- package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/index.d.ts.map +0 -1
- package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/subscribeMetaMaskEvmFacadeListener.d.ts +0 -40
- package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/subscribeMetaMaskEvmFacadeListener.d.ts.map +0 -1
- package/dist/metamask/utils/warnWhenChainNotConfigured/index.d.ts +0 -3
- package/dist/metamask/utils/warnWhenChainNotConfigured/index.d.ts.map +0 -1
- package/dist/metamask/utils/warnWhenChainNotConfigured/warnWhenChainNotConfigured.d.ts +0 -28
- package/dist/metamask/utils/warnWhenChainNotConfigured/warnWhenChainNotConfigured.d.ts.map +0 -1
- package/dist/package--hhb8lj2.native.esm.js.map +0 -1
- package/dist/package-CIdQu8lB.cjs.map +0 -1
- package/dist/package-D0IvC55z.esm.js.map +0 -1
|
@@ -1,216 +1,59 @@
|
|
|
1
|
-
import { n as version, t as name } from "./package
|
|
1
|
+
import { n as version, t as name } from "./package-BnSw-03C.native.esm.js";
|
|
2
2
|
import { s as registerEvmNetworkProviderBuilder } from "./evmTransferAmount-BftkuI-H.native.esm.js";
|
|
3
3
|
import "./createPublicClientFromNetworkData-9g8Hsu4A.native.esm.js";
|
|
4
4
|
import { t as createWalletProviderFromEIP1193Provider } from "./createWalletProviderFromEIP1193Provider-CDRA4dpW.native.esm.js";
|
|
5
|
-
import { t as getEvmNetworksData } from "./getEvmNetworksData-CGZjI4hV.native.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,
|
|
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 {
|
|
11
|
-
import {
|
|
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/
|
|
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
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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/
|
|
158
|
-
const
|
|
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
|
-
*
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
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
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
|
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 =
|
|
233
|
-
const
|
|
234
|
-
|
|
235
|
-
const
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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
|
-
|
|
112
|
+
networkId,
|
|
113
|
+
status: metaMaskClient.status
|
|
265
114
|
});
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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.native.esm.js.map
|