@dynamic-labs-sdk/solana 1.3.0 → 1.5.0
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/addSolanaWalletStandardExtension-BA3gsfap.esm.js +43 -0
- package/dist/addSolanaWalletStandardExtension-BA3gsfap.esm.js.map +1 -0
- package/dist/addSolanaWalletStandardExtension-B_xgItlS.cjs +49 -0
- package/dist/addSolanaWalletStandardExtension-B_xgItlS.cjs.map +1 -0
- package/dist/{addWaasSolanaExtension-Cg3NSUhc.cjs → addWaasSolanaExtension-BFUZxm1W.cjs} +2 -2
- package/dist/{addWaasSolanaExtension-Cg3NSUhc.cjs.map → addWaasSolanaExtension-BFUZxm1W.cjs.map} +1 -1
- package/dist/{addWaasSolanaExtension-BkfWvyyw.esm.js → addWaasSolanaExtension-DqoYZS9E.esm.js} +2 -2
- package/dist/{addWaasSolanaExtension-BkfWvyyw.esm.js.map → addWaasSolanaExtension-DqoYZS9E.esm.js.map} +1 -1
- package/dist/{addSolanaWalletStandardExtension-Be-6Ygxh.cjs → createWalletProviderFromSolanaStandardWallet-BxD2GtlU.cjs} +11 -43
- package/dist/createWalletProviderFromSolanaStandardWallet-BxD2GtlU.cjs.map +1 -0
- package/dist/{addSolanaWalletStandardExtension-sDd9PeWK.esm.js → createWalletProviderFromSolanaStandardWallet-p0Vh1zZ_.esm.js} +5 -43
- package/dist/createWalletProviderFromSolanaStandardWallet-p0Vh1zZ_.esm.js.map +1 -0
- package/dist/exports/metamask.d.ts +6 -0
- package/dist/exports/metamask.d.ts.map +1 -0
- package/dist/index.cjs +5 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +4 -23
- package/dist/index.esm.js.map +1 -1
- package/dist/metamask/connectAndVerifyWithMetaMaskUriSolana/connectAndVerifyWithMetaMaskUriSolana.d.ts +20 -0
- package/dist/metamask/connectAndVerifyWithMetaMaskUriSolana/connectAndVerifyWithMetaMaskUriSolana.d.ts.map +1 -0
- package/dist/metamask/connectAndVerifyWithMetaMaskUriSolana/index.d.ts +2 -0
- package/dist/metamask/connectAndVerifyWithMetaMaskUriSolana/index.d.ts.map +1 -0
- package/dist/metamask/connectWithMetaMaskUriSolana/connectWithMetaMaskUriSolana.d.ts +16 -0
- package/dist/metamask/connectWithMetaMaskUriSolana/connectWithMetaMaskUriSolana.d.ts.map +1 -0
- package/dist/metamask/connectWithMetaMaskUriSolana/index.d.ts +3 -0
- package/dist/metamask/connectWithMetaMaskUriSolana/index.d.ts.map +1 -0
- package/dist/metamask/createMetaMaskSolanaWalletProvider/createMetaMaskSolanaWalletProvider.d.ts +16 -0
- package/dist/metamask/createMetaMaskSolanaWalletProvider/createMetaMaskSolanaWalletProvider.d.ts.map +1 -0
- package/dist/metamask/createMetaMaskSolanaWalletProvider/index.d.ts +2 -0
- package/dist/metamask/createMetaMaskSolanaWalletProvider/index.d.ts.map +1 -0
- package/dist/metamask/getMetaMaskSolanaExtensionWalletProviderKey/getMetaMaskSolanaExtensionWalletProviderKey.d.ts +11 -0
- package/dist/metamask/getMetaMaskSolanaExtensionWalletProviderKey/getMetaMaskSolanaExtensionWalletProviderKey.d.ts.map +1 -0
- package/dist/metamask/getMetaMaskSolanaExtensionWalletProviderKey/index.d.ts +2 -0
- package/dist/metamask/getMetaMaskSolanaExtensionWalletProviderKey/index.d.ts.map +1 -0
- package/dist/metamask/metamask.types.d.ts +14 -0
- package/dist/metamask/metamask.types.d.ts.map +1 -0
- package/dist/metamask/utils/createMetaMaskSolanaController/createMetaMaskSolanaController.d.ts +17 -0
- package/dist/metamask/utils/createMetaMaskSolanaController/createMetaMaskSolanaController.d.ts.map +1 -0
- package/dist/metamask/utils/createMetaMaskSolanaController/index.d.ts +2 -0
- package/dist/metamask/utils/createMetaMaskSolanaController/index.d.ts.map +1 -0
- package/dist/metamask/utils/getOrCreateMetaMaskSolanaController/getOrCreateMetaMaskSolanaController.d.ts +20 -0
- package/dist/metamask/utils/getOrCreateMetaMaskSolanaController/getOrCreateMetaMaskSolanaController.d.ts.map +1 -0
- package/dist/metamask/utils/getOrCreateMetaMaskSolanaController/index.d.ts +2 -0
- package/dist/metamask/utils/getOrCreateMetaMaskSolanaController/index.d.ts.map +1 -0
- package/dist/metamask/utils/getSolanaNetworkFromCluster/getSolanaNetworkFromCluster.d.ts +18 -0
- package/dist/metamask/utils/getSolanaNetworkFromCluster/getSolanaNetworkFromCluster.d.ts.map +1 -0
- package/dist/metamask/utils/getSolanaNetworkFromCluster/index.d.ts +3 -0
- package/dist/metamask/utils/getSolanaNetworkFromCluster/index.d.ts.map +1 -0
- package/dist/metamask/utils/getSupportedNetworks/getSupportedNetworks.d.ts +16 -0
- package/dist/metamask/utils/getSupportedNetworks/getSupportedNetworks.d.ts.map +1 -0
- package/dist/metamask/utils/getSupportedNetworks/index.d.ts +2 -0
- package/dist/metamask/utils/getSupportedNetworks/index.d.ts.map +1 -0
- package/dist/metamask.cjs +258 -0
- package/dist/metamask.cjs.map +1 -0
- package/dist/metamask.esm.js +249 -0
- package/dist/metamask.esm.js.map +1 -0
- package/dist/signAndSendTransaction/signAndSendTransaction.d.ts +26 -3
- package/dist/signAndSendTransaction/signAndSendTransaction.d.ts.map +1 -1
- package/dist/{solanaTransferAmount-BnXvC3Mo.cjs → solanaTransferAmount-CoNaVFtC.cjs} +85 -52
- package/dist/solanaTransferAmount-CoNaVFtC.cjs.map +1 -0
- package/dist/{solanaTransferAmount-DLyhEiFq.esm.js → solanaTransferAmount-DzMtPDJf.esm.js} +80 -53
- package/dist/solanaTransferAmount-DzMtPDJf.esm.js.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/utils/solanaExecuteSwapTransaction/solanaExecuteSwapTransaction.d.ts +5 -3
- package/dist/utils/solanaExecuteSwapTransaction/solanaExecuteSwapTransaction.d.ts.map +1 -1
- package/dist/utils/solanaTransferAmount/solanaTransferAmount.d.ts.map +1 -1
- package/dist/waas.cjs +2 -2
- package/dist/waas.esm.js +2 -2
- package/dist/walletConnect.cjs +1 -1
- package/dist/walletConnect.esm.js +1 -1
- package/dist/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/createWalletProviderFromSolanaStandardWallet.d.ts +10 -1
- package/dist/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/createWalletProviderFromSolanaStandardWallet.d.ts.map +1 -1
- package/dist/walletStandard.cjs +3 -2
- package/dist/walletStandard.cjs.map +1 -1
- package/dist/walletStandard.esm.js +3 -2
- package/dist/walletStandard.esm.js.map +1 -1
- package/package.json +14 -7
- package/dist/addSolanaWalletStandardExtension-Be-6Ygxh.cjs.map +0 -1
- package/dist/addSolanaWalletStandardExtension-sDd9PeWK.esm.js.map +0 -1
- package/dist/solanaTransferAmount-BnXvC3Mo.cjs.map +0 -1
- package/dist/solanaTransferAmount-DLyhEiFq.esm.js.map +0 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { MetaMaskController } from '@dynamic-labs-sdk/metamask';
|
|
2
|
+
import type { SolanaClient } from '@metamask/connect-solana';
|
|
3
|
+
/**
|
|
4
|
+
* Per-Dynamic-client Solana-flavoured `MetaMaskController`. Extends the
|
|
5
|
+
* chain-agnostic surface with the typed `@metamask/connect-solana` SDK
|
|
6
|
+
* handle so the Wallet Standard provider builder can reach the paired
|
|
7
|
+
* wallet directly for signing. Returned by `createMetaMaskSolanaController`
|
|
8
|
+
* and cached per Dynamic client by `getOrCreateMetaMaskSolanaController`.
|
|
9
|
+
*/
|
|
10
|
+
export type MetaMaskSolanaController = MetaMaskController & {
|
|
11
|
+
/** The underlying `@metamask/connect-solana` SDK instance. */
|
|
12
|
+
sdk: SolanaClient;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=metamask.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metamask.types.d.ts","sourceRoot":"","sources":["../../src/metamask/metamask.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,MAAM,wBAAwB,GAAG,kBAAkB,GAAG;IAC1D,8DAA8D;IAC9D,GAAG,EAAE,YAAY,CAAC;CACnB,CAAC"}
|
package/dist/metamask/utils/createMetaMaskSolanaController/createMetaMaskSolanaController.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DynamicClient } from '@dynamic-labs-sdk/client';
|
|
2
|
+
import type { MetaMaskSolanaController } from '../../metamask.types';
|
|
3
|
+
/**
|
|
4
|
+
* Builds a fully-initialised `MetaMaskSolanaController` for the given Dynamic
|
|
5
|
+
* client. Drives the `@metamask/connect-solana` SDK through its Wallet
|
|
6
|
+
* Standard surface so consumers render their own QR / deep-link UI, and
|
|
7
|
+
* subscribes to the SDK core's `display_uri` event at construction time so
|
|
8
|
+
* the first URI emission cannot be lost to a subscription race. The wallet
|
|
9
|
+
* is created with `skipAutoRegister` so this URI-pairing client does not
|
|
10
|
+
* register itself into the global Wallet Standard registry — an announced
|
|
11
|
+
* MetaMask extension is discovered independently. Dapp metadata is sourced
|
|
12
|
+
* from the client's `getAppMetadata`. Browser-only.
|
|
13
|
+
*
|
|
14
|
+
* @not-instrumented
|
|
15
|
+
*/
|
|
16
|
+
export declare const createMetaMaskSolanaController: (client: DynamicClient) => Promise<MetaMaskSolanaController>;
|
|
17
|
+
//# sourceMappingURL=createMetaMaskSolanaController.d.ts.map
|
package/dist/metamask/utils/createMetaMaskSolanaController/createMetaMaskSolanaController.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createMetaMaskSolanaController.d.ts","sourceRoot":"","sources":["../../../../src/metamask/utils/createMetaMaskSolanaController/createMetaMaskSolanaController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAW9D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAGrE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,8BAA8B,WACjC,aAAa,KACpB,OAAO,CAAC,wBAAwB,CA+GlC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/metamask/utils/createMetaMaskSolanaController/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-`DynamicClient` accessor for the lazily-constructed MetaMask Solana
|
|
3
|
+
* controller. Wraps `createMetaMaskSolanaController` with the standard
|
|
4
|
+
* `runtimeServices` cache so every caller — the Wallet Standard
|
|
5
|
+
* wallet-provider builder, the `display_uri` subscription helper, and the
|
|
6
|
+
* `connectWithMetaMaskUriSolana` URI-returning helper — shares the same
|
|
7
|
+
* controller (and therefore the same SDK instance, display-URI cache, and
|
|
8
|
+
* listener registry) per Dynamic client.
|
|
9
|
+
*
|
|
10
|
+
* The cache is **per-Dynamic-client, not per-SDK-instance**:
|
|
11
|
+
* `@metamask/connect-solana`'s `createSolanaClient` builds on the shared
|
|
12
|
+
* MultichainCore singleton, so when multiple Dynamic clients coexist they
|
|
13
|
+
* end up sharing the same MetaMask session regardless of this cache. The
|
|
14
|
+
* wrapper exists to own the controller's `display_uri` cache and listener
|
|
15
|
+
* registry per Dynamic client, which the SDK itself does not expose.
|
|
16
|
+
*
|
|
17
|
+
* @not-instrumented
|
|
18
|
+
*/
|
|
19
|
+
export declare const getOrCreateMetaMaskSolanaController: (client: import("@dynamic-labs-sdk/client").DynamicClient) => Promise<import("../../metamask.types").MetaMaskSolanaController>;
|
|
20
|
+
//# sourceMappingURL=getOrCreateMetaMaskSolanaController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getOrCreateMetaMaskSolanaController.d.ts","sourceRoot":"","sources":["../../../../src/metamask/utils/getOrCreateMetaMaskSolanaController/getOrCreateMetaMaskSolanaController.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,mCAAmC,gIAG/C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/metamask/utils/getOrCreateMetaMaskSolanaController/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mCAAmC,EAAE,MAAM,uCAAuC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SolanaNetwork } from '@metamask/connect-solana';
|
|
2
|
+
/** Parameters for {@link getSolanaNetworkFromCluster}. */
|
|
3
|
+
export type GetSolanaNetworkFromClusterParams = {
|
|
4
|
+
/** The Dynamic network `cluster` (e.g. `mainnet-beta`, `devnet`, `testnet`). */
|
|
5
|
+
cluster: string | undefined;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Maps a Dynamic network `cluster` (e.g. `mainnet-beta`, `devnet`,
|
|
9
|
+
* `testnet`) to the `mainnet | devnet | testnet` key shape expected by
|
|
10
|
+
* `@metamask/connect-solana`'s `createSolanaClient`. Returns `undefined` for
|
|
11
|
+
* clusters that do not correspond to one of MetaMask's supported Solana
|
|
12
|
+
* networks so callers can skip them. Used by `getSupportedNetworks` to build
|
|
13
|
+
* the SDK's `supportedNetworks` map.
|
|
14
|
+
*
|
|
15
|
+
* @not-instrumented
|
|
16
|
+
*/
|
|
17
|
+
export declare const getSolanaNetworkFromCluster: ({ cluster, }: GetSolanaNetworkFromClusterParams) => SolanaNetwork | undefined;
|
|
18
|
+
//# sourceMappingURL=getSolanaNetworkFromCluster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSolanaNetworkFromCluster.d.ts","sourceRoot":"","sources":["../../../../src/metamask/utils/getSolanaNetworkFromCluster/getSolanaNetworkFromCluster.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,0DAA0D;AAC1D,MAAM,MAAM,iCAAiC,GAAG;IAC9C,gFAAgF;IAChF,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B,iBAErC,iCAAiC,KAAG,aAAa,GAAG,SAkBtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/metamask/utils/getSolanaNetworkFromCluster/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,YAAY,EAAE,iCAAiC,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DynamicClient } from '@dynamic-labs-sdk/client';
|
|
2
|
+
import type { SolanaNetwork } from '@metamask/connect-solana';
|
|
3
|
+
type MetaMaskSupportedNetworks = Partial<Record<SolanaNetwork, string>>;
|
|
4
|
+
/**
|
|
5
|
+
* Builds the `supportedNetworks` map required by
|
|
6
|
+
* `@metamask/connect-solana`'s `createSolanaClient`, keyed by the SDK's
|
|
7
|
+
* `mainnet | devnet | testnet` network names and valued with the first
|
|
8
|
+
* configured RPC URL for each. Sources the configured SOL networks from the
|
|
9
|
+
* Dynamic client's project settings. Throws when no SOL network is
|
|
10
|
+
* configured, mirroring the EVM `getSupportedNetworks` contract.
|
|
11
|
+
*
|
|
12
|
+
* @not-instrumented
|
|
13
|
+
*/
|
|
14
|
+
export declare const getSupportedNetworks: (client: DynamicClient) => MetaMaskSupportedNetworks;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=getSupportedNetworks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSupportedNetworks.d.ts","sourceRoot":"","sources":["../../../../src/metamask/utils/getSupportedNetworks/getSupportedNetworks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D,KAAK,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;AAExE;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,WACvB,aAAa,KACpB,yBA4BF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/metamask/utils/getSupportedNetworks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-CbDLau6x.cjs');
|
|
2
|
+
const require_solanaTransferAmount = require('./solanaTransferAmount-CoNaVFtC.cjs');
|
|
3
|
+
const require_createWalletProviderFromSolanaStandardWallet = require('./createWalletProviderFromSolanaStandardWallet-BxD2GtlU.cjs');
|
|
4
|
+
let _dynamic_labs_sdk_assert_package_version = require("@dynamic-labs-sdk/assert-package-version");
|
|
5
|
+
let _dynamic_labs_sdk_client_core = require("@dynamic-labs-sdk/client/core");
|
|
6
|
+
let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
|
|
7
|
+
let _dynamic_labs_sdk_api_core = require("@dynamic-labs/sdk-api-core");
|
|
8
|
+
let _dynamic_labs_sdk_metamask = require("@dynamic-labs-sdk/metamask");
|
|
9
|
+
let _metamask_connect_solana = require("@metamask/connect-solana");
|
|
10
|
+
|
|
11
|
+
//#region src/metamask/utils/getSolanaNetworkFromCluster/getSolanaNetworkFromCluster.ts
|
|
12
|
+
/**
|
|
13
|
+
* Maps a Dynamic network `cluster` (e.g. `mainnet-beta`, `devnet`,
|
|
14
|
+
* `testnet`) to the `mainnet | devnet | testnet` key shape expected by
|
|
15
|
+
* `@metamask/connect-solana`'s `createSolanaClient`. Returns `undefined` for
|
|
16
|
+
* clusters that do not correspond to one of MetaMask's supported Solana
|
|
17
|
+
* networks so callers can skip them. Used by `getSupportedNetworks` to build
|
|
18
|
+
* the SDK's `supportedNetworks` map.
|
|
19
|
+
*
|
|
20
|
+
* @not-instrumented
|
|
21
|
+
*/
|
|
22
|
+
const getSolanaNetworkFromCluster = ({ cluster }) => {
|
|
23
|
+
if (cluster === void 0) return;
|
|
24
|
+
if (cluster.includes("mainnet")) return "mainnet";
|
|
25
|
+
if (cluster.includes("devnet")) return "devnet";
|
|
26
|
+
if (cluster.includes("testnet")) return "testnet";
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/metamask/utils/getSupportedNetworks/getSupportedNetworks.ts
|
|
31
|
+
/**
|
|
32
|
+
* Builds the `supportedNetworks` map required by
|
|
33
|
+
* `@metamask/connect-solana`'s `createSolanaClient`, keyed by the SDK's
|
|
34
|
+
* `mainnet | devnet | testnet` network names and valued with the first
|
|
35
|
+
* configured RPC URL for each. Sources the configured SOL networks from the
|
|
36
|
+
* Dynamic client's project settings. Throws when no SOL network is
|
|
37
|
+
* configured, mirroring the EVM `getSupportedNetworks` contract.
|
|
38
|
+
*
|
|
39
|
+
* @not-instrumented
|
|
40
|
+
*/
|
|
41
|
+
const getSupportedNetworks = (client) => {
|
|
42
|
+
const solanaNetworks = (0, _dynamic_labs_sdk_client.getNetworksData)(client).filter((network) => network.chain === "SOL");
|
|
43
|
+
(0, _dynamic_labs_sdk_client_core.assertNonEmptyArray)(solanaNetworks, "No SOL networks have been configured. Make sure to add at least one Solana network to your project settings in the Dynamic Dashboard.");
|
|
44
|
+
const supportedNetworks = {};
|
|
45
|
+
for (const network of solanaNetworks) {
|
|
46
|
+
const solanaNetwork = getSolanaNetworkFromCluster({ cluster: network.cluster });
|
|
47
|
+
if (solanaNetwork !== void 0 && supportedNetworks[solanaNetwork] === void 0) supportedNetworks[solanaNetwork] = network.rpcUrls.http[0];
|
|
48
|
+
}
|
|
49
|
+
return supportedNetworks;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region src/metamask/utils/createMetaMaskSolanaController/createMetaMaskSolanaController.ts
|
|
54
|
+
/**
|
|
55
|
+
* Builds a fully-initialised `MetaMaskSolanaController` for the given Dynamic
|
|
56
|
+
* client. Drives the `@metamask/connect-solana` SDK through its Wallet
|
|
57
|
+
* Standard surface so consumers render their own QR / deep-link UI, and
|
|
58
|
+
* subscribes to the SDK core's `display_uri` event at construction time so
|
|
59
|
+
* the first URI emission cannot be lost to a subscription race. The wallet
|
|
60
|
+
* is created with `skipAutoRegister` so this URI-pairing client does not
|
|
61
|
+
* register itself into the global Wallet Standard registry — an announced
|
|
62
|
+
* MetaMask extension is discovered independently. Dapp metadata is sourced
|
|
63
|
+
* from the client's `getAppMetadata`. Browser-only.
|
|
64
|
+
*
|
|
65
|
+
* @not-instrumented
|
|
66
|
+
*/
|
|
67
|
+
const createMetaMaskSolanaController = async (client) => {
|
|
68
|
+
const supportedNetworks = getSupportedNetworks(client);
|
|
69
|
+
const { appName, appLogoUrl, appUniversalLink, appNativeLink } = (0, _dynamic_labs_sdk_client_core.getAppMetadata)(client);
|
|
70
|
+
await (0, _dynamic_labs_sdk_metamask.clearMetaMaskSessionStorage)();
|
|
71
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
72
|
+
let latestDisplayUri;
|
|
73
|
+
const sdk = await (0, _metamask_connect_solana.createSolanaClient)({
|
|
74
|
+
api: { supportedNetworks },
|
|
75
|
+
dapp: {
|
|
76
|
+
iconUrl: appLogoUrl,
|
|
77
|
+
name: appName,
|
|
78
|
+
nativeScheme: (0, _dynamic_labs_sdk_client_core.getNativeLinkScheme)({ nativeLink: appNativeLink }),
|
|
79
|
+
url: appUniversalLink ?? ""
|
|
80
|
+
},
|
|
81
|
+
debug: false,
|
|
82
|
+
skipAutoRegister: true
|
|
83
|
+
});
|
|
84
|
+
sdk.core.on("display_uri", (uri) => {
|
|
85
|
+
latestDisplayUri = uri;
|
|
86
|
+
for (const listener of listeners) listener(uri);
|
|
87
|
+
});
|
|
88
|
+
sdk.core.on("stateChanged", (status) => {
|
|
89
|
+
if (status === "connected" || status === "disconnected") latestDisplayUri = void 0;
|
|
90
|
+
});
|
|
91
|
+
latestDisplayUri = void 0;
|
|
92
|
+
const onDisplayUri = (listener) => {
|
|
93
|
+
listeners.add(listener);
|
|
94
|
+
if (latestDisplayUri !== void 0) listener(latestDisplayUri);
|
|
95
|
+
return () => {
|
|
96
|
+
listeners.delete(listener);
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
let inFlightConnect = null;
|
|
100
|
+
const connect = () => {
|
|
101
|
+
if (inFlightConnect) return inFlightConnect;
|
|
102
|
+
inFlightConnect = (async () => {
|
|
103
|
+
try {
|
|
104
|
+
if (sdk.core.status === "connecting") try {
|
|
105
|
+
await sdk.disconnect();
|
|
106
|
+
} catch (error) {
|
|
107
|
+
(0, _dynamic_labs_sdk_client_core.getCore)(client).logger.debug("[metamask] pre-connect disconnect rejected (expected when aborting a pairing the wallet never accepted)", error);
|
|
108
|
+
}
|
|
109
|
+
await require_createWalletProviderFromSolanaStandardWallet.getFeaturesForSolanaStandardWallet(sdk.getWallet())["standard:connect"].connect();
|
|
110
|
+
} finally {
|
|
111
|
+
inFlightConnect = null;
|
|
112
|
+
}
|
|
113
|
+
})();
|
|
114
|
+
return inFlightConnect;
|
|
115
|
+
};
|
|
116
|
+
return {
|
|
117
|
+
clearCachedDisplayUri: () => {
|
|
118
|
+
latestDisplayUri = void 0;
|
|
119
|
+
},
|
|
120
|
+
connect,
|
|
121
|
+
getLatestDisplayUri: () => latestDisplayUri,
|
|
122
|
+
onDisplayUri,
|
|
123
|
+
sdk
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
//#endregion
|
|
128
|
+
//#region src/metamask/utils/getOrCreateMetaMaskSolanaController/getOrCreateMetaMaskSolanaController.ts
|
|
129
|
+
const RUNTIME_SERVICE_KEY = "metaMaskSolanaController";
|
|
130
|
+
/**
|
|
131
|
+
* Per-`DynamicClient` accessor for the lazily-constructed MetaMask Solana
|
|
132
|
+
* controller. Wraps `createMetaMaskSolanaController` with the standard
|
|
133
|
+
* `runtimeServices` cache so every caller — the Wallet Standard
|
|
134
|
+
* wallet-provider builder, the `display_uri` subscription helper, and the
|
|
135
|
+
* `connectWithMetaMaskUriSolana` URI-returning helper — shares the same
|
|
136
|
+
* controller (and therefore the same SDK instance, display-URI cache, and
|
|
137
|
+
* listener registry) per Dynamic client.
|
|
138
|
+
*
|
|
139
|
+
* The cache is **per-Dynamic-client, not per-SDK-instance**:
|
|
140
|
+
* `@metamask/connect-solana`'s `createSolanaClient` builds on the shared
|
|
141
|
+
* MultichainCore singleton, so when multiple Dynamic clients coexist they
|
|
142
|
+
* end up sharing the same MetaMask session regardless of this cache. The
|
|
143
|
+
* wrapper exists to own the controller's `display_uri` cache and listener
|
|
144
|
+
* registry per Dynamic client, which the SDK itself does not expose.
|
|
145
|
+
*
|
|
146
|
+
* @not-instrumented
|
|
147
|
+
*/
|
|
148
|
+
const getOrCreateMetaMaskSolanaController = (0, _dynamic_labs_sdk_client_core.createRuntimeServiceAccessKey)(RUNTIME_SERVICE_KEY, (client) => createMetaMaskSolanaController(client));
|
|
149
|
+
|
|
150
|
+
//#endregion
|
|
151
|
+
//#region src/metamask/createMetaMaskSolanaWalletProvider/createMetaMaskSolanaWalletProvider.ts
|
|
152
|
+
/**
|
|
153
|
+
* Builds the `SolanaWalletProvider` registered AFTER a successful MetaMask
|
|
154
|
+
* SDK URI pairing. Wraps the paired Wallet Standard wallet exposed by
|
|
155
|
+
* `@metamask/connect-solana` behind the Dynamic Solana provider facade and
|
|
156
|
+
* classifies it as `QrCode` so its key does not collide with an announced
|
|
157
|
+
* MetaMask browser-extension provider for the same wallet name. Drops
|
|
158
|
+
* `connect` so the provider is filtered out of the wallet picker by
|
|
159
|
+
* `getAvailableWalletProvidersData` — mirroring how WalletConnect URI
|
|
160
|
+
* sessions register a signing-only provider.
|
|
161
|
+
*
|
|
162
|
+
* @not-instrumented
|
|
163
|
+
*/
|
|
164
|
+
const createMetaMaskSolanaWalletProvider = async (client) => {
|
|
165
|
+
const walletStandardWallet = (await getOrCreateMetaMaskSolanaController(client)).sdk.getWallet();
|
|
166
|
+
if (walletStandardWallet.accounts.length === 0) throw new _dynamic_labs_sdk_metamask.MetaMaskWalletNotConnectedError();
|
|
167
|
+
return {
|
|
168
|
+
...require_createWalletProviderFromSolanaStandardWallet.createWalletProviderFromSolanaStandardWallet({
|
|
169
|
+
dynamicClient: client,
|
|
170
|
+
walletProviderType: _dynamic_labs_sdk_api_core.WalletProviderEnum.QrCode,
|
|
171
|
+
walletStandardWallet
|
|
172
|
+
}),
|
|
173
|
+
connect: void 0
|
|
174
|
+
};
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
//#endregion
|
|
178
|
+
//#region src/metamask/connectWithMetaMaskUriSolana/connectWithMetaMaskUriSolana.ts
|
|
179
|
+
/**
|
|
180
|
+
* Drives a MetaMask SDK URI pairing for Solana and returns `{ approval, uri }`
|
|
181
|
+
* so consumers can render the QR / hand the URI to a deeplink. The resulting
|
|
182
|
+
* wallet provider registers for signing only and is never surfaced in the
|
|
183
|
+
* wallet picker. When the MetaMask extension is announced via Wallet Standard,
|
|
184
|
+
* prefer routing through `getMetaMaskSolanaExtensionWalletProviderKey` instead.
|
|
185
|
+
*
|
|
186
|
+
* @not-instrumented
|
|
187
|
+
*/
|
|
188
|
+
const connectWithMetaMaskUriSolana = ({ addToDynamicWalletAccounts = true } = {}, client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => {
|
|
189
|
+
require_solanaTransferAmount.registerSolanaNetworkProviderBuilder(client);
|
|
190
|
+
return (0, _dynamic_labs_sdk_metamask.connectWithMetaMaskUri)({
|
|
191
|
+
addToDynamicWalletAccounts,
|
|
192
|
+
chain: "SOL",
|
|
193
|
+
getController: getOrCreateMetaMaskSolanaController,
|
|
194
|
+
walletProviderBuilder: createMetaMaskSolanaWalletProvider
|
|
195
|
+
}, client);
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
//#endregion
|
|
199
|
+
//#region src/metamask/connectAndVerifyWithMetaMaskUriSolana/connectAndVerifyWithMetaMaskUriSolana.ts
|
|
200
|
+
/**
|
|
201
|
+
* Drives a MetaMask SDK URI pairing for Solana and verifies ownership of the
|
|
202
|
+
* paired wallet account through message signing, returning `{ approval, uri }`
|
|
203
|
+
* so consumers can render the QR / hand the URI to a deeplink.
|
|
204
|
+
*
|
|
205
|
+
* Builds on `connectWithMetaMaskUriSolana` (rather than the chain-agnostic
|
|
206
|
+
* connector directly) so the Solana-specific wiring stays defined in one
|
|
207
|
+
* place, then wraps its `approval` to add the verification round-trip. The
|
|
208
|
+
* pairing is driven with `addToDynamicWalletAccounts: false` so the account
|
|
209
|
+
* lands as a verified credential instead of an unverified entry.
|
|
210
|
+
*
|
|
211
|
+
* The MetaMask SDK does not expose a single-round-trip authenticate
|
|
212
|
+
* primitive, so this drives two sequential interactions on the wallet side:
|
|
213
|
+
* the user first approves the pairing, then approves a sign-in message.
|
|
214
|
+
*
|
|
215
|
+
* @not-instrumented
|
|
216
|
+
*/
|
|
217
|
+
const connectAndVerifyWithMetaMaskUriSolana = async (client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => {
|
|
218
|
+
const { approval, uri } = await connectWithMetaMaskUriSolana({ addToDynamicWalletAccounts: false }, client);
|
|
219
|
+
const verifiedApproval = async () => {
|
|
220
|
+
const { walletAccounts } = await approval();
|
|
221
|
+
const [walletAccount] = walletAccounts;
|
|
222
|
+
if (walletAccount) await (0, _dynamic_labs_sdk_client.verifyWalletAccount)({ walletAccount }, client);
|
|
223
|
+
return { walletAccounts };
|
|
224
|
+
};
|
|
225
|
+
return {
|
|
226
|
+
approval: verifiedApproval,
|
|
227
|
+
uri
|
|
228
|
+
};
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
//#endregion
|
|
232
|
+
//#region src/metamask/getMetaMaskSolanaExtensionWalletProviderKey/getMetaMaskSolanaExtensionWalletProviderKey.ts
|
|
233
|
+
/**
|
|
234
|
+
* Returns the wallet provider key of the MetaMask browser extension announced
|
|
235
|
+
* for Solana via Wallet Standard, or `undefined` when none is announced. Pass
|
|
236
|
+
* the returned key to `connectWithWalletProvider` to route through the
|
|
237
|
+
* announced provider; fall back to `connectWithMetaMaskUriSolana` when
|
|
238
|
+
* `undefined`.
|
|
239
|
+
*
|
|
240
|
+
* @not-instrumented
|
|
241
|
+
*/
|
|
242
|
+
const getMetaMaskSolanaExtensionWalletProviderKey = (client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => (0, _dynamic_labs_sdk_metamask.getMetaMaskExtensionWalletProviderKey)({ chain: "SOL" }, client);
|
|
243
|
+
|
|
244
|
+
//#endregion
|
|
245
|
+
//#region src/exports/metamask.ts
|
|
246
|
+
(0, _dynamic_labs_sdk_assert_package_version.assertPackageVersion)(require_solanaTransferAmount.name, require_solanaTransferAmount.version);
|
|
247
|
+
|
|
248
|
+
//#endregion
|
|
249
|
+
Object.defineProperty(exports, 'MetaMaskDisplayUriMissingError', {
|
|
250
|
+
enumerable: true,
|
|
251
|
+
get: function () {
|
|
252
|
+
return _dynamic_labs_sdk_metamask.MetaMaskDisplayUriMissingError;
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
exports.connectAndVerifyWithMetaMaskUriSolana = connectAndVerifyWithMetaMaskUriSolana;
|
|
256
|
+
exports.connectWithMetaMaskUriSolana = connectWithMetaMaskUriSolana;
|
|
257
|
+
exports.getMetaMaskSolanaExtensionWalletProviderKey = getMetaMaskSolanaExtensionWalletProviderKey;
|
|
258
|
+
//# sourceMappingURL=metamask.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metamask.cjs","names":["supportedNetworks: MetaMaskSupportedNetworks","latestDisplayUri: string | undefined","inFlightConnect: Promise<void> | null","getFeaturesForSolanaStandardWallet","MetaMaskWalletNotConnectedError","createWalletProviderFromSolanaStandardWallet","WalletProviderEnum","packageName","packageVersion"],"sources":["../src/metamask/utils/getSolanaNetworkFromCluster/getSolanaNetworkFromCluster.ts","../src/metamask/utils/getSupportedNetworks/getSupportedNetworks.ts","../src/metamask/utils/createMetaMaskSolanaController/createMetaMaskSolanaController.ts","../src/metamask/utils/getOrCreateMetaMaskSolanaController/getOrCreateMetaMaskSolanaController.ts","../src/metamask/createMetaMaskSolanaWalletProvider/createMetaMaskSolanaWalletProvider.ts","../src/metamask/connectWithMetaMaskUriSolana/connectWithMetaMaskUriSolana.ts","../src/metamask/connectAndVerifyWithMetaMaskUriSolana/connectAndVerifyWithMetaMaskUriSolana.ts","../src/metamask/getMetaMaskSolanaExtensionWalletProviderKey/getMetaMaskSolanaExtensionWalletProviderKey.ts","../src/exports/metamask.ts"],"sourcesContent":["import type { SolanaNetwork } from '@metamask/connect-solana';\n\n/** Parameters for {@link getSolanaNetworkFromCluster}. */\nexport type GetSolanaNetworkFromClusterParams = {\n /** The Dynamic network `cluster` (e.g. `mainnet-beta`, `devnet`, `testnet`). */\n cluster: string | undefined;\n};\n\n/**\n * Maps a Dynamic network `cluster` (e.g. `mainnet-beta`, `devnet`,\n * `testnet`) to the `mainnet | devnet | testnet` key shape expected by\n * `@metamask/connect-solana`'s `createSolanaClient`. Returns `undefined` for\n * clusters that do not correspond to one of MetaMask's supported Solana\n * networks so callers can skip them. Used by `getSupportedNetworks` to build\n * the SDK's `supportedNetworks` map.\n *\n * @not-instrumented\n */\nexport const getSolanaNetworkFromCluster = ({\n cluster,\n}: GetSolanaNetworkFromClusterParams): SolanaNetwork | undefined => {\n if (cluster === undefined) {\n return undefined;\n }\n\n if (cluster.includes('mainnet')) {\n return 'mainnet';\n }\n\n if (cluster.includes('devnet')) {\n return 'devnet';\n }\n\n if (cluster.includes('testnet')) {\n return 'testnet';\n }\n\n return undefined;\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getNetworksData } from '@dynamic-labs-sdk/client';\nimport { assertNonEmptyArray } from '@dynamic-labs-sdk/client/core';\nimport type { SolanaNetwork } from '@metamask/connect-solana';\n\nimport { getSolanaNetworkFromCluster } from '../getSolanaNetworkFromCluster';\n\ntype MetaMaskSupportedNetworks = Partial<Record<SolanaNetwork, string>>;\n\n/**\n * Builds the `supportedNetworks` map required by\n * `@metamask/connect-solana`'s `createSolanaClient`, keyed by the SDK's\n * `mainnet | devnet | testnet` network names and valued with the first\n * configured RPC URL for each. Sources the configured SOL networks from the\n * Dynamic client's project settings. Throws when no SOL network is\n * configured, mirroring the EVM `getSupportedNetworks` contract.\n *\n * @not-instrumented\n */\nexport const getSupportedNetworks = (\n client: DynamicClient\n): MetaMaskSupportedNetworks => {\n const solanaNetworks = getNetworksData(client).filter(\n (network) => network.chain === 'SOL'\n );\n\n assertNonEmptyArray(\n solanaNetworks,\n 'No SOL networks have been configured. Make sure to add at least one Solana network to your project settings in the Dynamic Dashboard.'\n );\n\n const supportedNetworks: MetaMaskSupportedNetworks = {};\n\n for (const network of solanaNetworks) {\n const solanaNetwork = getSolanaNetworkFromCluster({\n cluster: network.cluster,\n });\n\n // Skip clusters MetaMask does not recognise, and keep the first RPC URL\n // seen for a given network so earlier-configured networks take priority.\n if (\n solanaNetwork !== undefined &&\n supportedNetworks[solanaNetwork] === undefined\n ) {\n supportedNetworks[solanaNetwork] = network.rpcUrls.http[0];\n }\n }\n\n return supportedNetworks;\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n getAppMetadata,\n getCore,\n getNativeLinkScheme,\n} from '@dynamic-labs-sdk/client/core';\nimport { clearMetaMaskSessionStorage } from '@dynamic-labs-sdk/metamask';\nimport type { DisplayUriListener } from '@dynamic-labs-sdk/metamask';\nimport { createSolanaClient } from '@metamask/connect-solana';\n\nimport { getFeaturesForSolanaStandardWallet } from '../../../walletStandard/utils/getFeaturesForSolanaStandardWallet';\nimport type { MetaMaskSolanaController } from '../../metamask.types';\nimport { getSupportedNetworks } from '../getSupportedNetworks';\n\n/**\n * Builds a fully-initialised `MetaMaskSolanaController` for the given Dynamic\n * client. Drives the `@metamask/connect-solana` SDK through its Wallet\n * Standard surface so consumers render their own QR / deep-link UI, and\n * subscribes to the SDK core's `display_uri` event at construction time so\n * the first URI emission cannot be lost to a subscription race. The wallet\n * is created with `skipAutoRegister` so this URI-pairing client does not\n * register itself into the global Wallet Standard registry — an announced\n * MetaMask extension is discovered independently. Dapp metadata is sourced\n * from the client's `getAppMetadata`. Browser-only.\n *\n * @not-instrumented\n */\nexport const createMetaMaskSolanaController = async (\n client: DynamicClient\n): Promise<MetaMaskSolanaController> => {\n const supportedNetworks = getSupportedNetworks(client);\n const { appName, appLogoUrl, appUniversalLink, appNativeLink } =\n getAppMetadata(client);\n\n // Drop any IndexedDB session state left behind by a previous tab, page\n // reload, or abandoned pairing before the SDK initialises. The SDK's\n // auto-recovery path otherwise picks up a stale transport descriptor and\n // spends its (non-configurable) 10-second resume timeout on every\n // controller construction trying to revive a relay session that no longer\n // exists, surfacing as a long QR skeleton delay on every page reload that\n // follows an abandoned pairing.\n await clearMetaMaskSessionStorage();\n\n const listeners = new Set<DisplayUriListener>();\n let latestDisplayUri: string | undefined;\n\n const sdk = await createSolanaClient({\n api: { supportedNetworks },\n dapp: {\n iconUrl: appLogoUrl,\n name: appName,\n nativeScheme: getNativeLinkScheme({ nativeLink: appNativeLink }),\n url: appUniversalLink ?? '',\n },\n debug: false,\n skipAutoRegister: true,\n });\n\n sdk.core.on('display_uri', (uri) => {\n latestDisplayUri = uri;\n for (const listener of listeners) {\n listener(uri);\n }\n });\n\n // A terminal connection state means any cached URI is for a pairing that is\n // either complete or torn down, so it must not be replayed to late\n // subscribers.\n sdk.core.on('stateChanged', (status) => {\n if (status === 'connected' || status === 'disconnected') {\n latestDisplayUri = undefined;\n }\n });\n\n // Defensive cleanup: even though we cleared IndexedDB before constructing\n // the SDK, an in-flight `display_uri` emission could theoretically race the\n // storage delete on slow devices. Clearing the cache here guarantees late\n // subscribers cannot replay an URI that originated from any pairing attempt\n // prior to this construction.\n latestDisplayUri = undefined;\n\n const onDisplayUri = (listener: DisplayUriListener): (() => void) => {\n listeners.add(listener);\n if (latestDisplayUri !== undefined) {\n listener(latestDisplayUri);\n }\n return () => {\n listeners.delete(listener);\n };\n };\n\n // Tracks an in-flight `connect` call so that overlapping invocations (most\n // commonly React's StrictMode double-invocation of effects, or a hook that\n // re-runs while the user is still scanning) await the same underlying\n // pairing instead of racing two connect calls against each other.\n let inFlightConnect: Promise<void> | null = null;\n\n const connect = (): Promise<void> => {\n if (inFlightConnect) {\n return inFlightConnect;\n }\n\n inFlightConnect = (async () => {\n try {\n // If a previous pairing was cancelled mid-flight the SDK can be left\n // in `connecting` state with a dead transport descriptor; tear it\n // down so the next connect issues a fresh URI synchronously instead\n // of waiting for the SDK's (non-configurable) 10-second resume\n // timeout.\n if (sdk.core.status === 'connecting') {\n try {\n await sdk.disconnect();\n } catch (error) {\n getCore(client).logger.debug(\n '[metamask] pre-connect disconnect rejected (expected when aborting a pairing the wallet never accepted)',\n error\n );\n }\n }\n\n const features = getFeaturesForSolanaStandardWallet(sdk.getWallet());\n\n await features['standard:connect'].connect();\n } finally {\n inFlightConnect = null;\n }\n })();\n\n return inFlightConnect;\n };\n\n return {\n clearCachedDisplayUri: () => {\n latestDisplayUri = undefined;\n },\n connect,\n getLatestDisplayUri: () => latestDisplayUri,\n onDisplayUri,\n sdk,\n };\n};\n","import { createRuntimeServiceAccessKey } from '@dynamic-labs-sdk/client/core';\n\nimport { createMetaMaskSolanaController } from '../createMetaMaskSolanaController';\n\nconst RUNTIME_SERVICE_KEY = 'metaMaskSolanaController';\n\n/**\n * Per-`DynamicClient` accessor for the lazily-constructed MetaMask Solana\n * controller. Wraps `createMetaMaskSolanaController` with the standard\n * `runtimeServices` cache so every caller — the Wallet Standard\n * wallet-provider builder, the `display_uri` subscription helper, and the\n * `connectWithMetaMaskUriSolana` URI-returning helper — shares the same\n * controller (and therefore the same SDK instance, display-URI cache, and\n * listener registry) per Dynamic client.\n *\n * The cache is **per-Dynamic-client, not per-SDK-instance**:\n * `@metamask/connect-solana`'s `createSolanaClient` builds on the shared\n * MultichainCore singleton, so when multiple Dynamic clients coexist they\n * end up sharing the same MetaMask session regardless of this cache. The\n * wrapper exists to own the controller's `display_uri` cache and listener\n * registry per Dynamic client, which the SDK itself does not expose.\n *\n * @not-instrumented\n */\nexport const getOrCreateMetaMaskSolanaController = createRuntimeServiceAccessKey(\n RUNTIME_SERVICE_KEY,\n (client) => createMetaMaskSolanaController(client)\n);\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { MetaMaskWalletNotConnectedError } from '@dynamic-labs-sdk/metamask';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\n\nimport type { SolanaWalletProvider } from '../../SolanaWalletProvider.types';\nimport { createWalletProviderFromSolanaStandardWallet } from '../../walletStandard/utils/createWalletProviderFromSolanaStandardWallet';\nimport { getOrCreateMetaMaskSolanaController } from '../utils/getOrCreateMetaMaskSolanaController';\n\n/**\n * Builds the `SolanaWalletProvider` registered AFTER a successful MetaMask\n * SDK URI pairing. Wraps the paired Wallet Standard wallet exposed by\n * `@metamask/connect-solana` behind the Dynamic Solana provider facade and\n * classifies it as `QrCode` so its key does not collide with an announced\n * MetaMask browser-extension provider for the same wallet name. Drops\n * `connect` so the provider is filtered out of the wallet picker by\n * `getAvailableWalletProvidersData` — mirroring how WalletConnect URI\n * sessions register a signing-only provider.\n *\n * @not-instrumented\n */\nexport const createMetaMaskSolanaWalletProvider = async (\n client: DynamicClient\n): Promise<SolanaWalletProvider> => {\n const controller = await getOrCreateMetaMaskSolanaController(client);\n\n const walletStandardWallet = controller.sdk.getWallet();\n\n // The provider is only meaningful once the URI pairing has produced a\n // connected account; guard so a premature or out-of-order call raises a\n // readable error instead of building a provider around an empty wallet.\n if (walletStandardWallet.accounts.length === 0) {\n throw new MetaMaskWalletNotConnectedError();\n }\n\n const walletProvider = createWalletProviderFromSolanaStandardWallet({\n dynamicClient: client,\n walletProviderType: WalletProviderEnum.QrCode,\n walletStandardWallet,\n });\n\n return {\n ...walletProvider,\n connect: undefined,\n };\n};\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport type { WalletProviderUriConnectionResult } from '@dynamic-labs-sdk/client';\nimport { connectWithMetaMaskUri } from '@dynamic-labs-sdk/metamask';\n\nimport { registerSolanaNetworkProviderBuilder } from '../../registerSolanaNetworkProviderBuilder';\nimport { createMetaMaskSolanaWalletProvider } from '../createMetaMaskSolanaWalletProvider';\nimport { getOrCreateMetaMaskSolanaController } from '../utils/getOrCreateMetaMaskSolanaController';\n\nexport type ConnectWithMetaMaskUriSolanaParams = {\n /** Whether to add the connected wallet account to the Dynamic client. Defaults to `true`. */\n addToDynamicWalletAccounts?: boolean;\n};\n\n/**\n * Drives a MetaMask SDK URI pairing for Solana and returns `{ approval, uri }`\n * so consumers can render the QR / hand the URI to a deeplink. The resulting\n * wallet provider registers for signing only and is never surfaced in the\n * wallet picker. When the MetaMask extension is announced via Wallet Standard,\n * prefer routing through `getMetaMaskSolanaExtensionWalletProviderKey` instead.\n *\n * @not-instrumented\n */\nexport const connectWithMetaMaskUriSolana = (\n { addToDynamicWalletAccounts = true }: ConnectWithMetaMaskUriSolanaParams = {},\n client = getDefaultClient()\n): Promise<WalletProviderUriConnectionResult> => {\n registerSolanaNetworkProviderBuilder(client);\n\n return connectWithMetaMaskUri(\n {\n addToDynamicWalletAccounts,\n chain: 'SOL',\n getController: getOrCreateMetaMaskSolanaController,\n walletProviderBuilder: createMetaMaskSolanaWalletProvider,\n },\n client\n );\n};\n","import {\n type WalletAccount,\n type WalletProviderUriConnectionResult,\n getDefaultClient,\n verifyWalletAccount,\n} from '@dynamic-labs-sdk/client';\n\nimport { connectWithMetaMaskUriSolana } from '../connectWithMetaMaskUriSolana';\n\n/**\n * Drives a MetaMask SDK URI pairing for Solana and verifies ownership of the\n * paired wallet account through message signing, returning `{ approval, uri }`\n * so consumers can render the QR / hand the URI to a deeplink.\n *\n * Builds on `connectWithMetaMaskUriSolana` (rather than the chain-agnostic\n * connector directly) so the Solana-specific wiring stays defined in one\n * place, then wraps its `approval` to add the verification round-trip. The\n * pairing is driven with `addToDynamicWalletAccounts: false` so the account\n * lands as a verified credential instead of an unverified entry.\n *\n * The MetaMask SDK does not expose a single-round-trip authenticate\n * primitive, so this drives two sequential interactions on the wallet side:\n * the user first approves the pairing, then approves a sign-in message.\n *\n * @not-instrumented\n */\nexport const connectAndVerifyWithMetaMaskUriSolana = async (\n client = getDefaultClient()\n): Promise<WalletProviderUriConnectionResult> => {\n const { approval, uri } = await connectWithMetaMaskUriSolana(\n { addToDynamicWalletAccounts: false },\n client\n );\n\n const verifiedApproval = async (): Promise<{\n walletAccounts: WalletAccount[];\n }> => {\n const { walletAccounts } = await approval();\n\n // MetaMask SDK exposes a single active address per pairing, mirroring how\n // the underlying connect helper materializes a single account from\n // `addresses[0]`. Verify it directly.\n const [walletAccount] = walletAccounts;\n\n if (walletAccount) {\n await verifyWalletAccount({ walletAccount }, client);\n }\n\n return { walletAccounts };\n };\n\n return { approval: verifiedApproval, uri };\n};\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { getMetaMaskExtensionWalletProviderKey } from '@dynamic-labs-sdk/metamask';\n\n/**\n * Returns the wallet provider key of the MetaMask browser extension announced\n * for Solana via Wallet Standard, or `undefined` when none is announced. Pass\n * the returned key to `connectWithWalletProvider` to route through the\n * announced provider; fall back to `connectWithMetaMaskUriSolana` when\n * `undefined`.\n *\n * @not-instrumented\n */\nexport const getMetaMaskSolanaExtensionWalletProviderKey = (\n client = getDefaultClient()\n): string | undefined =>\n getMetaMaskExtensionWalletProviderKey({ chain: 'SOL' }, client);\n","import { assertPackageVersion } from '@dynamic-labs-sdk/assert-package-version';\n\nimport {\n name as packageName,\n version as packageVersion,\n} from '../../package.json';\nassertPackageVersion(packageName, packageVersion);\n\nexport { connectAndVerifyWithMetaMaskUriSolana } from '../metamask/connectAndVerifyWithMetaMaskUriSolana';\nexport { connectWithMetaMaskUriSolana } from '../metamask/connectWithMetaMaskUriSolana';\nexport type { ConnectWithMetaMaskUriSolanaParams } from '../metamask/connectWithMetaMaskUriSolana/connectWithMetaMaskUriSolana';\nexport { getMetaMaskSolanaExtensionWalletProviderKey } from '../metamask/getMetaMaskSolanaExtensionWalletProviderKey';\nexport { MetaMaskDisplayUriMissingError } from '@dynamic-labs-sdk/metamask';\n"],"mappings":"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"}
|