@dynamic-labs-sdk/metamask 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/dist/assertMetaMaskNetworkIsGranted/assertMetaMaskNetworkIsGranted.d.ts +37 -0
- package/dist/assertMetaMaskNetworkIsGranted/assertMetaMaskNetworkIsGranted.d.ts.map +1 -0
- package/dist/assertMetaMaskNetworkIsGranted/index.d.ts +2 -0
- package/dist/assertMetaMaskNetworkIsGranted/index.d.ts.map +1 -0
- package/dist/clearMetaMaskSessionStorage/clearMetaMaskSessionStorage.d.ts +6 -6
- package/dist/clearMetaMaskSessionStorage/clearMetaMaskSessionStorage.d.ts.map +1 -1
- package/dist/connectWithMetaMaskUri/connectWithMetaMaskUri.d.ts +3 -8
- package/dist/connectWithMetaMaskUri/connectWithMetaMaskUri.d.ts.map +1 -1
- package/dist/constants.d.ts +8 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/core.cjs +465 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.esm.js +459 -0
- package/dist/core.esm.js.map +1 -0
- package/dist/core.native.esm.js +459 -0
- package/dist/core.native.esm.js.map +1 -0
- package/dist/createMetaMaskWalletProviderEventEmitter/createMetaMaskWalletProviderEventEmitter.d.ts +44 -0
- package/dist/createMetaMaskWalletProviderEventEmitter/createMetaMaskWalletProviderEventEmitter.d.ts.map +1 -0
- package/dist/createMetaMaskWalletProviderEventEmitter/index.d.ts +3 -0
- package/dist/createMetaMaskWalletProviderEventEmitter/index.d.ts.map +1 -0
- package/dist/disconnectMetaMaskWalletProvider/disconnectMetaMaskWalletProvider.d.ts +56 -0
- package/dist/disconnectMetaMaskWalletProvider/disconnectMetaMaskWalletProvider.d.ts.map +1 -0
- package/dist/disconnectMetaMaskWalletProvider/index.d.ts +3 -0
- package/dist/disconnectMetaMaskWalletProvider/index.d.ts.map +1 -0
- package/dist/errors/MetaMaskClientNotInitializedError/MetaMaskClientNotInitializedError.d.ts +12 -0
- package/dist/errors/MetaMaskClientNotInitializedError/MetaMaskClientNotInitializedError.d.ts.map +1 -0
- package/dist/errors/MetaMaskClientNotInitializedError/index.d.ts +2 -0
- package/dist/errors/MetaMaskClientNotInitializedError/index.d.ts.map +1 -0
- package/dist/errors/MetaMaskDisplayUriMissingError/MetaMaskDisplayUriMissingError.d.ts +21 -0
- package/dist/errors/MetaMaskDisplayUriMissingError/MetaMaskDisplayUriMissingError.d.ts.map +1 -1
- package/dist/errors/MetaMaskStorageError/MetaMaskStorageError.d.ts +12 -0
- package/dist/errors/MetaMaskStorageError/MetaMaskStorageError.d.ts.map +1 -0
- package/dist/errors/MetaMaskStorageError/index.d.ts +2 -0
- package/dist/errors/MetaMaskStorageError/index.d.ts.map +1 -0
- package/dist/errors/MetaMaskUnscopedNetworkError/MetaMaskUnscopedNetworkError.d.ts +29 -0
- package/dist/errors/MetaMaskUnscopedNetworkError/MetaMaskUnscopedNetworkError.d.ts.map +1 -0
- package/dist/errors/MetaMaskUnscopedNetworkError/index.d.ts +2 -0
- package/dist/errors/MetaMaskUnscopedNetworkError/index.d.ts.map +1 -0
- package/dist/errors/UnsupportedMetaMaskChainError/UnsupportedMetaMaskChainError.d.ts +9 -0
- package/dist/errors/UnsupportedMetaMaskChainError/UnsupportedMetaMaskChainError.d.ts.map +1 -0
- package/dist/errors/UnsupportedMetaMaskChainError/index.d.ts +2 -0
- package/dist/errors/UnsupportedMetaMaskChainError/index.d.ts.map +1 -0
- package/dist/exports/core.d.ts +21 -0
- package/dist/exports/core.d.ts.map +1 -0
- package/dist/exports/index.d.ts +2 -2
- package/dist/exports/index.d.ts.map +1 -1
- package/dist/getGrantedMetaMaskScopes/getGrantedMetaMaskScopes.d.ts +40 -0
- package/dist/getGrantedMetaMaskScopes/getGrantedMetaMaskScopes.d.ts.map +1 -0
- package/dist/getGrantedMetaMaskScopes/index.d.ts +3 -0
- package/dist/getGrantedMetaMaskScopes/index.d.ts.map +1 -0
- package/dist/getMetaMaskExtensionWalletProviderKey/getMetaMaskExtensionWalletProviderKey.d.ts +1 -1
- package/dist/getMetaMaskScopeForNetworkId/getMetaMaskScopeForNetworkId.d.ts +39 -0
- package/dist/getMetaMaskScopeForNetworkId/getMetaMaskScopeForNetworkId.d.ts.map +1 -0
- package/dist/getMetaMaskScopeForNetworkId/index.d.ts +2 -0
- package/dist/getMetaMaskScopeForNetworkId/index.d.ts.map +1 -0
- package/dist/getMetaMaskScopes/getMetaMaskScopes.d.ts +28 -0
- package/dist/getMetaMaskScopes/getMetaMaskScopes.d.ts.map +1 -0
- package/dist/getMetaMaskScopes/index.d.ts +2 -0
- package/dist/getMetaMaskScopes/index.d.ts.map +1 -0
- package/dist/getMetaMaskSupportedNetworks/getMetaMaskSupportedNetworks.d.ts +23 -0
- package/dist/getMetaMaskSupportedNetworks/getMetaMaskSupportedNetworks.d.ts.map +1 -0
- package/dist/getMetaMaskSupportedNetworks/index.d.ts +2 -0
- package/dist/getMetaMaskSupportedNetworks/index.d.ts.map +1 -0
- package/dist/getNetworkIdFromMetaMaskScope/getNetworkIdFromMetaMaskScope.d.ts +35 -0
- package/dist/getNetworkIdFromMetaMaskScope/getNetworkIdFromMetaMaskScope.d.ts.map +1 -0
- package/dist/getNetworkIdFromMetaMaskScope/index.d.ts +2 -0
- package/dist/getNetworkIdFromMetaMaskScope/index.d.ts.map +1 -0
- package/dist/getOrCreateMetaMaskClientInstanceManager-DWd07xVz.esm.js +621 -0
- package/dist/getOrCreateMetaMaskClientInstanceManager-DWd07xVz.esm.js.map +1 -0
- package/dist/getOrCreateMetaMaskClientInstanceManager-Dz57S3Bm.native.esm.js +621 -0
- package/dist/getOrCreateMetaMaskClientInstanceManager-Dz57S3Bm.native.esm.js.map +1 -0
- package/dist/getOrCreateMetaMaskClientInstanceManager-l6T7WUT5.cjs +708 -0
- package/dist/getOrCreateMetaMaskClientInstanceManager-l6T7WUT5.cjs.map +1 -0
- package/dist/getScopeAccountsFromMetaMaskClient/getScopeAccountsFromMetaMaskClient.d.ts +38 -0
- package/dist/getScopeAccountsFromMetaMaskClient/getScopeAccountsFromMetaMaskClient.d.ts.map +1 -0
- package/dist/getScopeAccountsFromMetaMaskClient/index.d.ts +2 -0
- package/dist/getScopeAccountsFromMetaMaskClient/index.d.ts.map +1 -0
- package/dist/index.cjs +57 -57
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +56 -56
- package/dist/index.esm.js.map +1 -1
- package/dist/index.native.esm.js +56 -78
- package/dist/index.native.esm.js.map +1 -1
- package/dist/metaMaskClientInstanceManager/createMetaMaskClientInstanceManager/createMetaMaskClientInstanceManager.d.ts +45 -0
- package/dist/metaMaskClientInstanceManager/createMetaMaskClientInstanceManager/createMetaMaskClientInstanceManager.d.ts.map +1 -0
- package/dist/metaMaskClientInstanceManager/createMetaMaskClientInstanceManager/index.d.ts +2 -0
- package/dist/metaMaskClientInstanceManager/createMetaMaskClientInstanceManager/index.d.ts.map +1 -0
- package/dist/metaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager.d.ts +18 -0
- package/dist/metaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager.d.ts.map +1 -0
- package/dist/metaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager/index.d.ts +2 -0
- package/dist/metaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager/index.d.ts.map +1 -0
- package/dist/metaMaskStorage/clearMetaMaskStorage/clearMetaMaskStorage.d.ts +23 -0
- package/dist/metaMaskStorage/clearMetaMaskStorage/clearMetaMaskStorage.d.ts.map +1 -0
- package/dist/metaMaskStorage/clearMetaMaskStorage/index.d.ts +2 -0
- package/dist/metaMaskStorage/clearMetaMaskStorage/index.d.ts.map +1 -0
- package/dist/metaMaskStorage/createInitialMetaMaskStoreValue/createInitialMetaMaskStoreValue.d.ts +19 -0
- package/dist/metaMaskStorage/createInitialMetaMaskStoreValue/createInitialMetaMaskStoreValue.d.ts.map +1 -0
- package/dist/metaMaskStorage/createMetaMaskStorageClient/createMetaMaskStorageClient.d.ts +30 -0
- package/dist/metaMaskStorage/createMetaMaskStorageClient/createMetaMaskStorageClient.d.ts.map +1 -0
- package/dist/metaMaskStorage/createMetaMaskStorageClient/index.d.ts +2 -0
- package/dist/metaMaskStorage/createMetaMaskStorageClient/index.d.ts.map +1 -0
- package/dist/metaMaskStorage/metaMaskStorage.schema.d.ts +30 -0
- package/dist/metaMaskStorage/metaMaskStorage.schema.d.ts.map +1 -0
- package/dist/metaMaskStorage/queueMetaMaskStorageWrite/queueMetaMaskStorageWrite.d.ts +20 -0
- package/dist/metaMaskStorage/queueMetaMaskStorageWrite/queueMetaMaskStorageWrite.d.ts.map +1 -0
- package/dist/metamask.types.d.ts +0 -20
- package/dist/metamask.types.d.ts.map +1 -1
- package/dist/reconcileMetaMaskWalletProvider/index.d.ts +3 -0
- package/dist/reconcileMetaMaskWalletProvider/index.d.ts.map +1 -0
- package/dist/reconcileMetaMaskWalletProvider/reconcileMetaMaskWalletProvider.d.ts +60 -0
- package/dist/reconcileMetaMaskWalletProvider/reconcileMetaMaskWalletProvider.d.ts.map +1 -0
- package/dist/resolveActiveMetaMaskScope/index.d.ts +3 -0
- package/dist/resolveActiveMetaMaskScope/index.d.ts.map +1 -0
- package/dist/resolveActiveMetaMaskScope/resolveActiveMetaMaskScope.d.ts +67 -0
- package/dist/resolveActiveMetaMaskScope/resolveActiveMetaMaskScope.d.ts.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/utils/clearMetaMaskSdkSingleton/clearMetaMaskSdkSingleton.d.ts +23 -0
- package/dist/utils/clearMetaMaskSdkSingleton/clearMetaMaskSdkSingleton.d.ts.map +1 -0
- package/dist/utils/createMetaMaskPreferredOpenLink/createMetaMaskPreferredOpenLink.d.ts +21 -0
- package/dist/utils/createMetaMaskPreferredOpenLink/createMetaMaskPreferredOpenLink.d.ts.map +1 -0
- package/dist/utils/createMetaMaskPreferredOpenLink/index.d.ts +2 -0
- package/dist/utils/createMetaMaskPreferredOpenLink/index.d.ts.map +1 -0
- package/package.json +11 -3
- package/dist/errors/MetaMaskWalletNotConnectedError/MetaMaskWalletNotConnectedError.d.ts +0 -5
- package/dist/errors/MetaMaskWalletNotConnectedError/MetaMaskWalletNotConnectedError.d.ts.map +0 -1
- package/dist/errors/MetaMaskWalletNotConnectedError/index.d.ts +0 -2
- package/dist/errors/MetaMaskWalletNotConnectedError/index.d.ts.map +0 -1
|
@@ -0,0 +1,708 @@
|
|
|
1
|
+
//#region rolldown:runtime
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
11
|
+
key = keys[i];
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except) {
|
|
13
|
+
__defProp(to, key, {
|
|
14
|
+
get: ((k) => from[k]).bind(null, key),
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
23
|
+
value: mod,
|
|
24
|
+
enumerable: true
|
|
25
|
+
}) : target, mod));
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
let _dynamic_labs_sdk_client_core = require("@dynamic-labs-sdk/client/core");
|
|
29
|
+
let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
|
|
30
|
+
let _metamask_connect_multichain = require("@metamask/connect-multichain");
|
|
31
|
+
let zod_mini = require("zod/mini");
|
|
32
|
+
zod_mini = __toESM(zod_mini);
|
|
33
|
+
|
|
34
|
+
//#region package.json
|
|
35
|
+
var name = "@dynamic-labs-sdk/metamask";
|
|
36
|
+
var version = "1.31.1";
|
|
37
|
+
|
|
38
|
+
//#endregion
|
|
39
|
+
//#region src/errors/MetaMaskUnscopedNetworkError/MetaMaskUnscopedNetworkError.ts
|
|
40
|
+
/**
|
|
41
|
+
* Thrown when attempting to switch a MetaMask multichain wallet provider to
|
|
42
|
+
* a network whose CAIP-2 scope was requested at connect time but never
|
|
43
|
+
* granted an account by MetaMask in the current session (e.g. the user only
|
|
44
|
+
* approved mainnet, not a preconfigured devnet, during pairing). Switching
|
|
45
|
+
* to it anyway would silently break every subsequent signing/sending call
|
|
46
|
+
* on that network, since MetaMask rejects those against an ungranted scope.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* try {
|
|
51
|
+
* await switchActiveNetwork({ networkId: '103', walletAccount });
|
|
52
|
+
* } catch (error) {
|
|
53
|
+
* if (error instanceof MetaMaskUnscopedNetworkError) {
|
|
54
|
+
* // Tell the user to approve this network in MetaMask, then retry.
|
|
55
|
+
* }
|
|
56
|
+
* }
|
|
57
|
+
* ```
|
|
58
|
+
* @see assertMetaMaskNetworkIsGranted
|
|
59
|
+
* @see resolveActiveMetaMaskScope
|
|
60
|
+
*/
|
|
61
|
+
var MetaMaskUnscopedNetworkError = class extends _dynamic_labs_sdk_client.BaseError {
|
|
62
|
+
constructor({ networkId, scope }) {
|
|
63
|
+
super({
|
|
64
|
+
cause: null,
|
|
65
|
+
code: "metamask_unscoped_network",
|
|
66
|
+
docsUrl: null,
|
|
67
|
+
metaMessages: [`scope: ${scope}`],
|
|
68
|
+
name: "MetaMaskUnscopedNetworkError",
|
|
69
|
+
shortMessage: `Cannot switch to network "${networkId}": MetaMask did not grant an account for scope "${scope}" in the current session.`
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
//#endregion
|
|
75
|
+
//#region src/constants.ts
|
|
76
|
+
/**
|
|
77
|
+
* Chains MetaMask's multichain client can build a CAIP-2 scope for. Shared by
|
|
78
|
+
* every scope/network-mapping helper so the supported set only needs to
|
|
79
|
+
* change in one place.
|
|
80
|
+
*/
|
|
81
|
+
const SUPPORTED_METAMASK_CHAINS = ["EVM", "SOL"];
|
|
82
|
+
|
|
83
|
+
//#endregion
|
|
84
|
+
//#region src/errors/UnsupportedMetaMaskChainError/UnsupportedMetaMaskChainError.ts
|
|
85
|
+
/** Thrown when a chain has no MetaMask multichain scope mapping defined. */
|
|
86
|
+
var UnsupportedMetaMaskChainError = class extends _dynamic_labs_sdk_client.BaseError {
|
|
87
|
+
constructor({ chain, supportedChains }) {
|
|
88
|
+
super({
|
|
89
|
+
cause: null,
|
|
90
|
+
code: "metamask_unsupported_chain",
|
|
91
|
+
docsUrl: null,
|
|
92
|
+
name: "UnsupportedMetaMaskChainError",
|
|
93
|
+
shortMessage: `Unsupported chain "${chain}" for MetaMask. Supported chains: ${supportedChains.join(", ")}`
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
//#endregion
|
|
99
|
+
//#region src/getMetaMaskScopeForNetworkId/getMetaMaskScopeForNetworkId.ts
|
|
100
|
+
/**
|
|
101
|
+
* Maps a single Dynamic-configured network to its CAIP-2 MetaMask
|
|
102
|
+
* multichain scope -- the same per-network mapping `getMetaMaskScopes`
|
|
103
|
+
* applies to every configured network at once, extracted so callers that
|
|
104
|
+
* already have one `networkId` (e.g. the "active network" registry) don't
|
|
105
|
+
* need to rebuild and filter the whole configured list to find it.
|
|
106
|
+
*
|
|
107
|
+
* EVM's `networkId` IS the CAIP-2 reference (`eip155:<networkId>`); SOL's
|
|
108
|
+
* `networkId` is an internal routing id, so the network's base58 genesis
|
|
109
|
+
* hash is used instead (`solana:<genesisHash>`). Returns `undefined` when no
|
|
110
|
+
* configured SOL network matches, or matches but has no genesis hash --
|
|
111
|
+
* these are normal ("this networkId isn't usable as a MetaMask scope"), not
|
|
112
|
+
* error conditions.
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```ts
|
|
116
|
+
* const scope = getMetaMaskScopeForNetworkId(
|
|
117
|
+
* { chain: 'SOL', networkId: '101' },
|
|
118
|
+
* client
|
|
119
|
+
* );
|
|
120
|
+
* // 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp'
|
|
121
|
+
* ```
|
|
122
|
+
*
|
|
123
|
+
* @returns The CAIP-2 scope for `networkId`, or `undefined` if it can't be
|
|
124
|
+
* expressed as one (e.g. a SOL network with no genesis hash configured).
|
|
125
|
+
* @throws {UnsupportedMetaMaskChainError} If `chain` isn't a chain MetaMask
|
|
126
|
+
* scopes can be built for.
|
|
127
|
+
* @see getMetaMaskScopes
|
|
128
|
+
* @see getNetworkIdFromMetaMaskScope
|
|
129
|
+
* @notInstrumented
|
|
130
|
+
*/
|
|
131
|
+
const getMetaMaskScopeForNetworkId = ({ chain, networkId }, client) => {
|
|
132
|
+
if (chain === "EVM") return `eip155:${networkId}`;
|
|
133
|
+
if (chain === "SOL") {
|
|
134
|
+
const network = (0, _dynamic_labs_sdk_client.getNetworksData)(client).find((candidate) => candidate.chain === "SOL" && candidate.networkId === networkId);
|
|
135
|
+
return network?.genesisHash ? `solana:${network.genesisHash}` : void 0;
|
|
136
|
+
}
|
|
137
|
+
throw new UnsupportedMetaMaskChainError({
|
|
138
|
+
chain,
|
|
139
|
+
supportedChains: SUPPORTED_METAMASK_CHAINS
|
|
140
|
+
});
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
//#endregion
|
|
144
|
+
//#region src/getMetaMaskScopes/getMetaMaskScopes.ts
|
|
145
|
+
/**
|
|
146
|
+
* Builds the CAIP-2 scopes to request for a chain's MetaMask multichain
|
|
147
|
+
* session, one per configured network. SOL scopes use the network's genesis
|
|
148
|
+
* hash (not `networkId`, which is an internal routing id for SOL) since
|
|
149
|
+
* that's the CAIP-2 reference MetaMask expects.
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```ts
|
|
153
|
+
* const scopes = getMetaMaskScopes({ chain: 'EVM' }, client);
|
|
154
|
+
* // ['eip155:1', 'eip155:137']
|
|
155
|
+
* ```
|
|
156
|
+
*
|
|
157
|
+
* @returns The CAIP-2 scopes for every configured network of `chain` that
|
|
158
|
+
* can be expressed as one.
|
|
159
|
+
* @throws {UnsupportedMetaMaskChainError} If `chain` isn't a chain MetaMask
|
|
160
|
+
* scopes can be built for.
|
|
161
|
+
* @see getMetaMaskScopeForNetworkId
|
|
162
|
+
* @see getMetaMaskSupportedNetworks
|
|
163
|
+
* @notInstrumented
|
|
164
|
+
*/
|
|
165
|
+
const getMetaMaskScopes = ({ chain }, client) => {
|
|
166
|
+
if (!chain || !SUPPORTED_METAMASK_CHAINS.includes(chain)) throw new UnsupportedMetaMaskChainError({
|
|
167
|
+
chain,
|
|
168
|
+
supportedChains: SUPPORTED_METAMASK_CHAINS
|
|
169
|
+
});
|
|
170
|
+
return (0, _dynamic_labs_sdk_client.getNetworksData)(client).filter((network) => network.chain === chain).flatMap((network) => {
|
|
171
|
+
const scope = getMetaMaskScopeForNetworkId({
|
|
172
|
+
chain: network.chain,
|
|
173
|
+
networkId: network.networkId
|
|
174
|
+
}, client);
|
|
175
|
+
return scope ? [scope] : [];
|
|
176
|
+
});
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
//#endregion
|
|
180
|
+
//#region src/errors/MetaMaskClientNotInitializedError/MetaMaskClientNotInitializedError.ts
|
|
181
|
+
/**
|
|
182
|
+
* Thrown when `getMetaMaskClient()` is called but the underlying
|
|
183
|
+
* `@metamask/connect-multichain` client failed to initialize -- this should
|
|
184
|
+
* be unreachable in practice, since `getMetaMaskClient` always triggers
|
|
185
|
+
* `refreshMetaMaskClient` first when no client promise exists yet, but it
|
|
186
|
+
* guards against a future change silently returning `undefined` instead.
|
|
187
|
+
*/
|
|
188
|
+
var MetaMaskClientNotInitializedError = class extends _dynamic_labs_sdk_client.BaseError {
|
|
189
|
+
constructor() {
|
|
190
|
+
super({
|
|
191
|
+
cause: null,
|
|
192
|
+
code: "metamask_client_not_initialized",
|
|
193
|
+
docsUrl: null,
|
|
194
|
+
name: "MetaMaskClientNotInitializedError",
|
|
195
|
+
shortMessage: "MetaMask client not initialized"
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
//#endregion
|
|
201
|
+
//#region src/getMetaMaskSupportedNetworks/getMetaMaskSupportedNetworks.ts
|
|
202
|
+
/**
|
|
203
|
+
* Builds the `api.supportedNetworks` map for MetaMask's multichain client:
|
|
204
|
+
* EVM networks keyed by their CAIP-2 `eip155:<networkId>` scope, SOL networks
|
|
205
|
+
* keyed by their CAIP-2 `solana:<genesisHash>` scope (SOL's `networkId` is an
|
|
206
|
+
* internal routing id, not usable as a CAIP-2 reference).
|
|
207
|
+
*
|
|
208
|
+
* @example
|
|
209
|
+
* ```ts
|
|
210
|
+
* const supportedNetworks = getMetaMaskSupportedNetworks(client);
|
|
211
|
+
* // { 'eip155:1': 'https://...', 'solana:5eykt4...': 'https://...' }
|
|
212
|
+
* ```
|
|
213
|
+
*
|
|
214
|
+
* @returns The RPC URL for every configured EVM/SOL network, keyed by its
|
|
215
|
+
* MetaMask-recognized network identifier.
|
|
216
|
+
* @see getMetaMaskScopes
|
|
217
|
+
* @see createMetaMaskClientInstanceManager
|
|
218
|
+
* @notInstrumented
|
|
219
|
+
*/
|
|
220
|
+
const getMetaMaskSupportedNetworks = (client) => {
|
|
221
|
+
const { logger } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
|
|
222
|
+
const networks = (0, _dynamic_labs_sdk_client.getNetworksData)(client).filter((network) => SUPPORTED_METAMASK_CHAINS.includes(network.chain));
|
|
223
|
+
const supportedNetworks = {};
|
|
224
|
+
for (const network of networks) {
|
|
225
|
+
if (network.chain === "EVM") supportedNetworks[`eip155:${network.networkId}`] = network.rpcUrls.http[0];
|
|
226
|
+
if (network.chain === "SOL" && network.genesisHash) supportedNetworks[`solana:${network.genesisHash}`] = network.rpcUrls.http[0];
|
|
227
|
+
}
|
|
228
|
+
logger.debug("[MetaMask:Client] Resolved supported networks", { supportedNetworks });
|
|
229
|
+
return supportedNetworks;
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
//#endregion
|
|
233
|
+
//#region src/metaMaskStorage/createInitialMetaMaskStoreValue/createInitialMetaMaskStoreValue.ts
|
|
234
|
+
/**
|
|
235
|
+
* Builds the persisted store blob's value for when there is nothing stored
|
|
236
|
+
* yet, or after a clear. A function rather than a shared constant, so every
|
|
237
|
+
* caller gets its own object and can't mutate a value other callers rely on.
|
|
238
|
+
*
|
|
239
|
+
* @example
|
|
240
|
+
* ```ts
|
|
241
|
+
* const initial = createInitialMetaMaskStoreValue();
|
|
242
|
+
* // { entries: {}, schemaVersion: 1 }
|
|
243
|
+
* ```
|
|
244
|
+
*
|
|
245
|
+
* @returns A fresh, empty `MetaMaskStoreValue`.
|
|
246
|
+
* @see createMetaMaskStorageClient
|
|
247
|
+
* @see clearMetaMaskStorage
|
|
248
|
+
* @notInstrumented
|
|
249
|
+
*/
|
|
250
|
+
const createInitialMetaMaskStoreValue = () => ({
|
|
251
|
+
entries: {},
|
|
252
|
+
schemaVersion: 1
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
//#endregion
|
|
256
|
+
//#region src/metaMaskStorage/queueMetaMaskStorageWrite/queueMetaMaskStorageWrite.ts
|
|
257
|
+
/**
|
|
258
|
+
* Single shared queue serializing every read-modify-write against
|
|
259
|
+
* `metaMaskStoreStorageKeySchema` -- `createMetaMaskStorageClient`'s adapter
|
|
260
|
+
* reads/writes/anonId operations and `clearMetaMaskStorage`'s reset all go
|
|
261
|
+
* through this same instance, so a write that started before a clear can't
|
|
262
|
+
* land after it and resurrect the data the clear was meant to erase.
|
|
263
|
+
*
|
|
264
|
+
* @example
|
|
265
|
+
* ```ts
|
|
266
|
+
* await queueMetaMaskStorageWrite(() => storage.setItem(key, value), client);
|
|
267
|
+
* ```
|
|
268
|
+
*
|
|
269
|
+
* @returns A `SequenceQueue` that runs one queued task at a time, in order.
|
|
270
|
+
* @see createMetaMaskStorageClient
|
|
271
|
+
* @see clearMetaMaskStorage
|
|
272
|
+
* @notInstrumented
|
|
273
|
+
*/
|
|
274
|
+
const queueMetaMaskStorageWrite = (0, _dynamic_labs_sdk_client_core.createSequenceQueue)();
|
|
275
|
+
|
|
276
|
+
//#endregion
|
|
277
|
+
//#region src/metaMaskStorage/metaMaskStorage.schema.ts
|
|
278
|
+
/**
|
|
279
|
+
* Single storage key holding every value the MetaMask multichain SDK writes
|
|
280
|
+
* through our `StoreAdapter` (sessions, nonces, cached accounts/chain,
|
|
281
|
+
* pending pairing requests, transport ids, ...), keyed by whatever key string
|
|
282
|
+
* the SDK itself hands us -- the SDK controls every key name, including ones
|
|
283
|
+
* that embed an unpredictable id (`session:<id>`), so this can't be split
|
|
284
|
+
* into one storage key per SDK key.
|
|
285
|
+
*
|
|
286
|
+
* `entries[ANON_ID_ENTRY_KEY]` also lives in here, alongside `extensionId`
|
|
287
|
+
* and the other transport keys.
|
|
288
|
+
*
|
|
289
|
+
* `clearMetaMaskStorage` resets this key back to its initial value; nothing
|
|
290
|
+
* else needs to know the individual key names the SDK is using.
|
|
291
|
+
*/
|
|
292
|
+
const metaMaskStoreStorageKeySchema = (0, _dynamic_labs_sdk_client_core.createStorageKeySchema)({
|
|
293
|
+
key: "metaMaskStore",
|
|
294
|
+
schema: zod_mini.object({
|
|
295
|
+
entries: zod_mini.record(zod_mini.string(), zod_mini.string()),
|
|
296
|
+
schemaVersion: zod_mini.literal(1)
|
|
297
|
+
})
|
|
298
|
+
});
|
|
299
|
+
/**
|
|
300
|
+
* Reserved `entries` key the MetaMask SDK itself never writes to, used to
|
|
301
|
+
* carry the SDK's anonymous analytics id inside the same store blob.
|
|
302
|
+
*/
|
|
303
|
+
const ANON_ID_ENTRY_KEY = "anonId";
|
|
304
|
+
|
|
305
|
+
//#endregion
|
|
306
|
+
//#region src/metaMaskStorage/clearMetaMaskStorage/clearMetaMaskStorage.ts
|
|
307
|
+
const FAILED_TO_CLEAR_STORAGE_MESSAGE = "[MetaMask:Session] Failed to clear the persisted store; the next pairing may resume a stale session instead of showing a new one";
|
|
308
|
+
/**
|
|
309
|
+
* Resets the MetaMask SDK's persisted store blob back to its initial
|
|
310
|
+
* (empty) value, so the next connect call starts a fresh pairing and emits a
|
|
311
|
+
* `display_uri` instead of silently resuming a session that no longer works.
|
|
312
|
+
*
|
|
313
|
+
* @example
|
|
314
|
+
* ```ts
|
|
315
|
+
* await clearMetaMaskStorage(client);
|
|
316
|
+
* // Next connectWithMetaMaskUri call will emit a fresh URI immediately.
|
|
317
|
+
* ```
|
|
318
|
+
*
|
|
319
|
+
* @param client - The Dynamic client instance. Required (rather than
|
|
320
|
+
* defaulting to the last-initialized client) so a storage-clear failure is
|
|
321
|
+
* always logged against the client that actually requested it.
|
|
322
|
+
* @returns A promise that resolves once the blob is reset. Never rejects -- a
|
|
323
|
+
* storage failure must not take down the connect flow that depends on it.
|
|
324
|
+
* @see connectWithMetaMaskUri
|
|
325
|
+
* @see createMetaMaskStorageClient
|
|
326
|
+
* @notInstrumented
|
|
327
|
+
*/
|
|
328
|
+
const clearMetaMaskStorage = async (client) => {
|
|
329
|
+
const { logger, storage } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
|
|
330
|
+
try {
|
|
331
|
+
await queueMetaMaskStorageWrite(() => storage.setItem(metaMaskStoreStorageKeySchema, createInitialMetaMaskStoreValue()), client);
|
|
332
|
+
logger.debug("[MetaMask:Session] Cleared persisted store");
|
|
333
|
+
} catch (error) {
|
|
334
|
+
logger.warn(FAILED_TO_CLEAR_STORAGE_MESSAGE, { error });
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
//#endregion
|
|
339
|
+
//#region src/errors/MetaMaskStorageError/MetaMaskStorageError.ts
|
|
340
|
+
/** Thrown when the underlying storage service rejects a read/write/delete for the MetaMask multichain client's own store (e.g. quota exceeded, private-browsing restrictions). */
|
|
341
|
+
var MetaMaskStorageError = class extends _dynamic_labs_sdk_client.BaseError {
|
|
342
|
+
constructor({ cause, key, operation }) {
|
|
343
|
+
super({
|
|
344
|
+
cause: cause instanceof Error ? cause : null,
|
|
345
|
+
code: "metamask_storage_error",
|
|
346
|
+
docsUrl: null,
|
|
347
|
+
name: "MetaMaskStorageError",
|
|
348
|
+
shortMessage: `Failed to ${operation} MetaMask multichain client storage key "${key}"`
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
//#endregion
|
|
354
|
+
//#region src/metaMaskStorage/createMetaMaskStorageClient/createMetaMaskStorageClient.ts
|
|
355
|
+
const TRANSPORT_TYPE_KEY = "multichain-transport";
|
|
356
|
+
const EXTENSION_ID_KEY = "extensionId";
|
|
357
|
+
/** Maps this SDK's platform literal onto the one `@metamask/connect-multichain`'s `StoreAdapter` expects. */
|
|
358
|
+
const toStoreAdapterPlatform = (platform) => platform === "react-native" ? "rn" : "web";
|
|
359
|
+
/**
|
|
360
|
+
* Builds a storage-service-backed store for the MetaMask multichain client,
|
|
361
|
+
* in place of its own default web adapter (IndexedDB) and React Native
|
|
362
|
+
* adapter (raw `AsyncStorage`), so every platform persists through the same
|
|
363
|
+
* core `Storage` service and `clearMetaMaskStorage` can reliably wipe it.
|
|
364
|
+
*
|
|
365
|
+
* The SDK controls every key name it reads/writes through `adapter`,
|
|
366
|
+
* including ones that embed an unpredictable id (`session:<id>`), so every
|
|
367
|
+
* key it uses is folded into a single stored blob (`metaMaskStoreStorageKeySchema`)
|
|
368
|
+
* rather than one storage key per SDK key. `DEBUG` is never persisted at all,
|
|
369
|
+
* answered live from the client's own logger.
|
|
370
|
+
*
|
|
371
|
+
* @example
|
|
372
|
+
* ```ts
|
|
373
|
+
* const storeClient = createMetaMaskStorageClient(client);
|
|
374
|
+
* const multichainClient = createMultichainClient({ storage: storeClient });
|
|
375
|
+
* ```
|
|
376
|
+
*
|
|
377
|
+
* @returns A `StoreClient` backed by the client's core `Storage` service.
|
|
378
|
+
* @throws {MetaMaskStorageError} If the underlying `Storage` service's
|
|
379
|
+
* `getItem`/`setItem` calls fail for any of the adapter's read/write/delete
|
|
380
|
+
* operations.
|
|
381
|
+
* @see createInitialMetaMaskStoreValue
|
|
382
|
+
* @see clearMetaMaskStorage
|
|
383
|
+
* @notInstrumented
|
|
384
|
+
*/
|
|
385
|
+
const createMetaMaskStorageClient = (client) => {
|
|
386
|
+
const { logger, storage } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
|
|
387
|
+
const read = async (key) => {
|
|
388
|
+
try {
|
|
389
|
+
const { entries } = await storage.getItem(metaMaskStoreStorageKeySchema) ?? createInitialMetaMaskStoreValue();
|
|
390
|
+
return entries[key] ?? null;
|
|
391
|
+
} catch (error) {
|
|
392
|
+
throw new MetaMaskStorageError({
|
|
393
|
+
cause: error,
|
|
394
|
+
key,
|
|
395
|
+
operation: "get"
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
const write = async (key, value) => {
|
|
400
|
+
try {
|
|
401
|
+
await queueMetaMaskStorageWrite(async () => {
|
|
402
|
+
const current = await storage.getItem(metaMaskStoreStorageKeySchema) ?? createInitialMetaMaskStoreValue();
|
|
403
|
+
await storage.setItem(metaMaskStoreStorageKeySchema, {
|
|
404
|
+
...current,
|
|
405
|
+
entries: {
|
|
406
|
+
...current.entries,
|
|
407
|
+
[key]: value
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
}, client);
|
|
411
|
+
} catch (error) {
|
|
412
|
+
throw new MetaMaskStorageError({
|
|
413
|
+
cause: error,
|
|
414
|
+
key,
|
|
415
|
+
operation: "set"
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
const remove = async (key) => {
|
|
420
|
+
try {
|
|
421
|
+
await queueMetaMaskStorageWrite(async () => {
|
|
422
|
+
const current = await storage.getItem(metaMaskStoreStorageKeySchema) ?? createInitialMetaMaskStoreValue();
|
|
423
|
+
const remainingEntries = Object.fromEntries(Object.entries(current.entries).filter(([entryKey]) => entryKey !== key));
|
|
424
|
+
await storage.setItem(metaMaskStoreStorageKeySchema, {
|
|
425
|
+
...current,
|
|
426
|
+
entries: remainingEntries
|
|
427
|
+
});
|
|
428
|
+
}, client);
|
|
429
|
+
} catch (error) {
|
|
430
|
+
throw new MetaMaskStorageError({
|
|
431
|
+
cause: error,
|
|
432
|
+
key,
|
|
433
|
+
operation: "delete"
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
};
|
|
437
|
+
const adapter = {
|
|
438
|
+
delete: remove,
|
|
439
|
+
get: read,
|
|
440
|
+
platform: toStoreAdapterPlatform((0, _dynamic_labs_sdk_client_core.getPlatform)()),
|
|
441
|
+
set: write
|
|
442
|
+
};
|
|
443
|
+
return {
|
|
444
|
+
adapter,
|
|
445
|
+
getAnonId: () => queueMetaMaskStorageWrite(async () => {
|
|
446
|
+
const current = await storage.getItem(metaMaskStoreStorageKeySchema) ?? createInitialMetaMaskStoreValue();
|
|
447
|
+
const existing = current.entries[ANON_ID_ENTRY_KEY];
|
|
448
|
+
if (existing) return existing;
|
|
449
|
+
const anonId = crypto.randomUUID();
|
|
450
|
+
await storage.setItem(metaMaskStoreStorageKeySchema, {
|
|
451
|
+
...current,
|
|
452
|
+
entries: {
|
|
453
|
+
...current.entries,
|
|
454
|
+
[ANON_ID_ENTRY_KEY]: anonId
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
return anonId;
|
|
458
|
+
}, client),
|
|
459
|
+
getDebug: () => Promise.resolve(logger.isEnabled("debug") ? "metamask-sdk:*" : null),
|
|
460
|
+
getExtensionId: () => adapter.get(EXTENSION_ID_KEY),
|
|
461
|
+
getTransportType: async () => {
|
|
462
|
+
const value = await adapter.get(TRANSPORT_TYPE_KEY);
|
|
463
|
+
return value ? (0, _metamask_connect_multichain.getTransportType)(value) : null;
|
|
464
|
+
},
|
|
465
|
+
removeAnonId: () => remove(ANON_ID_ENTRY_KEY),
|
|
466
|
+
removeExtensionId: () => adapter.delete(EXTENSION_ID_KEY),
|
|
467
|
+
removeTransportType: () => adapter.delete(TRANSPORT_TYPE_KEY),
|
|
468
|
+
setAnonId: (anonId) => write(ANON_ID_ENTRY_KEY, anonId),
|
|
469
|
+
setExtensionId: (extensionId) => adapter.set(EXTENSION_ID_KEY, extensionId),
|
|
470
|
+
setTransportType: (transportType) => adapter.set(TRANSPORT_TYPE_KEY, transportType)
|
|
471
|
+
};
|
|
472
|
+
};
|
|
473
|
+
|
|
474
|
+
//#endregion
|
|
475
|
+
//#region src/utils/clearMetaMaskSdkSingleton/clearMetaMaskSdkSingleton.ts
|
|
476
|
+
const METAMASK_SDK_SINGLETON_GLOBAL_KEY = "__METAMASK_CONNECT_MULTICHAIN_SINGLETON__";
|
|
477
|
+
/**
|
|
478
|
+
* Deletes the upstream `@metamask/connect-multichain` SDK's own cached
|
|
479
|
+
* client instance off `globalThis`.
|
|
480
|
+
*
|
|
481
|
+
* The SDK's `createMultichainClient` reuses a private `globalThis` singleton
|
|
482
|
+
* and only merges in a subset of options on repeat calls -- notably not
|
|
483
|
+
* `storage` -- so it keeps talking to its original `StoreAdapter` even after
|
|
484
|
+
* a fresh `clearMetaMaskStorage` call. Deleting this key forces a genuinely
|
|
485
|
+
* new instance (and storage adapter) on the next `createMultichainClient` call.
|
|
486
|
+
*
|
|
487
|
+
* @example
|
|
488
|
+
* ```ts
|
|
489
|
+
* clearMetaMaskSdkSingleton();
|
|
490
|
+
* // Next createMultichainClient call builds a fresh client and adapter.
|
|
491
|
+
* ```
|
|
492
|
+
*
|
|
493
|
+
* @returns Nothing -- the singleton key is deleted synchronously.
|
|
494
|
+
* @see createMetaMaskClientInstanceManager
|
|
495
|
+
* @see clearMetaMaskStorage
|
|
496
|
+
* @notInstrumented
|
|
497
|
+
*/
|
|
498
|
+
const clearMetaMaskSdkSingleton = () => {
|
|
499
|
+
delete globalThis[METAMASK_SDK_SINGLETON_GLOBAL_KEY];
|
|
500
|
+
};
|
|
501
|
+
|
|
502
|
+
//#endregion
|
|
503
|
+
//#region src/utils/createMetaMaskPreferredOpenLink/createMetaMaskPreferredOpenLink.ts
|
|
504
|
+
/**
|
|
505
|
+
* Builds the `preferredOpenLink` callback handed to `@metamask/connect-multichain`,
|
|
506
|
+
* routing wallet deeplinks through the core `deeplink` service instead of the
|
|
507
|
+
* SDK's own default handling, so every platform (web, React Native, Expo)
|
|
508
|
+
* opens them the same way the rest of the SDK does.
|
|
509
|
+
*
|
|
510
|
+
* @example
|
|
511
|
+
* ```ts
|
|
512
|
+
* const preferredOpenLink = createMetaMaskPreferredOpenLink(client);
|
|
513
|
+
* preferredOpenLink('https://metamask.app.link/...');
|
|
514
|
+
* ```
|
|
515
|
+
*
|
|
516
|
+
* @returns A callback that opens a MetaMask-issued deeplink through the
|
|
517
|
+
* core `deeplink` service.
|
|
518
|
+
* @see createMetaMaskClientInstanceManager
|
|
519
|
+
* @see createMetaMaskStorageClient
|
|
520
|
+
* @notInstrumented
|
|
521
|
+
*/
|
|
522
|
+
const createMetaMaskPreferredOpenLink = (client) => (deeplink) => {
|
|
523
|
+
const { logger, openDeeplink } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
|
|
524
|
+
logger.debug("[MetaMask:Client] Opening MetaMask deeplink", { deeplink });
|
|
525
|
+
openDeeplink(deeplink).then(() => logger.debug("[MetaMask:Client] Deeplink opened")).catch((error) => logger.error("[MetaMask:Client] Failed to open deeplink", {
|
|
526
|
+
deeplink,
|
|
527
|
+
error
|
|
528
|
+
}));
|
|
529
|
+
};
|
|
530
|
+
|
|
531
|
+
//#endregion
|
|
532
|
+
//#region src/metaMaskClientInstanceManager/createMetaMaskClientInstanceManager/createMetaMaskClientInstanceManager.ts
|
|
533
|
+
/**
|
|
534
|
+
* Creates the per-client manager that lazily builds, tears down, and rebuilds
|
|
535
|
+
* the shared `@metamask/connect-multichain` client instance, and forwards its
|
|
536
|
+
* `display_uri` event to callers that don't hold a reference to the raw SDK
|
|
537
|
+
* client.
|
|
538
|
+
*
|
|
539
|
+
* @example
|
|
540
|
+
* ```ts
|
|
541
|
+
* const manager = createMetaMaskClientInstanceManager(client);
|
|
542
|
+
* const metaMaskClient = await manager.getMetaMaskClient();
|
|
543
|
+
* ```
|
|
544
|
+
*
|
|
545
|
+
* @returns A `MetaMaskClientInstanceManager` scoped to `client`.
|
|
546
|
+
* @throws {MetaMaskClientNotInitializedError} From `getMetaMaskClient` if a
|
|
547
|
+
* build was never started -- a defensive guard, since `refreshMetaMaskClient`
|
|
548
|
+
* always starts one. A build that starts but fails instead rejects
|
|
549
|
+
* `getMetaMaskClient()` with its original error.
|
|
550
|
+
* @see createMetaMaskStorageClient
|
|
551
|
+
* @see clearMetaMaskStorage
|
|
552
|
+
* @notInstrumented
|
|
553
|
+
*/
|
|
554
|
+
const createMetaMaskClientInstanceManager = (client) => {
|
|
555
|
+
let metaMaskClientPromise;
|
|
556
|
+
let clearEventListeners;
|
|
557
|
+
const { logger } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
|
|
558
|
+
const events = (0, _dynamic_labs_sdk_client_core.createEventEmitter)();
|
|
559
|
+
const refreshMetaMaskClient = () => {
|
|
560
|
+
if (metaMaskClientPromise) return;
|
|
561
|
+
const { appName, appLogoUrl, appUniversalLink, appNativeLink } = (0, _dynamic_labs_sdk_client_core.getAppMetadata)(client);
|
|
562
|
+
const supportedNetworks = getMetaMaskSupportedNetworks(client);
|
|
563
|
+
const nativeScheme = (0, _dynamic_labs_sdk_client_core.getNativeLinkScheme)({ nativeLink: appNativeLink });
|
|
564
|
+
const debug = logger.isEnabled("debug");
|
|
565
|
+
logger.debug("[MetaMask:Client] Creating MetaMask client", {
|
|
566
|
+
appLogoUrl,
|
|
567
|
+
appName,
|
|
568
|
+
appUniversalLink,
|
|
569
|
+
debug,
|
|
570
|
+
nativeScheme,
|
|
571
|
+
supportedNetworks
|
|
572
|
+
});
|
|
573
|
+
if (clearEventListeners) clearEventListeners();
|
|
574
|
+
clearMetaMaskSdkSingleton();
|
|
575
|
+
const builtClientPromise = (0, _metamask_connect_multichain.createMultichainClient)({
|
|
576
|
+
api: { supportedNetworks },
|
|
577
|
+
dapp: {
|
|
578
|
+
iconUrl: appLogoUrl,
|
|
579
|
+
name: appName,
|
|
580
|
+
nativeScheme,
|
|
581
|
+
url: appUniversalLink ?? ""
|
|
582
|
+
},
|
|
583
|
+
debug,
|
|
584
|
+
mobile: { preferredOpenLink: createMetaMaskPreferredOpenLink(client) },
|
|
585
|
+
storage: createMetaMaskStorageClient(client),
|
|
586
|
+
ui: { headless: true }
|
|
587
|
+
}).then((metaMaskClient) => {
|
|
588
|
+
const createEventMapper = (event) => {
|
|
589
|
+
return (...args) => {
|
|
590
|
+
logger.debug(`[MetaMask:Events] ${event} event received`, { args });
|
|
591
|
+
events.emit(event, ...args);
|
|
592
|
+
};
|
|
593
|
+
};
|
|
594
|
+
const onDisplayUri = createEventMapper("display_uri");
|
|
595
|
+
metaMaskClient.on("display_uri", onDisplayUri);
|
|
596
|
+
const detachListeners = () => {
|
|
597
|
+
metaMaskClient.off("display_uri", onDisplayUri);
|
|
598
|
+
};
|
|
599
|
+
if (metaMaskClientPromise !== builtClientPromise) {
|
|
600
|
+
detachListeners();
|
|
601
|
+
return metaMaskClient;
|
|
602
|
+
}
|
|
603
|
+
clearEventListeners = detachListeners;
|
|
604
|
+
return metaMaskClient;
|
|
605
|
+
});
|
|
606
|
+
metaMaskClientPromise = builtClientPromise;
|
|
607
|
+
builtClientPromise.catch(() => {
|
|
608
|
+
if (metaMaskClientPromise === builtClientPromise) metaMaskClientPromise = null;
|
|
609
|
+
});
|
|
610
|
+
};
|
|
611
|
+
return {
|
|
612
|
+
clearMetaMaskStorageAndInstance: async () => {
|
|
613
|
+
await clearMetaMaskStorage(client);
|
|
614
|
+
metaMaskClientPromise = null;
|
|
615
|
+
refreshMetaMaskClient();
|
|
616
|
+
},
|
|
617
|
+
events,
|
|
618
|
+
getMetaMaskClient: async () => {
|
|
619
|
+
if (!metaMaskClientPromise) refreshMetaMaskClient();
|
|
620
|
+
if (!metaMaskClientPromise) throw new MetaMaskClientNotInitializedError();
|
|
621
|
+
return metaMaskClientPromise;
|
|
622
|
+
}
|
|
623
|
+
};
|
|
624
|
+
};
|
|
625
|
+
|
|
626
|
+
//#endregion
|
|
627
|
+
//#region src/metaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager.ts
|
|
628
|
+
const META_MASK_CLIENT_INSTANCE_MANAGER_KEY = "META_MASK_CLIENT_INSTANCE_MANAGER";
|
|
629
|
+
/**
|
|
630
|
+
* Returns this client's `MetaMaskClientInstanceManager`, creating it on first
|
|
631
|
+
* access. Every chain's MetaMask wallet provider (EVM, Solana, ...) calls
|
|
632
|
+
* this to reach the SAME manager -- and therefore the same shared multichain
|
|
633
|
+
* session -- rather than each building its own.
|
|
634
|
+
*
|
|
635
|
+
* @example
|
|
636
|
+
* ```ts
|
|
637
|
+
* const manager = getOrCreateMetaMaskClientInstanceManager(client);
|
|
638
|
+
* const metaMaskClient = await manager.getMetaMaskClient();
|
|
639
|
+
* ```
|
|
640
|
+
* @param client - The Dynamic client instance.
|
|
641
|
+
* @returns The client's `MetaMaskClientInstanceManager`.
|
|
642
|
+
* @see createMetaMaskClientInstanceManager
|
|
643
|
+
* @see disconnectMetaMaskWalletProvider
|
|
644
|
+
*/
|
|
645
|
+
const getOrCreateMetaMaskClientInstanceManager = (0, _dynamic_labs_sdk_client_core.createRuntimeServiceAccessKey)(META_MASK_CLIENT_INSTANCE_MANAGER_KEY, (client) => createMetaMaskClientInstanceManager(client));
|
|
646
|
+
|
|
647
|
+
//#endregion
|
|
648
|
+
Object.defineProperty(exports, 'MetaMaskUnscopedNetworkError', {
|
|
649
|
+
enumerable: true,
|
|
650
|
+
get: function () {
|
|
651
|
+
return MetaMaskUnscopedNetworkError;
|
|
652
|
+
}
|
|
653
|
+
});
|
|
654
|
+
Object.defineProperty(exports, 'SUPPORTED_METAMASK_CHAINS', {
|
|
655
|
+
enumerable: true,
|
|
656
|
+
get: function () {
|
|
657
|
+
return SUPPORTED_METAMASK_CHAINS;
|
|
658
|
+
}
|
|
659
|
+
});
|
|
660
|
+
Object.defineProperty(exports, 'UnsupportedMetaMaskChainError', {
|
|
661
|
+
enumerable: true,
|
|
662
|
+
get: function () {
|
|
663
|
+
return UnsupportedMetaMaskChainError;
|
|
664
|
+
}
|
|
665
|
+
});
|
|
666
|
+
Object.defineProperty(exports, '__toESM', {
|
|
667
|
+
enumerable: true,
|
|
668
|
+
get: function () {
|
|
669
|
+
return __toESM;
|
|
670
|
+
}
|
|
671
|
+
});
|
|
672
|
+
Object.defineProperty(exports, 'clearMetaMaskStorage', {
|
|
673
|
+
enumerable: true,
|
|
674
|
+
get: function () {
|
|
675
|
+
return clearMetaMaskStorage;
|
|
676
|
+
}
|
|
677
|
+
});
|
|
678
|
+
Object.defineProperty(exports, 'getMetaMaskScopeForNetworkId', {
|
|
679
|
+
enumerable: true,
|
|
680
|
+
get: function () {
|
|
681
|
+
return getMetaMaskScopeForNetworkId;
|
|
682
|
+
}
|
|
683
|
+
});
|
|
684
|
+
Object.defineProperty(exports, 'getMetaMaskScopes', {
|
|
685
|
+
enumerable: true,
|
|
686
|
+
get: function () {
|
|
687
|
+
return getMetaMaskScopes;
|
|
688
|
+
}
|
|
689
|
+
});
|
|
690
|
+
Object.defineProperty(exports, 'getOrCreateMetaMaskClientInstanceManager', {
|
|
691
|
+
enumerable: true,
|
|
692
|
+
get: function () {
|
|
693
|
+
return getOrCreateMetaMaskClientInstanceManager;
|
|
694
|
+
}
|
|
695
|
+
});
|
|
696
|
+
Object.defineProperty(exports, 'name', {
|
|
697
|
+
enumerable: true,
|
|
698
|
+
get: function () {
|
|
699
|
+
return name;
|
|
700
|
+
}
|
|
701
|
+
});
|
|
702
|
+
Object.defineProperty(exports, 'version', {
|
|
703
|
+
enumerable: true,
|
|
704
|
+
get: function () {
|
|
705
|
+
return version;
|
|
706
|
+
}
|
|
707
|
+
});
|
|
708
|
+
//# sourceMappingURL=getOrCreateMetaMaskClientInstanceManager-l6T7WUT5.cjs.map
|