@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.
- package/README.md +22 -0
- package/dist/{addWaasEvmExtension-CyXCTxGv.esm.js → addWaasEvmExtension-BMR_gR6B.esm.js} +10 -6
- package/dist/addWaasEvmExtension-BMR_gR6B.esm.js.map +1 -0
- package/dist/{addWaasEvmExtension-CP2ibnvq.cjs → addWaasEvmExtension-BjoGfmQX.cjs} +9 -5
- package/dist/addWaasEvmExtension-BjoGfmQX.cjs.map +1 -0
- package/dist/{addWaasEvmExtension-DYKWl5DG.native.esm.js → addWaasEvmExtension-KdZlXrUW.native.esm.js} +10 -6
- package/dist/addWaasEvmExtension-KdZlXrUW.native.esm.js.map +1 -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 +3 -0
- package/dist/exports/metamask.d.ts.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.esm.js +2 -2
- package/dist/index.native.esm.js +2 -2
- 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/registerMetaMaskEvmUriConnectionStarter/index.d.ts +2 -0
- package/dist/metamask/registerMetaMaskEvmUriConnectionStarter/index.d.ts.map +1 -0
- package/dist/metamask/registerMetaMaskEvmUriConnectionStarter/registerMetaMaskEvmUriConnectionStarter.d.ts +22 -0
- package/dist/metamask/registerMetaMaskEvmUriConnectionStarter/registerMetaMaskEvmUriConnectionStarter.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 +230 -247
- package/dist/metamask.cjs.map +1 -1
- package/dist/metamask.esm.js +231 -251
- package/dist/metamask.esm.js.map +1 -1
- package/dist/metamask.native.esm.js +231 -251
- package/dist/metamask.native.esm.js.map +1 -1
- package/dist/{package--hhb8lj2.native.esm.js → package-DHXe8K1l.native.esm.js} +2 -2
- package/dist/package-DHXe8K1l.native.esm.js.map +1 -0
- package/dist/{package-CIdQu8lB.cjs → package-cXTEEW7P.cjs} +2 -2
- package/dist/package-cXTEEW7P.cjs.map +1 -0
- package/dist/{package-D0IvC55z.esm.js → package-wISL2vMS.esm.js} +2 -2
- package/dist/package-wISL2vMS.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/utils/createWalletProviderForWaasEvm/signAuthorization/signAuthorization.d.ts.map +1 -1
- package/dist/waas/utils/createWalletProviderForWaasEvm/signTypedData/signTypedData.d.ts.map +1 -1
- package/dist/waas.cjs +2 -2
- package/dist/waas.esm.js +2 -2
- package/dist/waas.native.esm.js +2 -2
- package/dist/walletConnect/addWalletConnectEvmExtension/addWalletConnectEvmExtension.d.ts.map +1 -1
- package/dist/walletConnect/registerWalletConnectEvmUriConnectionStarter/index.d.ts +2 -0
- package/dist/walletConnect/registerWalletConnectEvmUriConnectionStarter/index.d.ts.map +1 -0
- package/dist/walletConnect/registerWalletConnectEvmUriConnectionStarter/registerWalletConnectEvmUriConnectionStarter.d.ts +19 -0
- package/dist/walletConnect/registerWalletConnectEvmUriConnectionStarter/registerWalletConnectEvmUriConnectionStarter.d.ts.map +1 -0
- package/dist/walletConnect.cjs +98 -58
- package/dist/walletConnect.cjs.map +1 -1
- package/dist/walletConnect.esm.js +99 -59
- package/dist/walletConnect.esm.js.map +1 -1
- package/dist/walletConnect.native.esm.js +99 -59
- package/dist/walletConnect.native.esm.js.map +1 -1
- package/dist/windowInjected/utils/detectEvmWalletFromProvider/detectEvmWalletFromProvider.d.ts.map +1 -1
- package/dist/windowInjected/utils/isProviderSelectionRouter/index.d.ts +2 -0
- package/dist/windowInjected/utils/isProviderSelectionRouter/index.d.ts.map +1 -0
- package/dist/windowInjected/utils/isProviderSelectionRouter/isProviderSelectionRouter.d.ts +30 -0
- package/dist/windowInjected/utils/isProviderSelectionRouter/isProviderSelectionRouter.d.ts.map +1 -0
- package/dist/windowInjected.cjs +34 -1
- package/dist/windowInjected.cjs.map +1 -1
- package/dist/windowInjected.esm.js +34 -1
- package/dist/windowInjected.esm.js.map +1 -1
- package/dist/windowInjected.native.esm.js +34 -1
- package/dist/windowInjected.native.esm.js.map +1 -1
- package/package.json +5 -6
- package/dist/addWaasEvmExtension-CP2ibnvq.cjs.map +0 -1
- package/dist/addWaasEvmExtension-CyXCTxGv.esm.js.map +0 -1
- package/dist/addWaasEvmExtension-DYKWl5DG.native.esm.js.map +0 -1
- 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-DHXe8K1l.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, getUriConnectionStarterRegistry, 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
|
|
12
|
+
//#region src/errors/MetaMaskDirectConnectNotSupportedError/MetaMaskDirectConnectNotSupportedError.ts
|
|
32
13
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
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
|
|
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.
|
|
44
21
|
*/
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
|
66
|
-
*/
|
|
67
|
-
const createMetaMaskEvmController = async (client) => {
|
|
68
|
-
const supportedNetworks = getSupportedNetworks(client);
|
|
69
|
-
const { appName, appLogoUrl, appUniversalLink, appNativeLink } = getAppMetadata(client);
|
|
70
|
-
const { logger } = getCore(client);
|
|
71
|
-
await clearMetaMaskSessionStorage(client);
|
|
72
|
-
const listeners = /* @__PURE__ */ new Set();
|
|
73
|
-
let latestDisplayUri;
|
|
74
|
-
const sdk = await createEVMClient({
|
|
75
|
-
api: { supportedNetworks },
|
|
76
|
-
dapp: {
|
|
77
|
-
iconUrl: appLogoUrl,
|
|
78
|
-
name: appName,
|
|
79
|
-
nativeScheme: getNativeLinkScheme({ nativeLink: appNativeLink }),
|
|
80
|
-
url: appUniversalLink ?? ""
|
|
81
|
-
},
|
|
82
|
-
debug: logger.isEnabled("debug"),
|
|
83
|
-
eventHandlers: {
|
|
84
|
-
chainChanged: (chainId) => {
|
|
85
|
-
warnWhenChainNotConfigured({
|
|
86
|
-
chainId,
|
|
87
|
-
supportedNetworks
|
|
88
|
-
}, client);
|
|
89
|
-
},
|
|
90
|
-
connect: ({ chainId }) => {
|
|
91
|
-
latestDisplayUri = void 0;
|
|
92
|
-
warnWhenChainNotConfigured({
|
|
93
|
-
chainId,
|
|
94
|
-
supportedNetworks
|
|
95
|
-
}, client);
|
|
96
|
-
},
|
|
97
|
-
disconnect: () => {
|
|
98
|
-
latestDisplayUri = void 0;
|
|
99
|
-
},
|
|
100
|
-
displayUri: (uri) => {
|
|
101
|
-
latestDisplayUri = uri;
|
|
102
|
-
for (const listener of listeners) listener(uri);
|
|
103
|
-
}
|
|
104
|
-
},
|
|
105
|
-
mobile: { preferredOpenLink: (deeplink) => {
|
|
106
|
-
const { logger: logger$1 } = getCore(client);
|
|
107
|
-
logger$1.debug("[metamask] opening MWP deeplink", deeplink);
|
|
108
|
-
getCore(client).openDeeplink(deeplink).then(() => {
|
|
109
|
-
logger$1.debug("[metamask] opened MWP deeplink", deeplink);
|
|
110
|
-
}).catch((error) => {
|
|
111
|
-
logger$1.warn("[metamask] failed to open MWP deeplink", error);
|
|
112
|
-
});
|
|
113
|
-
} },
|
|
114
|
-
ui: {
|
|
115
|
-
headless: true,
|
|
116
|
-
preferExtension: true
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
latestDisplayUri = void 0;
|
|
120
|
-
const onDisplayUri = (listener) => {
|
|
121
|
-
listeners.add(listener);
|
|
122
|
-
if (latestDisplayUri !== void 0) listener(latestDisplayUri);
|
|
123
|
-
return () => {
|
|
124
|
-
listeners.delete(listener);
|
|
125
|
-
};
|
|
126
|
-
};
|
|
127
|
-
const chainIds = Object.keys(supportedNetworks);
|
|
128
|
-
let inFlightConnect = null;
|
|
129
|
-
const connect = () => {
|
|
130
|
-
if (inFlightConnect) return inFlightConnect;
|
|
131
|
-
inFlightConnect = (async () => {
|
|
132
|
-
try {
|
|
133
|
-
if (sdk.status === "connecting") try {
|
|
134
|
-
await sdk.disconnect();
|
|
135
|
-
} catch (error) {
|
|
136
|
-
getCore(client).logger.debug("[metamask] pre-connect disconnect rejected (expected when aborting a pairing the wallet never accepted)", error);
|
|
137
|
-
}
|
|
138
|
-
await sdk.connect({ chainIds });
|
|
139
|
-
} finally {
|
|
140
|
-
inFlightConnect = null;
|
|
141
|
-
}
|
|
142
|
-
})();
|
|
143
|
-
return inFlightConnect;
|
|
144
|
-
};
|
|
145
|
-
return {
|
|
146
|
-
clearCachedDisplayUri: () => {
|
|
147
|
-
latestDisplayUri = void 0;
|
|
148
|
-
},
|
|
149
|
-
connect,
|
|
150
|
-
getLatestDisplayUri: () => latestDisplayUri,
|
|
151
|
-
onDisplayUri,
|
|
152
|
-
sdk
|
|
153
|
-
};
|
|
22
|
+
var MetaMaskDirectConnectNotSupportedError = class extends BaseError {
|
|
23
|
+
constructor() {
|
|
24
|
+
super({
|
|
25
|
+
cause: null,
|
|
26
|
+
code: "metamask_direct_connect_not_supported",
|
|
27
|
+
docsUrl: null,
|
|
28
|
+
name: "MetaMaskDirectConnectNotSupportedError",
|
|
29
|
+
shortMessage: "MetaMask cannot be connected directly; call connectWithMetaMaskUriEvm (or connectAndVerifyWithMetaMaskUriEvm) to get a QR/URI pairing flow instead"
|
|
30
|
+
});
|
|
31
|
+
}
|
|
154
32
|
};
|
|
155
33
|
|
|
156
34
|
//#endregion
|
|
157
|
-
//#region src/metamask/
|
|
158
|
-
const
|
|
35
|
+
//#region src/metamask/getMetaMaskEvmSdkWalletProviderKey/getMetaMaskEvmSdkWalletProviderKey.ts
|
|
36
|
+
const METAMASK_EVM_SDK_DISPLAY_NAME = "MetaMask";
|
|
159
37
|
/**
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
* `
|
|
163
|
-
*
|
|
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
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
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
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
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
|
-
|
|
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
|
};
|
|
@@ -353,10 +303,40 @@ const connectWithMetaMaskUriEvm = ({ addToDynamicWalletAccounts = true } = {}, c
|
|
|
353
303
|
*/
|
|
354
304
|
const getMetaMaskEvmExtensionWalletProviderKey = (client = getDefaultClient()) => 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 = getDefaultClient()) => {
|
|
329
|
+
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
|
assertPackageVersion(name, version);
|
|
359
339
|
|
|
360
340
|
//#endregion
|
|
361
|
-
export { MetaMaskDisplayUriMissingError, connectAndVerifyWithMetaMaskUriEvm, connectWithMetaMaskUriEvm, getMetaMaskEvmExtensionWalletProviderKey };
|
|
341
|
+
export { MetaMaskDirectConnectNotSupportedError, MetaMaskDisplayUriMissingError, addMetaMaskEvmExtension, connectAndVerifyWithMetaMaskUriEvm, connectWithMetaMaskUriEvm, getMetaMaskEvmExtensionWalletProviderKey, registerMetaMaskEvmUriConnectionStarter };
|
|
362
342
|
//# sourceMappingURL=metamask.native.esm.js.map
|