@dynamic-labs-sdk/metamask 1.30.3 → 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,37 @@
|
|
|
1
|
+
import type { Chain, DynamicClient } from '@dynamic-labs-sdk/client';
|
|
2
|
+
import type { MultichainCore } from '@metamask/connect-multichain';
|
|
3
|
+
export type AssertMetaMaskNetworkIsGrantedParams = {
|
|
4
|
+
chain: Chain;
|
|
5
|
+
metaMaskClient: MultichainCore;
|
|
6
|
+
networkId: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Guards a MetaMask wallet provider's `switchActiveNetwork` against ever
|
|
10
|
+
* pointing at a network MetaMask didn't actually grant an account for.
|
|
11
|
+
* Every configured network is requested as an *optional* CAIP-25 scope (see
|
|
12
|
+
* `getMetaMaskScopes`), so MetaMask may silently approve only a subset --
|
|
13
|
+
* switching the active network to one outside that subset would leave every
|
|
14
|
+
* subsequent signing/sending call targeting a scope the wallet will reject.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* await assertMetaMaskNetworkIsGranted(
|
|
19
|
+
* { chain: 'SOL', metaMaskClient, networkId: '103' },
|
|
20
|
+
* client
|
|
21
|
+
* );
|
|
22
|
+
* // Throws MetaMaskUnscopedNetworkError if MetaMask never granted an
|
|
23
|
+
* // account for network "103" in the current session.
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @param client - The Dynamic client instance whose logger this reports
|
|
27
|
+
* against.
|
|
28
|
+
* @returns A promise that resolves once the target network is confirmed granted.
|
|
29
|
+
* @throws {MetaMaskUnscopedNetworkError} If `networkId` has no granted
|
|
30
|
+
* account in the current session (including when it has no configured
|
|
31
|
+
* MetaMask scope at all).
|
|
32
|
+
* @see resolveActiveMetaMaskScope
|
|
33
|
+
* @see MetaMaskUnscopedNetworkError
|
|
34
|
+
* @notInstrumented
|
|
35
|
+
*/
|
|
36
|
+
export declare const assertMetaMaskNetworkIsGranted: ({ chain, metaMaskClient, networkId }: AssertMetaMaskNetworkIsGrantedParams, client: DynamicClient) => Promise<void>;
|
|
37
|
+
//# sourceMappingURL=assertMetaMaskNetworkIsGranted.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertMetaMaskNetworkIsGranted.d.ts","sourceRoot":"","sources":["../../src/assertMetaMaskNetworkIsGranted/assertMetaMaskNetworkIsGranted.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAErE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAMnE,MAAM,MAAM,oCAAoC,GAAG;IACjD,KAAK,EAAE,KAAK,CAAC;IACb,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,8BAA8B,yCACH,oCAAoC,UAClE,aAAa,KACpB,OAAO,CAAC,IAAI,CA6Bd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/assertMetaMaskNetworkIsGranted/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { DynamicClient } from '@dynamic-labs-sdk/client';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* emits a fresh `display_uri`
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* Resets the MetaMask SDK's persisted session so the next connect call
|
|
4
|
+
* emits a fresh `display_uri` instead of resuming a stale pairing.
|
|
5
|
+
*
|
|
6
|
+
* @deprecated The clearMetaMaskSessionStorage is not needed anymore since the SDK itself will handle the storage
|
|
7
7
|
*
|
|
8
8
|
* @example
|
|
9
9
|
* ```ts
|
|
@@ -14,9 +14,9 @@ import type { DynamicClient } from '@dynamic-labs-sdk/client';
|
|
|
14
14
|
* @param client - The Dynamic client instance. Required (rather than
|
|
15
15
|
* defaulting to the last-initialized client) so a storage-clear failure is
|
|
16
16
|
* always logged against the client that actually requested it.
|
|
17
|
-
* @returns A promise that resolves once the
|
|
17
|
+
* @returns A promise that resolves once the persisted session is reset.
|
|
18
18
|
* @see connectWithMetaMaskUri
|
|
19
|
-
* @see
|
|
19
|
+
* @see createMetaMaskClientInstanceManager
|
|
20
20
|
* @notInstrumented
|
|
21
21
|
*/
|
|
22
22
|
export declare const clearMetaMaskSessionStorage: (client: DynamicClient) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clearMetaMaskSessionStorage.d.ts","sourceRoot":"","sources":["../../src/clearMetaMaskSessionStorage/clearMetaMaskSessionStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"clearMetaMaskSessionStorage.d.ts","sourceRoot":"","sources":["../../src/clearMetaMaskSessionStorage/clearMetaMaskSessionStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,2BAA2B,WAE9B,aAAa,KACpB,OAAO,CAAC,IAAI,CAAiC,CAAC"}
|
|
@@ -1,19 +1,16 @@
|
|
|
1
1
|
import type { Chain, DynamicClient, WalletProviderUriConnectionResult } from '@dynamic-labs-sdk/client';
|
|
2
2
|
import type { WalletProvider } from '@dynamic-labs-sdk/client/core';
|
|
3
|
-
import type { MetaMaskController } from '../metamask.types';
|
|
4
3
|
export type ConnectWithMetaMaskUriParams = {
|
|
5
4
|
/** Whether to add the connected wallet account to the Dynamic client. Defaults to `true`. */
|
|
6
5
|
addToDynamicWalletAccounts?: boolean;
|
|
7
6
|
/** Chain being connected; used to scope the extension-installed lookup. */
|
|
8
7
|
chain: Chain;
|
|
9
|
-
/** Returns the chain-specific `MetaMaskController` that drives the pairing. */
|
|
10
|
-
getController: (client: DynamicClient) => Promise<MetaMaskController>;
|
|
11
8
|
/**
|
|
12
9
|
* Builds the chain-specific `WalletProvider` AFTER the pairing has been
|
|
13
10
|
* approved. Must NOT include a `connect` method — the provider is registered
|
|
14
11
|
* purely for signing routing and would otherwise leak into the wallet picker.
|
|
15
12
|
*/
|
|
16
|
-
walletProviderBuilder: (client: DynamicClient) =>
|
|
13
|
+
walletProviderBuilder: (client: DynamicClient) => WalletProvider;
|
|
17
14
|
};
|
|
18
15
|
/**
|
|
19
16
|
* Drives a MetaMask SDK pairing for any chain and returns `{ approval, uri }`
|
|
@@ -28,23 +25,21 @@ export type ConnectWithMetaMaskUriParams = {
|
|
|
28
25
|
* ```ts
|
|
29
26
|
* const { uri, approval } = await connectWithMetaMaskUri({
|
|
30
27
|
* chain: 'EVM',
|
|
31
|
-
* getController: (client) => getEvmMetaMaskController(client),
|
|
32
28
|
* walletProviderBuilder: (client) => buildEvmWalletProvider(client),
|
|
33
29
|
* });
|
|
34
30
|
* // Render QR code with `uri`, then await approval()
|
|
35
31
|
* ```
|
|
36
32
|
*
|
|
37
33
|
* @param params.chain - Chain being connected; used to scope the extension-installed lookup.
|
|
38
|
-
* @param params.getController - Returns the chain-specific MetaMaskController for the pairing.
|
|
39
34
|
* @param params.walletProviderBuilder - Builds the chain-specific WalletProvider after pairing approval.
|
|
40
35
|
* @param [params.addToDynamicWalletAccounts] - Whether to add the wallet to the client. Defaults to `true`.
|
|
41
36
|
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
42
37
|
* @returns An object with `uri` (the pairing URI) and `approval` (async function resolving to wallet accounts).
|
|
43
38
|
* @throws {MetaMaskDisplayUriMissingError} If `connect` settles before a display_uri is emitted.
|
|
44
39
|
* @throws {NoAddressFoundError} If no address is returned after pairing approval.
|
|
45
|
-
* @see
|
|
40
|
+
* @see clearMetaMaskStorage
|
|
46
41
|
* @see getMetaMaskExtensionWalletProviderKey
|
|
47
42
|
* @notInstrumented
|
|
48
43
|
*/
|
|
49
|
-
export declare const connectWithMetaMaskUri: ({ addToDynamicWalletAccounts, chain,
|
|
44
|
+
export declare const connectWithMetaMaskUri: ({ addToDynamicWalletAccounts, chain, walletProviderBuilder, }: ConnectWithMetaMaskUriParams, client?: DynamicClient) => Promise<WalletProviderUriConnectionResult>;
|
|
50
45
|
//# sourceMappingURL=connectWithMetaMaskUri.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectWithMetaMaskUri.d.ts","sourceRoot":"","sources":["../../src/connectWithMetaMaskUri/connectWithMetaMaskUri.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EAEb,iCAAiC,EAClC,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"connectWithMetaMaskUri.d.ts","sourceRoot":"","sources":["../../src/connectWithMetaMaskUri/connectWithMetaMaskUri.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EAEb,iCAAiC,EAClC,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAgBpE,MAAM,MAAM,4BAA4B,GAAG;IACzC,6FAA6F;IAC7F,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,2EAA2E;IAC3E,KAAK,EAAE,KAAK,CAAC;IACb;;;;OAIG;IACH,qBAAqB,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,cAAc,CAAC;CAClE,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,sBAAsB,kEAK9B,4BAA4B,WACvB,aAAa,KACpB,OAAO,CAAC,iCAAiC,CA8G3C,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Chain } from '@dynamic-labs-sdk/client';
|
|
2
|
+
/**
|
|
3
|
+
* Chains MetaMask's multichain client can build a CAIP-2 scope for. Shared by
|
|
4
|
+
* every scope/network-mapping helper so the supported set only needs to
|
|
5
|
+
* change in one place.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SUPPORTED_METAMASK_CHAINS: Chain[];
|
|
8
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAEtD;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAqB,KAAK,EAAE,CAAC"}
|
package/dist/core.cjs
ADDED
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
const require_getOrCreateMetaMaskClientInstanceManager = require('./getOrCreateMetaMaskClientInstanceManager-l6T7WUT5.cjs');
|
|
2
|
+
let _dynamic_labs_sdk_assert_package_version = require("@dynamic-labs-sdk/assert-package-version");
|
|
3
|
+
let _dynamic_labs_sdk_client_core = require("@dynamic-labs-sdk/client/core");
|
|
4
|
+
let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
|
|
5
|
+
|
|
6
|
+
//#region src/getScopeAccountsFromMetaMaskClient/getScopeAccountsFromMetaMaskClient.ts
|
|
7
|
+
/**
|
|
8
|
+
* Reads the accounts MetaMask granted for a single CAIP-2 scope out of the
|
|
9
|
+
* current session, replacing direct `provider.getSession()` access so chain
|
|
10
|
+
* packages never touch the raw session shape. Empty when there's no session
|
|
11
|
+
* or the scope wasn't granted.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const accounts = await getScopeAccountsFromMetaMaskClient(
|
|
16
|
+
* { metaMaskClient, scope: 'eip155:1' },
|
|
17
|
+
* client
|
|
18
|
+
* );
|
|
19
|
+
* // ['eip155:1:0x...']
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* @param client - The Dynamic client instance whose logger this reports
|
|
23
|
+
* against. Required (rather than defaulting to the last-initialized client)
|
|
24
|
+
* so a missing/empty-scope result is always traceable to the client that
|
|
25
|
+
* requested it.
|
|
26
|
+
* @returns The accounts granted for `scope`, or an empty array if there's no
|
|
27
|
+
* session or the scope wasn't granted.
|
|
28
|
+
* @see createMetaMaskMultichainClient
|
|
29
|
+
* @see getGrantedMetaMaskScopes
|
|
30
|
+
* @notInstrumented
|
|
31
|
+
*/
|
|
32
|
+
const getScopeAccountsFromMetaMaskClient = async ({ metaMaskClient, scope }, client) => {
|
|
33
|
+
const session = await metaMaskClient.provider.getSession();
|
|
34
|
+
const accounts = session?.sessionScopes[scope]?.accounts ?? [];
|
|
35
|
+
(0, _dynamic_labs_sdk_client_core.getCore)(client).logger.debug("[MetaMask:Scopes] Resolved scope accounts", {
|
|
36
|
+
accountCount: accounts.length,
|
|
37
|
+
hasSession: session != null,
|
|
38
|
+
scope
|
|
39
|
+
});
|
|
40
|
+
return accounts;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
//#endregion
|
|
44
|
+
//#region src/assertMetaMaskNetworkIsGranted/assertMetaMaskNetworkIsGranted.ts
|
|
45
|
+
/**
|
|
46
|
+
* Guards a MetaMask wallet provider's `switchActiveNetwork` against ever
|
|
47
|
+
* pointing at a network MetaMask didn't actually grant an account for.
|
|
48
|
+
* Every configured network is requested as an *optional* CAIP-25 scope (see
|
|
49
|
+
* `getMetaMaskScopes`), so MetaMask may silently approve only a subset --
|
|
50
|
+
* switching the active network to one outside that subset would leave every
|
|
51
|
+
* subsequent signing/sending call targeting a scope the wallet will reject.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* await assertMetaMaskNetworkIsGranted(
|
|
56
|
+
* { chain: 'SOL', metaMaskClient, networkId: '103' },
|
|
57
|
+
* client
|
|
58
|
+
* );
|
|
59
|
+
* // Throws MetaMaskUnscopedNetworkError if MetaMask never granted an
|
|
60
|
+
* // account for network "103" in the current session.
|
|
61
|
+
* ```
|
|
62
|
+
*
|
|
63
|
+
* @param client - The Dynamic client instance whose logger this reports
|
|
64
|
+
* against.
|
|
65
|
+
* @returns A promise that resolves once the target network is confirmed granted.
|
|
66
|
+
* @throws {MetaMaskUnscopedNetworkError} If `networkId` has no granted
|
|
67
|
+
* account in the current session (including when it has no configured
|
|
68
|
+
* MetaMask scope at all).
|
|
69
|
+
* @see resolveActiveMetaMaskScope
|
|
70
|
+
* @see MetaMaskUnscopedNetworkError
|
|
71
|
+
* @notInstrumented
|
|
72
|
+
*/
|
|
73
|
+
const assertMetaMaskNetworkIsGranted = async ({ chain, metaMaskClient, networkId }, client) => {
|
|
74
|
+
const { logger } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
|
|
75
|
+
const scope = require_getOrCreateMetaMaskClientInstanceManager.getMetaMaskScopeForNetworkId({
|
|
76
|
+
chain,
|
|
77
|
+
networkId
|
|
78
|
+
}, client);
|
|
79
|
+
const accounts = scope ? await getScopeAccountsFromMetaMaskClient({
|
|
80
|
+
metaMaskClient,
|
|
81
|
+
scope
|
|
82
|
+
}, client) : [];
|
|
83
|
+
logger.debug("[MetaMask:Scopes] Checked whether target network is granted", {
|
|
84
|
+
accountCount: accounts.length,
|
|
85
|
+
chain,
|
|
86
|
+
networkId,
|
|
87
|
+
scope
|
|
88
|
+
});
|
|
89
|
+
if (accounts.length === 0) {
|
|
90
|
+
logger.warn("[MetaMask:Scopes] Rejected switch to an unscoped network", {
|
|
91
|
+
chain,
|
|
92
|
+
networkId,
|
|
93
|
+
scope
|
|
94
|
+
});
|
|
95
|
+
throw new require_getOrCreateMetaMaskClientInstanceManager.MetaMaskUnscopedNetworkError({
|
|
96
|
+
networkId,
|
|
97
|
+
scope: scope ?? "unknown"
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
//#endregion
|
|
103
|
+
//#region src/createMetaMaskWalletProviderEventEmitter/createMetaMaskWalletProviderEventEmitter.ts
|
|
104
|
+
/**
|
|
105
|
+
* MetaMask's multichain session never triggers `createWalletProviderEventEmitter`'s
|
|
106
|
+
* usual external-listener flow -- there is no live wallet event to bridge, only our
|
|
107
|
+
* own local actions (e.g. `switchActiveNetwork`) that need to notify subscribers
|
|
108
|
+
* themselves. `setupEventListeners` here just captures the handler references so
|
|
109
|
+
* they can be invoked directly, instead of from a real event source.
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```ts
|
|
113
|
+
* const metaMaskEvents = createMetaMaskWalletProviderEventEmitter();
|
|
114
|
+
* metaMaskEvents.getEventEmitter().on('networkChanged', ({ networkId }) => {});
|
|
115
|
+
* metaMaskEvents.emitNetworkChanged({ networkId: '137' });
|
|
116
|
+
* ```
|
|
117
|
+
* @returns A `MetaMaskWalletProviderEventEmitter` ready to emit synthetic
|
|
118
|
+
* `networkChanged`/`disconnected` events.
|
|
119
|
+
* @see MetaMaskWalletProviderEventEmitter
|
|
120
|
+
* @see createWalletProviderEventEmitter
|
|
121
|
+
* @notInstrumented
|
|
122
|
+
*/
|
|
123
|
+
const createMetaMaskWalletProviderEventEmitter = () => {
|
|
124
|
+
let handleDisconnected;
|
|
125
|
+
let handleNetworkChanged;
|
|
126
|
+
const emitter = (0, _dynamic_labs_sdk_client_core.createWalletProviderEventEmitter)({
|
|
127
|
+
removeEventListeners: () => {},
|
|
128
|
+
setupEventListeners: (handlers) => {
|
|
129
|
+
handleDisconnected = handlers.handleDisconnected;
|
|
130
|
+
handleNetworkChanged = handlers.handleNetworkChanged;
|
|
131
|
+
},
|
|
132
|
+
supportedEvents: ["disconnected", "networkChanged"]
|
|
133
|
+
});
|
|
134
|
+
emitter.getEventEmitter();
|
|
135
|
+
return {
|
|
136
|
+
...emitter,
|
|
137
|
+
emitDisconnected: () => handleDisconnected(),
|
|
138
|
+
emitNetworkChanged: (params) => handleNetworkChanged(params)
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
//#endregion
|
|
143
|
+
//#region src/disconnectMetaMaskWalletProvider/disconnectMetaMaskWalletProvider.ts
|
|
144
|
+
/**
|
|
145
|
+
* Shared `disconnectWalletAccount` for every chain's MetaMask wallet provider
|
|
146
|
+
* (EVM, Solana, ...). `getOrCreateMetaMaskClientInstanceManager` hands every chain
|
|
147
|
+
* the SAME client instance -- one multichain session shared across chains --
|
|
148
|
+
* so this only asks MetaMask to drop this chain's own scopes rather than
|
|
149
|
+
* tearing the whole session down under a still-connected chain.
|
|
150
|
+
*
|
|
151
|
+
* `disconnect`'s teardown in `@metamask/connect-multichain` is itself
|
|
152
|
+
* scope-aware: it only actually ends the shared session once every chain's
|
|
153
|
+
* scopes are gone, reflected by `metaMaskClient.status` flipping to
|
|
154
|
+
* `'disconnected'`. Only then do we clear the persisted session and evict
|
|
155
|
+
* the cached client, so a chain that's still connected is left untouched.
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```ts
|
|
159
|
+
* await disconnectMetaMaskWalletProvider(
|
|
160
|
+
* { chain: 'EVM', walletProviderKey: 'metamask-evm' },
|
|
161
|
+
* client
|
|
162
|
+
* );
|
|
163
|
+
* ```
|
|
164
|
+
* @param params.chain - Chain of the wallet account being disconnected.
|
|
165
|
+
* @param params.walletProviderKey - Key of the chain-specific wallet provider to unregister.
|
|
166
|
+
* @param client - The Dynamic client instance. Required (rather than
|
|
167
|
+
* defaulting to the last-initialized client) since this always runs from
|
|
168
|
+
* inside an already-resolved chain wallet provider, which already has one.
|
|
169
|
+
* @returns A promise that resolves once local cleanup is done. Never rejects
|
|
170
|
+
* on the remote signal failing -- that's logged, not surfaced, since the
|
|
171
|
+
* wallet account is being removed either way.
|
|
172
|
+
* @see clearMetaMaskStorage
|
|
173
|
+
* @see getMetaMaskScopes
|
|
174
|
+
* @notInstrumented
|
|
175
|
+
*/
|
|
176
|
+
const disconnectMetaMaskWalletProvider = async ({ chain, walletProviderKey }, client) => {
|
|
177
|
+
const { logger } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
|
|
178
|
+
const metaMaskClient = await require_getOrCreateMetaMaskClientInstanceManager.getOrCreateMetaMaskClientInstanceManager(client).getMetaMaskClient();
|
|
179
|
+
const scopes = require_getOrCreateMetaMaskClientInstanceManager.getMetaMaskScopes({ chain }, client);
|
|
180
|
+
logger.debug("[MetaMask:Disconnect] Disconnecting wallet account", {
|
|
181
|
+
chain,
|
|
182
|
+
scopes,
|
|
183
|
+
walletProviderKey
|
|
184
|
+
});
|
|
185
|
+
try {
|
|
186
|
+
await metaMaskClient.disconnect(scopes);
|
|
187
|
+
} catch (error) {
|
|
188
|
+
logger.error("[MetaMask:Disconnect] Remote signal failed", {
|
|
189
|
+
error,
|
|
190
|
+
walletProviderKey
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
(0, _dynamic_labs_sdk_client_core.getWalletProviderRegistry)(client).unregister(walletProviderKey);
|
|
194
|
+
logger.debug("[MetaMask:Disconnect] Shared session status after disconnect", {
|
|
195
|
+
status: metaMaskClient.status,
|
|
196
|
+
walletProviderKey
|
|
197
|
+
});
|
|
198
|
+
if (metaMaskClient.status === "disconnected") await require_getOrCreateMetaMaskClientInstanceManager.clearMetaMaskStorage(client);
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
//#endregion
|
|
202
|
+
//#region src/reconcileMetaMaskWalletProvider/reconcileMetaMaskWalletProvider.ts
|
|
203
|
+
/**
|
|
204
|
+
* Keeps a chain's MetaMask SDK wallet provider registered for as
|
|
205
|
+
* long as the user has a wallet account under its exact key, and
|
|
206
|
+
* unregisters it once that wallet account disappears (e.g. on disconnect).
|
|
207
|
+
* This is needed because always adding the MetaMask SDK wallet provider
|
|
208
|
+
* would conflict with the browser extension wallet provider, so we only add
|
|
209
|
+
* it once the user has a wallet account that was connected via QR code.
|
|
210
|
+
* The placeholder is only built (via `walletProviderBuilder`) the first time
|
|
211
|
+
* it must be registered, mirroring how WalletConnect only builds a wallet
|
|
212
|
+
* provider for a session that actually exists.
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```ts
|
|
216
|
+
* reconcileMetaMaskWalletProvider(
|
|
217
|
+
* {
|
|
218
|
+
* walletProviderBuilder: createMetaMaskEvmWalletProvider,
|
|
219
|
+
* walletProviderKey: getMetaMaskEvmSdkWalletProviderKey(),
|
|
220
|
+
* },
|
|
221
|
+
* client
|
|
222
|
+
* );
|
|
223
|
+
* ```
|
|
224
|
+
* @param params.walletProviderBuilder - Builds the SDK placeholder wallet provider once it must be registered.
|
|
225
|
+
* @param params.walletProviderKey - The placeholder's deterministic wallet provider key.
|
|
226
|
+
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
227
|
+
* @returns void
|
|
228
|
+
* @see connectWithMetaMaskUri
|
|
229
|
+
* @see WalletProviderPriority
|
|
230
|
+
* @notInstrumented
|
|
231
|
+
*/
|
|
232
|
+
const reconcileMetaMaskWalletProvider = ({ walletProviderBuilder, walletProviderKey }, client = (0, _dynamic_labs_sdk_client_core.getDefaultClient)()) => {
|
|
233
|
+
const walletProviderRegistry = (0, _dynamic_labs_sdk_client_core.getWalletProviderRegistry)(client);
|
|
234
|
+
const reconcile = () => {
|
|
235
|
+
const isSdkPlaceholderRegistered = walletProviderRegistry.getByKey(walletProviderKey) !== void 0;
|
|
236
|
+
const shouldBeRegistered = (0, _dynamic_labs_sdk_client.getWalletAccounts)(client).some((walletAccount) => walletAccount.walletProviderKey === walletProviderKey);
|
|
237
|
+
if (isSdkPlaceholderRegistered && !shouldBeRegistered) {
|
|
238
|
+
walletProviderRegistry.unregister(walletProviderKey);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (!isSdkPlaceholderRegistered && shouldBeRegistered) walletProviderRegistry.register({
|
|
242
|
+
priority: _dynamic_labs_sdk_client_core.WalletProviderPriority.WALLET_SDK,
|
|
243
|
+
walletProvider: walletProviderBuilder(client)
|
|
244
|
+
});
|
|
245
|
+
};
|
|
246
|
+
(0, _dynamic_labs_sdk_client.onEvent)({
|
|
247
|
+
event: "walletAccountsChanged",
|
|
248
|
+
listener: () => reconcile()
|
|
249
|
+
}, client);
|
|
250
|
+
reconcile();
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
//#endregion
|
|
254
|
+
//#region src/getGrantedMetaMaskScopes/getGrantedMetaMaskScopes.ts
|
|
255
|
+
/**
|
|
256
|
+
* Enumerates every CAIP-2 scope in the current session that MetaMask
|
|
257
|
+
* actually granted at least one account for. Every scope requested at
|
|
258
|
+
* `connect()` time (see `getMetaMaskScopes`) is sent as an *optional*
|
|
259
|
+
* CAIP-25 scope, never a required one, so MetaMask is free to approve only a
|
|
260
|
+
* subset -- `session.sessionScopes` still has a key for every requested
|
|
261
|
+
* scope, just with an empty `accounts` array for the ones that weren't
|
|
262
|
+
* granted. This filters those out, replacing direct `provider.getSession()`
|
|
263
|
+
* access so chain packages never touch the raw session shape.
|
|
264
|
+
*
|
|
265
|
+
* @example
|
|
266
|
+
* ```ts
|
|
267
|
+
* const granted = await getGrantedMetaMaskScopes({ metaMaskClient }, client);
|
|
268
|
+
* // [{ scope: 'eip155:1', accounts: ['eip155:1:0x...'] }]
|
|
269
|
+
* ```
|
|
270
|
+
*
|
|
271
|
+
* @param client - The Dynamic client instance whose logger this reports
|
|
272
|
+
* against. Required (rather than defaulting to the last-initialized client)
|
|
273
|
+
* so an empty result is always traceable to the client that requested it.
|
|
274
|
+
* @returns The scopes with at least one granted account, and their accounts.
|
|
275
|
+
* @see createMetaMaskMultichainClient
|
|
276
|
+
* @see resolveActiveMetaMaskScope
|
|
277
|
+
* @notInstrumented
|
|
278
|
+
*/
|
|
279
|
+
const getGrantedMetaMaskScopes = async ({ metaMaskClient }, client) => {
|
|
280
|
+
const session = await metaMaskClient.provider.getSession();
|
|
281
|
+
const sessionScopes = session?.sessionScopes ?? {};
|
|
282
|
+
const grantedScopes = Object.entries(sessionScopes).filter(([, scopeData]) => (scopeData.accounts ?? []).length > 0).map(([scope, scopeData]) => ({
|
|
283
|
+
accounts: scopeData.accounts ?? [],
|
|
284
|
+
scope
|
|
285
|
+
}));
|
|
286
|
+
(0, _dynamic_labs_sdk_client_core.getCore)(client).logger.debug("[MetaMask:Scopes] Resolved granted scopes", {
|
|
287
|
+
grantedScopeCount: grantedScopes.length,
|
|
288
|
+
hasSession: session != null
|
|
289
|
+
});
|
|
290
|
+
return grantedScopes;
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
//#endregion
|
|
294
|
+
//#region src/getNetworkIdFromMetaMaskScope/getNetworkIdFromMetaMaskScope.ts
|
|
295
|
+
/**
|
|
296
|
+
* Reverse of `getMetaMaskScopeForNetworkId`: maps a granted CAIP-2 scope
|
|
297
|
+
* back to the Dynamic `networkId` it came from, for the given chain.
|
|
298
|
+
*
|
|
299
|
+
* Returns `undefined` -- not a throw -- when `scope` doesn't belong to
|
|
300
|
+
* `chain` (e.g. an `eip155:` scope while scanning for `SOL`). For `SOL`,
|
|
301
|
+
* this also covers a `solana:` scope matching no configured network. This
|
|
302
|
+
* is the normal, expected outcome when scanning a session's granted scopes
|
|
303
|
+
* for a single chain: a MetaMask multichain session is shared across every
|
|
304
|
+
* connected chain
|
|
305
|
+
*
|
|
306
|
+
* @example
|
|
307
|
+
* ```ts
|
|
308
|
+
* const networkId = getNetworkIdFromMetaMaskScope(
|
|
309
|
+
* { chain: 'EVM', scope: 'eip155:1' },
|
|
310
|
+
* client
|
|
311
|
+
* );
|
|
312
|
+
* // '1'
|
|
313
|
+
* ```
|
|
314
|
+
*
|
|
315
|
+
* @returns The matching Dynamic `networkId`, or `undefined` if `scope`
|
|
316
|
+
* doesn't belong to `chain` (or, for `SOL`, matches no configured network).
|
|
317
|
+
* @see getMetaMaskScopeForNetworkId
|
|
318
|
+
* @see resolveActiveMetaMaskScope
|
|
319
|
+
* @throws {UnsupportedMetaMaskChainError} If `chain` isn't a chain MetaMask
|
|
320
|
+
* scopes can be built for.
|
|
321
|
+
* @notInstrumented
|
|
322
|
+
*/
|
|
323
|
+
const getNetworkIdFromMetaMaskScope = ({ chain, scope }, client) => {
|
|
324
|
+
const [namespace, reference] = scope.split(":");
|
|
325
|
+
if (chain === "EVM") return namespace === "eip155" ? reference : void 0;
|
|
326
|
+
if (chain === "SOL") {
|
|
327
|
+
if (namespace !== "solana") return;
|
|
328
|
+
return (0, _dynamic_labs_sdk_client.getNetworksData)(client).find((candidate) => candidate.chain === "SOL" && candidate.genesisHash === reference)?.networkId;
|
|
329
|
+
}
|
|
330
|
+
throw new require_getOrCreateMetaMaskClientInstanceManager.UnsupportedMetaMaskChainError({
|
|
331
|
+
chain,
|
|
332
|
+
supportedChains: require_getOrCreateMetaMaskClientInstanceManager.SUPPORTED_METAMASK_CHAINS
|
|
333
|
+
});
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
//#endregion
|
|
337
|
+
//#region src/resolveActiveMetaMaskScope/resolveActiveMetaMaskScope.ts
|
|
338
|
+
/**
|
|
339
|
+
* Resolves the network a MetaMask wallet provider should treat as active,
|
|
340
|
+
* self-healing when the last-known-active network (see
|
|
341
|
+
* `getActiveNetworkIdFromLastKnownRegistry`) turns out to have no granted
|
|
342
|
+
* account.
|
|
343
|
+
*
|
|
344
|
+
* Every configured network is requested as an *optional* CAIP-25 scope (see
|
|
345
|
+
* `getMetaMaskScopes`), so MetaMask is free to grant an account for only a
|
|
346
|
+
* subset -- and the registry's own default (the first configured network for
|
|
347
|
+
* the chain) has no awareness of which subset that was. If the active
|
|
348
|
+
* network's scope is empty, this scans every OTHER scope this chain
|
|
349
|
+
* requested, restricted to the ones MetaMask actually granted, and adopts
|
|
350
|
+
* whichever is found (preferring a non-testnet network) as the new active
|
|
351
|
+
* network -- persisting the correction so future calls don't repeat the
|
|
352
|
+
* scan. If nothing was granted for this chain at all, the original
|
|
353
|
+
* (accounts: []) result is returned unchanged, preserving the existing
|
|
354
|
+
* "no address found" behavior when there's truly nothing to fall back to.
|
|
355
|
+
*
|
|
356
|
+
* @example
|
|
357
|
+
* ```ts
|
|
358
|
+
* const { accounts } = await resolveActiveMetaMaskScope(
|
|
359
|
+
* { chain: 'SOL', metaMaskClient, walletProviderKey },
|
|
360
|
+
* client
|
|
361
|
+
* );
|
|
362
|
+
* // accounts is non-empty even if the registry's default network wasn't
|
|
363
|
+
* // the one MetaMask actually granted.
|
|
364
|
+
* ```
|
|
365
|
+
*
|
|
366
|
+
* @param [client] - The Dynamic client instance whose logger this reports
|
|
367
|
+
* against. Required (rather than defaulting to the last-initialized client)
|
|
368
|
+
* so a fallback decision is always traceable to the client that requested it.
|
|
369
|
+
* @returns The resolved active network's id, CAIP-2 scope, and granted accounts.
|
|
370
|
+
* @see assertMetaMaskNetworkIsGranted
|
|
371
|
+
* @see getGrantedMetaMaskScopes
|
|
372
|
+
* @notInstrumented
|
|
373
|
+
*/
|
|
374
|
+
const resolveActiveMetaMaskScope = async ({ chain, metaMaskClient, walletProviderKey }, client = (0, _dynamic_labs_sdk_client_core.getDefaultClient)()) => {
|
|
375
|
+
const { logger } = (0, _dynamic_labs_sdk_client_core.getCore)(client);
|
|
376
|
+
const { networkId: activeNetworkId } = await (0, _dynamic_labs_sdk_client_core.getActiveNetworkIdFromLastKnownRegistry)({
|
|
377
|
+
client,
|
|
378
|
+
walletProviderKey
|
|
379
|
+
});
|
|
380
|
+
const activeScope = require_getOrCreateMetaMaskClientInstanceManager.getMetaMaskScopeForNetworkId({
|
|
381
|
+
chain,
|
|
382
|
+
networkId: activeNetworkId
|
|
383
|
+
}, client);
|
|
384
|
+
const activeAccounts = activeScope ? await getScopeAccountsFromMetaMaskClient({
|
|
385
|
+
metaMaskClient,
|
|
386
|
+
scope: activeScope
|
|
387
|
+
}, client) : [];
|
|
388
|
+
if (activeAccounts.length > 0) {
|
|
389
|
+
logger.debug("[MetaMask:Scopes] Active network scope already has granted accounts", {
|
|
390
|
+
activeNetworkId,
|
|
391
|
+
chain,
|
|
392
|
+
scope: activeScope
|
|
393
|
+
});
|
|
394
|
+
return {
|
|
395
|
+
accounts: activeAccounts,
|
|
396
|
+
networkId: activeNetworkId,
|
|
397
|
+
scope: activeScope
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
logger.debug("[MetaMask:Scopes] Active network scope has no granted accounts, scanning other requested scopes for this chain", {
|
|
401
|
+
activeNetworkId,
|
|
402
|
+
chain,
|
|
403
|
+
scope: activeScope
|
|
404
|
+
});
|
|
405
|
+
const requestedScopes = new Set(require_getOrCreateMetaMaskClientInstanceManager.getMetaMaskScopes({ chain }, client));
|
|
406
|
+
const grantedScopes = await getGrantedMetaMaskScopes({ metaMaskClient }, client);
|
|
407
|
+
const configuredNetworks = (0, _dynamic_labs_sdk_client.getNetworksData)(client).filter((network) => network.chain === chain);
|
|
408
|
+
const testnetByNetworkId = new Map(configuredNetworks.map((network) => [network.networkId, network.testnet]));
|
|
409
|
+
const configuredOrderByNetworkId = new Map(configuredNetworks.map((network, index) => [network.networkId, index]));
|
|
410
|
+
const candidates = grantedScopes.filter(({ scope }) => requestedScopes.has(scope)).flatMap(({ accounts, scope }) => {
|
|
411
|
+
const networkId = getNetworkIdFromMetaMaskScope({
|
|
412
|
+
chain,
|
|
413
|
+
scope
|
|
414
|
+
}, client);
|
|
415
|
+
return networkId ? [{
|
|
416
|
+
accounts,
|
|
417
|
+
networkId,
|
|
418
|
+
scope
|
|
419
|
+
}] : [];
|
|
420
|
+
}).sort((a, b) => (configuredOrderByNetworkId.get(a.networkId) ?? 0) - (configuredOrderByNetworkId.get(b.networkId) ?? 0));
|
|
421
|
+
const fallback = candidates.find(({ networkId }) => !testnetByNetworkId.get(networkId)) ?? candidates[0];
|
|
422
|
+
if (fallback === void 0) {
|
|
423
|
+
logger.debug("[MetaMask:Scopes] No granted scope with accounts found for chain", {
|
|
424
|
+
activeNetworkId,
|
|
425
|
+
chain,
|
|
426
|
+
requestedScopes: [...requestedScopes]
|
|
427
|
+
});
|
|
428
|
+
return {
|
|
429
|
+
accounts: activeAccounts,
|
|
430
|
+
networkId: activeNetworkId,
|
|
431
|
+
scope: activeScope
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
logger.debug("[MetaMask:Scopes] Falling back to a granted scope after the active scope had no accounts", {
|
|
435
|
+
activeNetworkId,
|
|
436
|
+
activeScope,
|
|
437
|
+
chain,
|
|
438
|
+
fallbackNetworkId: fallback.networkId,
|
|
439
|
+
fallbackScope: fallback.scope
|
|
440
|
+
});
|
|
441
|
+
await (0, _dynamic_labs_sdk_client_core.switchActiveNetworkInLastKnownRegistry)({
|
|
442
|
+
client,
|
|
443
|
+
networkId: fallback.networkId,
|
|
444
|
+
walletProviderKey
|
|
445
|
+
});
|
|
446
|
+
return {
|
|
447
|
+
accounts: fallback.accounts,
|
|
448
|
+
networkId: fallback.networkId,
|
|
449
|
+
scope: fallback.scope
|
|
450
|
+
};
|
|
451
|
+
};
|
|
452
|
+
|
|
453
|
+
//#endregion
|
|
454
|
+
//#region src/exports/core.ts
|
|
455
|
+
(0, _dynamic_labs_sdk_assert_package_version.assertPackageVersion)(require_getOrCreateMetaMaskClientInstanceManager.name, require_getOrCreateMetaMaskClientInstanceManager.version);
|
|
456
|
+
|
|
457
|
+
//#endregion
|
|
458
|
+
exports.assertMetaMaskNetworkIsGranted = assertMetaMaskNetworkIsGranted;
|
|
459
|
+
exports.clearMetaMaskStorage = require_getOrCreateMetaMaskClientInstanceManager.clearMetaMaskStorage;
|
|
460
|
+
exports.createMetaMaskWalletProviderEventEmitter = createMetaMaskWalletProviderEventEmitter;
|
|
461
|
+
exports.disconnectMetaMaskWalletProvider = disconnectMetaMaskWalletProvider;
|
|
462
|
+
exports.getOrCreateMetaMaskClientInstanceManager = require_getOrCreateMetaMaskClientInstanceManager.getOrCreateMetaMaskClientInstanceManager;
|
|
463
|
+
exports.reconcileMetaMaskWalletProvider = reconcileMetaMaskWalletProvider;
|
|
464
|
+
exports.resolveActiveMetaMaskScope = resolveActiveMetaMaskScope;
|
|
465
|
+
//# sourceMappingURL=core.cjs.map
|