@dynamic-labs-sdk/solana 0.26.10 → 0.27.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.
Files changed (31) hide show
  1. package/dist/{addSolanaWalletStandardExtension-X8e2MusO.cjs → addSolanaWalletStandardExtension-DBe7a3S_.cjs} +9 -5
  2. package/dist/addSolanaWalletStandardExtension-DBe7a3S_.cjs.map +1 -0
  3. package/dist/{addSolanaWalletStandardExtension-BGRoCMAL.esm.js → addSolanaWalletStandardExtension-XbXWMTqr.esm.js} +10 -6
  4. package/dist/addSolanaWalletStandardExtension-XbXWMTqr.esm.js.map +1 -0
  5. package/dist/{addWaasSolanaExtension-DXeRyYbO.cjs → addWaasSolanaExtension-B3-lmKhJ.cjs} +2 -2
  6. package/dist/{addWaasSolanaExtension-DXeRyYbO.cjs.map → addWaasSolanaExtension-B3-lmKhJ.cjs.map} +1 -1
  7. package/dist/{addWaasSolanaExtension-CnTT1x1S.esm.js → addWaasSolanaExtension-C7zbpz3e.esm.js} +2 -2
  8. package/dist/{addWaasSolanaExtension-CnTT1x1S.esm.js.map → addWaasSolanaExtension-C7zbpz3e.esm.js.map} +1 -1
  9. package/dist/index.cjs +46 -42
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.esm.js +46 -42
  12. package/dist/index.esm.js.map +1 -1
  13. package/dist/phantomRedirect/createPhantomRedirectWalletProvider/createPhantomRedirectWalletProvider.d.ts.map +1 -1
  14. package/dist/{solanaTransferAmount-CiEQTFW3.esm.js → solanaTransferAmount-D3T1LAPQ.esm.js} +2 -2
  15. package/dist/{solanaTransferAmount-CiEQTFW3.esm.js.map → solanaTransferAmount-D3T1LAPQ.esm.js.map} +1 -1
  16. package/dist/{solanaTransferAmount-CZjIlZKZ.cjs → solanaTransferAmount-DkQcGiN_.cjs} +2 -2
  17. package/dist/{solanaTransferAmount-CZjIlZKZ.cjs.map → solanaTransferAmount-DkQcGiN_.cjs.map} +1 -1
  18. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  19. package/dist/waas.cjs +2 -2
  20. package/dist/waas.esm.js +2 -2
  21. package/dist/walletConnect/createWalletProviderFromWalletConnectSolanaSession/createWalletProviderFromWalletConnectSolanaSession.d.ts.map +1 -1
  22. package/dist/walletConnect.cjs +16 -13
  23. package/dist/walletConnect.cjs.map +1 -1
  24. package/dist/walletConnect.esm.js +17 -14
  25. package/dist/walletConnect.esm.js.map +1 -1
  26. package/dist/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/createWalletProviderFromSolanaStandardWallet.d.ts.map +1 -1
  27. package/dist/walletStandard.cjs +2 -2
  28. package/dist/walletStandard.esm.js +2 -2
  29. package/package.json +6 -6
  30. package/dist/addSolanaWalletStandardExtension-BGRoCMAL.esm.js.map +0 -1
  31. package/dist/addSolanaWalletStandardExtension-X8e2MusO.cjs.map +0 -1
package/dist/waas.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  const require_chunk = require('./chunk-CbDLau6x.cjs');
2
- const require_solanaTransferAmount = require('./solanaTransferAmount-CZjIlZKZ.cjs');
3
- const require_addWaasSolanaExtension = require('./addWaasSolanaExtension-DXeRyYbO.cjs');
2
+ const require_solanaTransferAmount = require('./solanaTransferAmount-DkQcGiN_.cjs');
3
+ const require_addWaasSolanaExtension = require('./addWaasSolanaExtension-B3-lmKhJ.cjs');
4
4
  let _dynamic_labs_sdk_assert_package_version = require("@dynamic-labs-sdk/assert-package-version");
5
5
 
6
6
  //#region src/exports/waas.ts
package/dist/waas.esm.js CHANGED
@@ -1,5 +1,5 @@
1
- import { d as name, f as version } from "./solanaTransferAmount-CiEQTFW3.esm.js";
2
- import { t as addWaasSolanaExtension } from "./addWaasSolanaExtension-CnTT1x1S.esm.js";
1
+ import { d as name, f as version } from "./solanaTransferAmount-D3T1LAPQ.esm.js";
2
+ import { t as addWaasSolanaExtension } from "./addWaasSolanaExtension-C7zbpz3e.esm.js";
3
3
  import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
4
4
 
5
5
  //#region src/exports/waas.ts
@@ -1 +1 @@
1
- {"version":3,"file":"createWalletProviderFromWalletConnectSolanaSession.d.ts","sourceRoot":"","sources":["../../../src/walletConnect/createWalletProviderFromWalletConnectSolanaSession/createWalletProviderFromWalletConnectSolanaSession.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,0BAA0B,CAAC;AA6BlC,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,4CAA4C,CAAC;AAOpG,KAAK,wDAAwD,GAAG;IAC9D,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAaF,wBAAwB;AACxB,eAAO,MAAM,kDAAkD,qBAC3C,wDAAwD,UAClE,aAAa,KACpB,OAAO,CAAC,iCAAiC,CAiS3C,CAAC"}
1
+ {"version":3,"file":"createWalletProviderFromWalletConnectSolanaSession.d.ts","sourceRoot":"","sources":["../../../src/walletConnect/createWalletProviderFromWalletConnectSolanaSession/createWalletProviderFromWalletConnectSolanaSession.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,0BAA0B,CAAC;AA8BlC,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,4CAA4C,CAAC;AAOpG,KAAK,wDAAwD,GAAG;IAC9D,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAaF,wBAAwB;AACxB,eAAO,MAAM,kDAAkD,qBAC3C,wDAAwD,UAClE,aAAa,KACpB,OAAO,CAAC,iCAAiC,CAuS3C,CAAC"}
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require('./chunk-CbDLau6x.cjs');
2
- const require_solanaTransferAmount = require('./solanaTransferAmount-CZjIlZKZ.cjs');
2
+ const require_solanaTransferAmount = require('./solanaTransferAmount-DkQcGiN_.cjs');
3
3
  const require_assertBufferAvailable = require('./assertBufferAvailable-D8lcGtyy.cjs');
4
4
  let _dynamic_labs_sdk_assert_package_version = require("@dynamic-labs-sdk/assert-package-version");
5
5
  let _dynamic_labs_sdk_client_core = require("@dynamic-labs-sdk/client/core");
@@ -29,7 +29,7 @@ const createWalletProviderFromWalletConnectSolanaSession = async ({ sessionTopic
29
29
  const getSession = () => {
30
30
  const session = signClient.session.get(sessionTopic);
31
31
  if (!session) {
32
- disconnect();
32
+ destroy().catch(() => void 0);
33
33
  throw new _dynamic_labs_sdk_wallet_connect.SessionClosedUnexpectedlyError({
34
34
  sessionTopic,
35
35
  walletDisplayName: displayName
@@ -61,17 +61,10 @@ const createWalletProviderFromWalletConnectSolanaSession = async ({ sessionTopic
61
61
  walletProviderKey: key
62
62
  });
63
63
  };
64
- const disconnect = async () => {
65
- await signClient.disconnect({
66
- reason: _walletconnect_utils.SDK_ERRORS.USER_DISCONNECTED,
67
- topic: sessionTopic
68
- });
69
- (0, _dynamic_labs_sdk_client_core.getWalletProviderRegistry)(client).unregister(key);
70
- };
71
64
  /**
72
65
  * We actually clear up the entire WC session and its wallet provider
73
66
  */
74
- const disconnectWalletAccount = async () => disconnect();
67
+ const disconnectWalletAccount = async () => destroy();
75
68
  /**
76
69
  * Helper function to make WalletConnect requests
77
70
  */
@@ -124,7 +117,18 @@ const createWalletProviderFromWalletConnectSolanaSession = async ({ sessionTopic
124
117
  sessionTopic,
125
118
  signClient
126
119
  });
127
- const terminate = async () => cleanupEventEmitter();
120
+ const destroy = async () => {
121
+ cleanupEventEmitter();
122
+ try {
123
+ await signClient.disconnect({
124
+ reason: _walletconnect_utils.SDK_ERRORS.USER_DISCONNECTED,
125
+ topic: sessionTopic
126
+ });
127
+ (0, _dynamic_labs_sdk_client_core.getWalletProviderRegistry)(client).unregister(key);
128
+ } catch (err) {
129
+ (0, _dynamic_labs_sdk_client_core.getCore)(client).logger.error(`[${key}] destroy: remote signal failed`, err);
130
+ }
131
+ };
128
132
  const signTransaction = async ({ transaction, walletAccount }) => {
129
133
  (0, _dynamic_labs_sdk_client_core.assertDefined)(walletAccount, "Wallet account is required");
130
134
  const { transaction: signedTransaction } = await makeRequest({
@@ -159,7 +163,7 @@ const createWalletProviderFromWalletConnectSolanaSession = async ({ sessionTopic
159
163
  return {
160
164
  chain: "SOL",
161
165
  confirmTransaction: (args) => require_solanaTransferAmount.solanaConfirmTransaction(args, client),
162
- disconnect,
166
+ destroy,
163
167
  disconnectWalletAccount,
164
168
  get events() {
165
169
  return getEventEmitter();
@@ -180,7 +184,6 @@ const createWalletProviderFromWalletConnectSolanaSession = async ({ sessionTopic
180
184
  signMessage,
181
185
  signTransaction,
182
186
  switchActiveNetwork,
183
- terminate,
184
187
  transferAmount: (args) => require_solanaTransferAmount.solanaTransferAmount(args, client),
185
188
  walletProviderType
186
189
  };
@@ -1 +1 @@
1
- {"version":3,"file":"walletConnect.cjs","names":["methodsThatRequireUserAction: string[]","SessionClosedUnexpectedlyError","WalletProviderEnum","getActiveNetworkId: WalletConnectSolanaWalletProvider['getActiveNetworkId']","switchActiveNetwork: WalletConnectSolanaWalletProvider['switchActiveNetwork']","disconnect: NonNullable<\n WalletConnectSolanaWalletProvider['disconnect']\n >","SDK_ERRORS","disconnectWalletAccount: WalletConnectSolanaWalletProvider['disconnectWalletAccount']","signMessage: WalletConnectSolanaWalletProvider['signMessage']","PublicKey","getConnectedAddresses: WalletConnectSolanaWalletProvider['getConnectedAddresses']","terminate: WalletConnectSolanaWalletProvider['terminate']","signTransaction: WalletConnectSolanaWalletProvider['signTransaction']","isVersionedTransaction","VersionedTransaction","Transaction","signAllTransactions: WalletConnectSolanaWalletProvider['signAllTransactions']","signAndSendTransaction: WalletConnectSolanaWalletProvider['signAndSendTransaction']","solanaConfirmTransaction","solanaExecuteSwapTransaction","solanaTransferAmount","WalletProviderPriority","CHAINS_INFO_MAP","packageName","packageVersion"],"sources":["../src/walletConnect/createWalletProviderFromWalletConnectSolanaSession/createWalletProviderFromWalletConnectSolanaSession.ts","../src/walletConnect/recoverSolanaWalletConnectWalletProviders/recoverSolanaWalletConnectWalletProviders.ts","../src/walletConnect/addWalletConnectSolanaExtension/addWalletConnectSolanaExtension.ts","../src/walletConnect/consts.ts","../src/walletConnect/connectWithWalletConnectSolana/connectWithWalletConnectSolana.ts","../src/walletConnect/connectAndVerifyWithWalletConnectSolana/connectAndVerifyWithWalletConnectSolana.ts","../src/exports/walletConnect.ts"],"sourcesContent":["import {\n type DynamicClient,\n getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n bufferToBase64,\n emitEvent,\n filterDuplicates,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n getWalletProviderRegistry,\n switchActiveNetworkInLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport { SessionClosedUnexpectedlyError } from '@dynamic-labs-sdk/wallet-connect';\nimport {\n createWalletConnectSessionEventEmitter,\n getSignClient,\n splitCaip10Token,\n} from '@dynamic-labs-sdk/wallet-connect/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { PublicKey, Transaction, VersionedTransaction } from '@solana/web3.js';\nimport { SDK_ERRORS } from '@walletconnect/utils';\nimport bs58 from 'bs58';\n\nimport type { SolanaWalletAccount } from '../../SolanaWalletAccount.types';\nimport { isVersionedTransaction } from '../../utils/isVersionedTransaction';\nimport { solanaConfirmTransaction } from '../../utils/solanaConfirmTransaction';\nimport { solanaExecuteSwapTransaction } from '../../utils/solanaExecuteSwapTransaction';\nimport { solanaTransferAmount } from '../../utils/solanaTransferAmount';\nimport type { solanaMethods } from '../consts';\nimport type { WalletConnectSolanaWalletProvider } from '../walletConnectSolanaWalletProvider.types';\nimport type {\n AvailableSolanaSessionRequests,\n SolanaSessionRequest,\n SolanaSessionRequestResultMap,\n} from './walletConnectSolanaSessionRequest.types';\n\ntype createWalletProviderFromWalletConnectSolanaSessionParams = {\n sessionTopic: string;\n};\n\n/**\n * The list of Solana request methods that require user action.\n * We will raise a user action requested event for these methods.\n */\nconst methodsThatRequireUserAction: string[] = [\n 'solana_signMessage',\n 'solana_signTransaction',\n 'solana_signAllTransactions',\n 'solana_signAndSendTransaction',\n] satisfies (typeof solanaMethods)[number][];\n\n/** @not-instrumented */\nexport const createWalletProviderFromWalletConnectSolanaSession = async (\n { sessionTopic }: createWalletProviderFromWalletConnectSolanaSessionParams,\n client: DynamicClient\n): Promise<WalletConnectSolanaWalletProvider> => {\n const signClient = await getSignClient(client);\n\n const getSession = () => {\n const session = signClient.session.get(sessionTopic);\n\n if (!session) {\n void disconnect();\n\n throw new SessionClosedUnexpectedlyError({\n sessionTopic,\n walletDisplayName: displayName,\n });\n }\n\n return session;\n };\n\n const displayName = getSession().peer.metadata.name;\n\n const namespaceKey = 'solana';\n\n const walletProviderType = WalletProviderEnum.WalletConnect;\n\n const key = formatWalletProviderKey({\n chain: 'SOL',\n displayName,\n suffix: sessionTopic,\n walletProviderType,\n });\n\n const getActiveNetworkId: WalletConnectSolanaWalletProvider['getActiveNetworkId'] =\n async () => {\n // Assert the session is still valid\n getSession();\n\n return await getActiveNetworkIdFromLastKnownRegistry({\n client,\n walletProviderKey: key,\n });\n };\n\n const switchActiveNetwork: WalletConnectSolanaWalletProvider['switchActiveNetwork'] =\n async ({ networkId }) => {\n // Assert the session is still valid\n getSession();\n\n await switchActiveNetworkInLastKnownRegistry({\n client,\n networkId,\n walletProviderKey: key,\n });\n };\n\n const disconnect: NonNullable<\n WalletConnectSolanaWalletProvider['disconnect']\n > = async () => {\n await signClient.disconnect({\n reason: SDK_ERRORS.USER_DISCONNECTED,\n topic: sessionTopic,\n });\n\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n walletProviderRegistry.unregister(key);\n };\n\n /**\n * We actually clear up the entire WC session and its wallet provider\n */\n const disconnectWalletAccount: WalletConnectSolanaWalletProvider['disconnectWalletAccount'] =\n async () => disconnect();\n\n /**\n * Helper function to make WalletConnect requests\n */\n // eslint-disable-next-line custom-rules/require-single-object-param\n const makeRequest = async <T extends AvailableSolanaSessionRequests>(\n request: SolanaSessionRequest<T>,\n walletAccount: SolanaWalletAccount\n ): Promise<SolanaSessionRequestResultMap[T]> => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const session = getSession();\n\n const peerMetadata = session.peer.metadata;\n\n if (methodsThatRequireUserAction.includes(request.method)) {\n emitEvent(\n {\n args: {\n walletMetadata: peerMetadata,\n walletProviderKey: key,\n },\n event: 'walletConnectUserActionRequested',\n },\n client\n );\n }\n\n const { networkData } = await getActiveNetworkData(\n { walletAccount },\n client\n );\n\n assertDefined(\n networkData,\n `Failed to get network data for wallet account ${walletAccount.address}`\n );\n\n return signClient.request<SolanaSessionRequestResultMap[T]>({\n chainId: `${namespaceKey}:${networkData.genesisHash}`,\n request,\n topic: sessionTopic,\n });\n };\n\n /**\n * Serializes a transaction for WalletConnect\n * Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L193\n */\n // eslint-disable-next-line custom-rules/require-single-object-param\n const serializeTransaction = (\n transaction: Transaction | VersionedTransaction\n ) => {\n const serialized = transaction.serialize({\n requireAllSignatures: false,\n verifySignatures: false,\n });\n\n return bs58.encode(new Uint8Array(serialized));\n };\n\n const signMessage: WalletConnectSolanaWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const publicKey = new PublicKey(walletAccount.address);\n\n const { signature } = await makeRequest(\n {\n method: 'solana_signMessage',\n params: { message, pubkey: publicKey.toBase58() },\n },\n walletAccount\n );\n\n const signatureBytes = bs58.decode(signature);\n\n return {\n signature: bufferToBase64(signatureBytes),\n };\n };\n\n const getConnectedAddresses: WalletConnectSolanaWalletProvider['getConnectedAddresses'] =\n async () => {\n const addresses = filterDuplicates(\n getSession().namespaces[namespaceKey].accounts.map(\n (account) => splitCaip10Token(account).address\n )\n );\n\n return { addresses };\n };\n\n const { cleanupEventEmitter, getEventEmitter } =\n createWalletConnectSessionEventEmitter({\n getSession,\n namespaceKey,\n sessionTopic,\n signClient,\n });\n\n const terminate: WalletConnectSolanaWalletProvider['terminate'] = async () =>\n cleanupEventEmitter();\n\n const signTransaction: WalletConnectSolanaWalletProvider['signTransaction'] =\n async ({ transaction, walletAccount }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n type T = typeof transaction;\n\n const serializedTransaction = serializeTransaction(transaction);\n\n // Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L98\n const { transaction: signedTransaction } = await makeRequest(\n {\n method: 'solana_signTransaction',\n params: { transaction: serializedTransaction },\n },\n walletAccount\n );\n\n const decodedTransaction = bs58.decode(signedTransaction);\n\n if (isVersionedTransaction(transaction)) {\n return {\n signedTransaction: VersionedTransaction.deserialize(\n decodedTransaction\n ) as T,\n };\n }\n\n return { signedTransaction: Transaction.from(decodedTransaction) as T };\n };\n\n const signAllTransactions: WalletConnectSolanaWalletProvider['signAllTransactions'] =\n async ({ transactions, walletAccount }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n type T = (typeof transactions)[number];\n\n const serializedTransactions = transactions.map(serializeTransaction);\n\n // Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L143\n const { transactions: signedTransactions } = await makeRequest(\n {\n method: 'solana_signAllTransactions',\n params: { transactions: serializedTransactions },\n },\n walletAccount\n );\n\n const signedTransactionsArray = signedTransactions.map(\n (signedTransaction, index) => {\n const originalTransaction = transactions[index];\n\n const decodedTransaction = bs58.decode(signedTransaction);\n\n if (isVersionedTransaction(originalTransaction)) {\n return VersionedTransaction.deserialize(decodedTransaction) as T;\n }\n\n return Transaction.from(decodedTransaction) as T;\n }\n );\n\n return { signedTransactions: signedTransactionsArray };\n };\n\n const signAndSendTransaction: WalletConnectSolanaWalletProvider['signAndSendTransaction'] =\n async ({ transaction, walletAccount }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const serializedTransaction = serializeTransaction(transaction);\n\n // Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L114\n const { signature } = await makeRequest(\n {\n method: 'solana_signAndSendTransaction',\n params: { transaction: serializedTransaction },\n },\n walletAccount\n );\n\n return { signature };\n };\n\n return {\n chain: 'SOL',\n confirmTransaction: (args) => solanaConfirmTransaction(args, client),\n disconnect,\n disconnectWalletAccount,\n get events() {\n return getEventEmitter();\n },\n executeSwapTransaction: (args) =>\n solanaExecuteSwapTransaction(args, client),\n getActiveNetworkId,\n getConnectedAddresses,\n getSession,\n groupKey: formatWalletProviderGroupKey(displayName),\n key,\n metadata: {\n displayName,\n icon: getSession().peer.metadata.icons[0],\n },\n namespaceKey,\n signAllTransactions,\n signAndSendTransaction,\n signMessage,\n signTransaction,\n switchActiveNetwork,\n terminate,\n transferAmount: (args) => solanaTransferAmount(args, client),\n walletProviderType,\n };\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n WalletProviderPriority,\n getWalletProviderRegistry,\n waitForProjectSettings,\n} from '@dynamic-labs-sdk/client/core';\nimport { getSignClient } from '@dynamic-labs-sdk/wallet-connect/core';\n\nimport { createWalletProviderFromWalletConnectSolanaSession } from '../createWalletProviderFromWalletConnectSolanaSession';\n\n/** @not-instrumented */\nexport const recoverSolanaWalletConnectWalletProviders = async (\n client: DynamicClient\n) => {\n await waitForProjectSettings(client);\n\n const signClient = await getSignClient(client);\n\n /**\n * Recreate the wallet providers for all existing Solana sessions\n */\n const sessions = signClient.session.getAll();\n\n const currentTime = Math.floor(Date.now() / 1000);\n\n for (const session of sessions) {\n if (!('solana' in session.namespaces)) {\n continue;\n }\n\n if (session.expiry <= currentTime) {\n continue;\n }\n\n const walletProvider =\n await createWalletProviderFromWalletConnectSolanaSession(\n {\n sessionTopic: session.topic,\n },\n client\n );\n\n getWalletProviderRegistry(client).register({\n priority: WalletProviderPriority.WALLET_SDK,\n walletProvider,\n });\n }\n};\n","import { getDefaultClient, hasExtension } from '@dynamic-labs-sdk/client';\nimport { registerExtension } from '@dynamic-labs-sdk/client/core';\n\nimport { registerSolanaNetworkProviderBuilder } from '../../registerSolanaNetworkProviderBuilder';\nimport { assertBufferAvailable } from '../../utils/assertBufferAvailable/assertBufferAvailable';\nimport { recoverSolanaWalletConnectWalletProviders } from '../recoverSolanaWalletConnectWalletProviders';\n\nexport const WALLET_CONNECT_SOLANA_EXTENSION_KEY = 'walletConnectSolana';\n\n/** @not-instrumented */\nexport const addWalletConnectSolanaExtension = async (\n client = getDefaultClient()\n) => {\n if (\n hasExtension({ extensionKey: WALLET_CONNECT_SOLANA_EXTENSION_KEY }, client)\n ) {\n return;\n }\n\n assertBufferAvailable();\n\n registerExtension(\n { extensionKey: WALLET_CONNECT_SOLANA_EXTENSION_KEY },\n client\n );\n\n registerSolanaNetworkProviderBuilder(client);\n\n await recoverSolanaWalletConnectWalletProviders(client);\n};\n","import { CHAINS_INFO_MAP } from '@dynamic-labs-sdk/client/core';\n\nexport const solanaApiChainName = CHAINS_INFO_MAP.SOL.apiChainName;\n\n/**\n * List of methods that may be requested from Solana wallet applications.\n *\n * Source: https://github.com/reown-com/appkit/blob/fe11a72507af09efcfe89228189aeda04dfe17a9/packages/appkit-utils/src/WCNamespaceUtil.ts#L9\n */\nexport const solanaMethods = [\n 'solana_signMessage',\n 'solana_signTransaction',\n 'solana_requestAccounts',\n 'solana_getAccounts',\n 'solana_signAllTransactions',\n 'solana_signAndSendTransaction',\n] as const;\n\n/**\n * List of blockchain hashes for all solana networks.\n *\n * You will find the main hashes here: https://namespaces.chainagnostic.org/solana/caip10\n * However, this list also includes the legacy hashes for mainnet and devnet for maximum compatibility.\n * You will find the legacy hashes here: https://chainagnostic.org/CAIPs/caip-30\n *\n * Note that this list was not originally fetched from those sources, however. Instead, we manually inspected\n * which networks were passed as argument to the signClient.connect method in the official reown Solana demo\n * which you can find here: https://lab.reown.com/appkit/?name=multichain-all\n */\nexport const solanaNetworks = [\n // mainnet\n 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n // legacy mainnet\n 'solana:4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ',\n // testnet\n 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n // devnet\n 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n // legacy devnet\n 'solana:8E9rvCKLFQia2Y35HXjjpWzj8weVo44K',\n] as const;\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { assertDefined } from '@dynamic-labs-sdk/client/core';\nimport type { WalletConnectConnectionResult } from '@dynamic-labs-sdk/wallet-connect';\nimport {\n getSignClient,\n importWalletConnectSession,\n} from '@dynamic-labs-sdk/wallet-connect/core';\n\nimport { solanaApiChainName, solanaMethods } from '../consts';\nimport { createWalletProviderFromWalletConnectSolanaSession } from '../createWalletProviderFromWalletConnectSolanaSession';\n\ntype ConnectWithWalletConnectSolanaParams = {\n /**\n * Whether this session's wallet accounts should be added to the dynamic's wallet accounts.\n */\n addToDynamicWalletAccounts?: boolean;\n};\n\n/** @not-instrumented */\nexport const connectWithWalletConnectSolana = async (\n {\n addToDynamicWalletAccounts = true,\n }: ConnectWithWalletConnectSolanaParams = {},\n client = getDefaultClient()\n): Promise<WalletConnectConnectionResult> => {\n const signClient = await getSignClient(client);\n\n assertDefined(client.projectSettings, 'Project settings unavailable');\n\n const solanaNetworks = client.projectSettings.networks?.find(\n (network) => network.chainName === solanaApiChainName\n )?.networks;\n\n assertDefined(solanaNetworks, 'Solana networks not found');\n\n /**\n * By inspecting the official reown Solana demo, we can see that the genesis hash is used as the chain id.\n * https://lab.reown.com/appkit/?name=multichain-all\n */\n const walletConnectChains = solanaNetworks.map(\n (network) => `solana:${network.genesisHash}`\n );\n\n /**\n * A WalletConnect connection request generates a URI and a promise.\n *\n * The URI must be handed to an external wallet application that will use it\n * to establish a connection via a WalletConnect relay server. Typically, this\n * is done by scanning a QR code or deep linking to the wallet application.\n *\n * The promise will resolve when the connection is established.\n */\n const { approval, uri } = await signClient.connect({\n optionalNamespaces: {\n solana: {\n chains: walletConnectChains,\n events: ['accountsChanged', 'chainChanged', 'disconnected'],\n methods: solanaMethods as unknown as string[],\n },\n },\n });\n\n assertDefined(\n uri,\n 'Failed to establish WalletConnect session: no URI returned'\n );\n\n /**\n * Once the approval promise resolves, the WalletConnect session is established\n * between the wallet application and the dapp (this app).\n */\n const walletAccountsPromise = approval().then(async (session) => {\n assertDefined(\n session.namespaces.solana,\n `WalletConnect session did not establish a Solana connection. Found instead: ${Object.keys(\n session.namespaces\n ).join(', ')}`\n );\n\n return importWalletConnectSession(\n {\n addToDynamicWalletAccounts,\n sessionTopic: session.topic,\n walletProviderBuilder:\n createWalletProviderFromWalletConnectSolanaSession,\n },\n client\n );\n });\n\n return { approval: () => walletAccountsPromise, uri };\n};\n","import { verifyWalletAccount } from '@dynamic-labs-sdk/client';\nimport { assertDefined, getDefaultClient } from '@dynamic-labs-sdk/client/core';\nimport type { WalletConnectConnectionResult } from '@dynamic-labs-sdk/wallet-connect';\n\nimport { connectWithWalletConnectSolana } from '../connectWithWalletConnectSolana';\n\n/**\n * Connects to a WalletConnect Solana wallet and verifies ownership through message signing.\n *\n * This function will first perform a regular connect and then verify the wallet accounts via\n * verifyWalletAccount.\n *\n * **Note on connecting and verifying in a single step:**\n * Currently WalletConnect does NOT support the authenticate method for any non eip155 chains.\n * This means there is no way to perform connection and verification in a single step.\n * This can easily be tested by attempting to call `signClient.authenticate` with a solana namespace\n * and checking whether WalletConnect will throw the following error:\n * ```\n * 'Only eip155 namespace is supported for authenticated sessions. Please use .connect() for non-eip155 chains.'\n * ```\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns A promise that resolves to the connected and verified wallet account.\n * @not-instrumented\n */\nexport const connectAndVerifyWithWalletConnectSolana = async (\n client = getDefaultClient()\n): Promise<WalletConnectConnectionResult> => {\n const { approval, uri } = await connectWithWalletConnectSolana(\n // We don't want to add the wallet accounts to the dynamic's wallet accounts state\n // while we are still verifying them.\n { addToDynamicWalletAccounts: false },\n client\n );\n\n assertDefined(\n uri,\n 'Failed to establish WalletConnect session: no URI returned'\n );\n\n /**\n * Once the approval promise resolves, the WalletConnect session is established\n * between the wallet application and the dapp (this app).\n */\n const walletAccountsPromise = approval().then(async ({ walletAccounts }) => {\n // This should not be concurrent because the first will be a verify and the rest will be a link\n for (const walletAccount of walletAccounts) {\n await verifyWalletAccount({ walletAccount }, client);\n }\n\n return { walletAccounts };\n });\n\n return { approval: () => walletAccountsPromise, uri };\n};\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 { addWalletConnectSolanaExtension } from '../walletConnect/addWalletConnectSolanaExtension';\nexport { connectAndVerifyWithWalletConnectSolana } from '../walletConnect/connectAndVerifyWithWalletConnectSolana';\nexport { connectWithWalletConnectSolana } from '../walletConnect/connectWithWalletConnectSolana';\nexport type { WalletConnectSolanaWalletProvider } from '../walletConnect/walletConnectSolanaWalletProvider.types';\n"],"mappings":"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"}
1
+ {"version":3,"file":"walletConnect.cjs","names":["methodsThatRequireUserAction: string[]","SessionClosedUnexpectedlyError","WalletProviderEnum","getActiveNetworkId: WalletConnectSolanaWalletProvider['getActiveNetworkId']","switchActiveNetwork: WalletConnectSolanaWalletProvider['switchActiveNetwork']","disconnectWalletAccount: WalletConnectSolanaWalletProvider['disconnectWalletAccount']","signMessage: WalletConnectSolanaWalletProvider['signMessage']","PublicKey","getConnectedAddresses: WalletConnectSolanaWalletProvider['getConnectedAddresses']","destroy: NonNullable<\n WalletConnectSolanaWalletProvider['destroy']\n >","SDK_ERRORS","signTransaction: WalletConnectSolanaWalletProvider['signTransaction']","isVersionedTransaction","VersionedTransaction","Transaction","signAllTransactions: WalletConnectSolanaWalletProvider['signAllTransactions']","signAndSendTransaction: WalletConnectSolanaWalletProvider['signAndSendTransaction']","solanaConfirmTransaction","solanaExecuteSwapTransaction","solanaTransferAmount","WalletProviderPriority","CHAINS_INFO_MAP","packageName","packageVersion"],"sources":["../src/walletConnect/createWalletProviderFromWalletConnectSolanaSession/createWalletProviderFromWalletConnectSolanaSession.ts","../src/walletConnect/recoverSolanaWalletConnectWalletProviders/recoverSolanaWalletConnectWalletProviders.ts","../src/walletConnect/addWalletConnectSolanaExtension/addWalletConnectSolanaExtension.ts","../src/walletConnect/consts.ts","../src/walletConnect/connectWithWalletConnectSolana/connectWithWalletConnectSolana.ts","../src/walletConnect/connectAndVerifyWithWalletConnectSolana/connectAndVerifyWithWalletConnectSolana.ts","../src/exports/walletConnect.ts"],"sourcesContent":["import {\n type DynamicClient,\n getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n bufferToBase64,\n emitEvent,\n filterDuplicates,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n getCore,\n getWalletProviderRegistry,\n switchActiveNetworkInLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport { SessionClosedUnexpectedlyError } from '@dynamic-labs-sdk/wallet-connect';\nimport {\n createWalletConnectSessionEventEmitter,\n getSignClient,\n splitCaip10Token,\n} from '@dynamic-labs-sdk/wallet-connect/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { PublicKey, Transaction, VersionedTransaction } from '@solana/web3.js';\nimport { SDK_ERRORS } from '@walletconnect/utils';\nimport bs58 from 'bs58';\n\nimport type { SolanaWalletAccount } from '../../SolanaWalletAccount.types';\nimport { isVersionedTransaction } from '../../utils/isVersionedTransaction';\nimport { solanaConfirmTransaction } from '../../utils/solanaConfirmTransaction';\nimport { solanaExecuteSwapTransaction } from '../../utils/solanaExecuteSwapTransaction';\nimport { solanaTransferAmount } from '../../utils/solanaTransferAmount';\nimport type { solanaMethods } from '../consts';\nimport type { WalletConnectSolanaWalletProvider } from '../walletConnectSolanaWalletProvider.types';\nimport type {\n AvailableSolanaSessionRequests,\n SolanaSessionRequest,\n SolanaSessionRequestResultMap,\n} from './walletConnectSolanaSessionRequest.types';\n\ntype createWalletProviderFromWalletConnectSolanaSessionParams = {\n sessionTopic: string;\n};\n\n/**\n * The list of Solana request methods that require user action.\n * We will raise a user action requested event for these methods.\n */\nconst methodsThatRequireUserAction: string[] = [\n 'solana_signMessage',\n 'solana_signTransaction',\n 'solana_signAllTransactions',\n 'solana_signAndSendTransaction',\n] satisfies (typeof solanaMethods)[number][];\n\n/** @not-instrumented */\nexport const createWalletProviderFromWalletConnectSolanaSession = async (\n { sessionTopic }: createWalletProviderFromWalletConnectSolanaSessionParams,\n client: DynamicClient\n): Promise<WalletConnectSolanaWalletProvider> => {\n const signClient = await getSignClient(client);\n\n const getSession = () => {\n const session = signClient.session.get(sessionTopic);\n\n if (!session) {\n // destroy never throws (it logs internally), but explicit .catch makes\n // the fire-and-forget intent obvious and silences static analyzers.\n destroy().catch(() => undefined);\n\n throw new SessionClosedUnexpectedlyError({\n sessionTopic,\n walletDisplayName: displayName,\n });\n }\n\n return session;\n };\n\n const displayName = getSession().peer.metadata.name;\n\n const namespaceKey = 'solana';\n\n const walletProviderType = WalletProviderEnum.WalletConnect;\n\n const key = formatWalletProviderKey({\n chain: 'SOL',\n displayName,\n suffix: sessionTopic,\n walletProviderType,\n });\n\n const getActiveNetworkId: WalletConnectSolanaWalletProvider['getActiveNetworkId'] =\n async () => {\n // Assert the session is still valid\n getSession();\n\n return await getActiveNetworkIdFromLastKnownRegistry({\n client,\n walletProviderKey: key,\n });\n };\n\n const switchActiveNetwork: WalletConnectSolanaWalletProvider['switchActiveNetwork'] =\n async ({ networkId }) => {\n // Assert the session is still valid\n getSession();\n\n await switchActiveNetworkInLastKnownRegistry({\n client,\n networkId,\n walletProviderKey: key,\n });\n };\n\n /**\n * We actually clear up the entire WC session and its wallet provider\n */\n const disconnectWalletAccount: WalletConnectSolanaWalletProvider['disconnectWalletAccount'] =\n async () => destroy();\n\n /**\n * Helper function to make WalletConnect requests\n */\n // eslint-disable-next-line custom-rules/require-single-object-param\n const makeRequest = async <T extends AvailableSolanaSessionRequests>(\n request: SolanaSessionRequest<T>,\n walletAccount: SolanaWalletAccount\n ): Promise<SolanaSessionRequestResultMap[T]> => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const session = getSession();\n\n const peerMetadata = session.peer.metadata;\n\n if (methodsThatRequireUserAction.includes(request.method)) {\n emitEvent(\n {\n args: {\n walletMetadata: peerMetadata,\n walletProviderKey: key,\n },\n event: 'walletConnectUserActionRequested',\n },\n client\n );\n }\n\n const { networkData } = await getActiveNetworkData(\n { walletAccount },\n client\n );\n\n assertDefined(\n networkData,\n `Failed to get network data for wallet account ${walletAccount.address}`\n );\n\n return signClient.request<SolanaSessionRequestResultMap[T]>({\n chainId: `${namespaceKey}:${networkData.genesisHash}`,\n request,\n topic: sessionTopic,\n });\n };\n\n /**\n * Serializes a transaction for WalletConnect\n * Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L193\n */\n // eslint-disable-next-line custom-rules/require-single-object-param\n const serializeTransaction = (\n transaction: Transaction | VersionedTransaction\n ) => {\n const serialized = transaction.serialize({\n requireAllSignatures: false,\n verifySignatures: false,\n });\n\n return bs58.encode(new Uint8Array(serialized));\n };\n\n const signMessage: WalletConnectSolanaWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const publicKey = new PublicKey(walletAccount.address);\n\n const { signature } = await makeRequest(\n {\n method: 'solana_signMessage',\n params: { message, pubkey: publicKey.toBase58() },\n },\n walletAccount\n );\n\n const signatureBytes = bs58.decode(signature);\n\n return {\n signature: bufferToBase64(signatureBytes),\n };\n };\n\n const getConnectedAddresses: WalletConnectSolanaWalletProvider['getConnectedAddresses'] =\n async () => {\n const addresses = filterDuplicates(\n getSession().namespaces[namespaceKey].accounts.map(\n (account) => splitCaip10Token(account).address\n )\n );\n\n return { addresses };\n };\n\n const { cleanupEventEmitter, getEventEmitter } =\n createWalletConnectSessionEventEmitter({\n getSession,\n namespaceKey,\n sessionTopic,\n signClient,\n });\n\n const destroy: NonNullable<\n WalletConnectSolanaWalletProvider['destroy']\n > = async () => {\n cleanupEventEmitter();\n try {\n await signClient.disconnect({\n reason: SDK_ERRORS.USER_DISCONNECTED,\n topic: sessionTopic,\n });\n\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n walletProviderRegistry.unregister(key);\n } catch (err) {\n getCore(client).logger.error(\n `[${key}] destroy: remote signal failed`,\n err\n );\n }\n };\n\n const signTransaction: WalletConnectSolanaWalletProvider['signTransaction'] =\n async ({ transaction, walletAccount }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n type T = typeof transaction;\n\n const serializedTransaction = serializeTransaction(transaction);\n\n // Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L98\n const { transaction: signedTransaction } = await makeRequest(\n {\n method: 'solana_signTransaction',\n params: { transaction: serializedTransaction },\n },\n walletAccount\n );\n\n const decodedTransaction = bs58.decode(signedTransaction);\n\n if (isVersionedTransaction(transaction)) {\n return {\n signedTransaction: VersionedTransaction.deserialize(\n decodedTransaction\n ) as T,\n };\n }\n\n return { signedTransaction: Transaction.from(decodedTransaction) as T };\n };\n\n const signAllTransactions: WalletConnectSolanaWalletProvider['signAllTransactions'] =\n async ({ transactions, walletAccount }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n type T = (typeof transactions)[number];\n\n const serializedTransactions = transactions.map(serializeTransaction);\n\n // Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L143\n const { transactions: signedTransactions } = await makeRequest(\n {\n method: 'solana_signAllTransactions',\n params: { transactions: serializedTransactions },\n },\n walletAccount\n );\n\n const signedTransactionsArray = signedTransactions.map(\n (signedTransaction, index) => {\n const originalTransaction = transactions[index];\n\n const decodedTransaction = bs58.decode(signedTransaction);\n\n if (isVersionedTransaction(originalTransaction)) {\n return VersionedTransaction.deserialize(decodedTransaction) as T;\n }\n\n return Transaction.from(decodedTransaction) as T;\n }\n );\n\n return { signedTransactions: signedTransactionsArray };\n };\n\n const signAndSendTransaction: WalletConnectSolanaWalletProvider['signAndSendTransaction'] =\n async ({ transaction, walletAccount }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const serializedTransaction = serializeTransaction(transaction);\n\n // Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L114\n const { signature } = await makeRequest(\n {\n method: 'solana_signAndSendTransaction',\n params: { transaction: serializedTransaction },\n },\n walletAccount\n );\n\n return { signature };\n };\n\n return {\n chain: 'SOL',\n confirmTransaction: (args) => solanaConfirmTransaction(args, client),\n destroy,\n disconnectWalletAccount,\n get events() {\n return getEventEmitter();\n },\n executeSwapTransaction: (args) =>\n solanaExecuteSwapTransaction(args, client),\n getActiveNetworkId,\n getConnectedAddresses,\n getSession,\n groupKey: formatWalletProviderGroupKey(displayName),\n key,\n metadata: {\n displayName,\n icon: getSession().peer.metadata.icons[0],\n },\n namespaceKey,\n signAllTransactions,\n signAndSendTransaction,\n signMessage,\n signTransaction,\n switchActiveNetwork,\n transferAmount: (args) => solanaTransferAmount(args, client),\n walletProviderType,\n };\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n WalletProviderPriority,\n getWalletProviderRegistry,\n waitForProjectSettings,\n} from '@dynamic-labs-sdk/client/core';\nimport { getSignClient } from '@dynamic-labs-sdk/wallet-connect/core';\n\nimport { createWalletProviderFromWalletConnectSolanaSession } from '../createWalletProviderFromWalletConnectSolanaSession';\n\n/** @not-instrumented */\nexport const recoverSolanaWalletConnectWalletProviders = async (\n client: DynamicClient\n) => {\n await waitForProjectSettings(client);\n\n const signClient = await getSignClient(client);\n\n /**\n * Recreate the wallet providers for all existing Solana sessions\n */\n const sessions = signClient.session.getAll();\n\n const currentTime = Math.floor(Date.now() / 1000);\n\n for (const session of sessions) {\n if (!('solana' in session.namespaces)) {\n continue;\n }\n\n if (session.expiry <= currentTime) {\n continue;\n }\n\n const walletProvider =\n await createWalletProviderFromWalletConnectSolanaSession(\n {\n sessionTopic: session.topic,\n },\n client\n );\n\n getWalletProviderRegistry(client).register({\n priority: WalletProviderPriority.WALLET_SDK,\n walletProvider,\n });\n }\n};\n","import { getDefaultClient, hasExtension } from '@dynamic-labs-sdk/client';\nimport { registerExtension } from '@dynamic-labs-sdk/client/core';\n\nimport { registerSolanaNetworkProviderBuilder } from '../../registerSolanaNetworkProviderBuilder';\nimport { assertBufferAvailable } from '../../utils/assertBufferAvailable/assertBufferAvailable';\nimport { recoverSolanaWalletConnectWalletProviders } from '../recoverSolanaWalletConnectWalletProviders';\n\nexport const WALLET_CONNECT_SOLANA_EXTENSION_KEY = 'walletConnectSolana';\n\n/** @not-instrumented */\nexport const addWalletConnectSolanaExtension = async (\n client = getDefaultClient()\n) => {\n if (\n hasExtension({ extensionKey: WALLET_CONNECT_SOLANA_EXTENSION_KEY }, client)\n ) {\n return;\n }\n\n assertBufferAvailable();\n\n registerExtension(\n { extensionKey: WALLET_CONNECT_SOLANA_EXTENSION_KEY },\n client\n );\n\n registerSolanaNetworkProviderBuilder(client);\n\n await recoverSolanaWalletConnectWalletProviders(client);\n};\n","import { CHAINS_INFO_MAP } from '@dynamic-labs-sdk/client/core';\n\nexport const solanaApiChainName = CHAINS_INFO_MAP.SOL.apiChainName;\n\n/**\n * List of methods that may be requested from Solana wallet applications.\n *\n * Source: https://github.com/reown-com/appkit/blob/fe11a72507af09efcfe89228189aeda04dfe17a9/packages/appkit-utils/src/WCNamespaceUtil.ts#L9\n */\nexport const solanaMethods = [\n 'solana_signMessage',\n 'solana_signTransaction',\n 'solana_requestAccounts',\n 'solana_getAccounts',\n 'solana_signAllTransactions',\n 'solana_signAndSendTransaction',\n] as const;\n\n/**\n * List of blockchain hashes for all solana networks.\n *\n * You will find the main hashes here: https://namespaces.chainagnostic.org/solana/caip10\n * However, this list also includes the legacy hashes for mainnet and devnet for maximum compatibility.\n * You will find the legacy hashes here: https://chainagnostic.org/CAIPs/caip-30\n *\n * Note that this list was not originally fetched from those sources, however. Instead, we manually inspected\n * which networks were passed as argument to the signClient.connect method in the official reown Solana demo\n * which you can find here: https://lab.reown.com/appkit/?name=multichain-all\n */\nexport const solanaNetworks = [\n // mainnet\n 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n // legacy mainnet\n 'solana:4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ',\n // testnet\n 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n // devnet\n 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n // legacy devnet\n 'solana:8E9rvCKLFQia2Y35HXjjpWzj8weVo44K',\n] as const;\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { assertDefined } from '@dynamic-labs-sdk/client/core';\nimport type { WalletConnectConnectionResult } from '@dynamic-labs-sdk/wallet-connect';\nimport {\n getSignClient,\n importWalletConnectSession,\n} from '@dynamic-labs-sdk/wallet-connect/core';\n\nimport { solanaApiChainName, solanaMethods } from '../consts';\nimport { createWalletProviderFromWalletConnectSolanaSession } from '../createWalletProviderFromWalletConnectSolanaSession';\n\ntype ConnectWithWalletConnectSolanaParams = {\n /**\n * Whether this session's wallet accounts should be added to the dynamic's wallet accounts.\n */\n addToDynamicWalletAccounts?: boolean;\n};\n\n/** @not-instrumented */\nexport const connectWithWalletConnectSolana = async (\n {\n addToDynamicWalletAccounts = true,\n }: ConnectWithWalletConnectSolanaParams = {},\n client = getDefaultClient()\n): Promise<WalletConnectConnectionResult> => {\n const signClient = await getSignClient(client);\n\n assertDefined(client.projectSettings, 'Project settings unavailable');\n\n const solanaNetworks = client.projectSettings.networks?.find(\n (network) => network.chainName === solanaApiChainName\n )?.networks;\n\n assertDefined(solanaNetworks, 'Solana networks not found');\n\n /**\n * By inspecting the official reown Solana demo, we can see that the genesis hash is used as the chain id.\n * https://lab.reown.com/appkit/?name=multichain-all\n */\n const walletConnectChains = solanaNetworks.map(\n (network) => `solana:${network.genesisHash}`\n );\n\n /**\n * A WalletConnect connection request generates a URI and a promise.\n *\n * The URI must be handed to an external wallet application that will use it\n * to establish a connection via a WalletConnect relay server. Typically, this\n * is done by scanning a QR code or deep linking to the wallet application.\n *\n * The promise will resolve when the connection is established.\n */\n const { approval, uri } = await signClient.connect({\n optionalNamespaces: {\n solana: {\n chains: walletConnectChains,\n events: ['accountsChanged', 'chainChanged', 'disconnected'],\n methods: solanaMethods as unknown as string[],\n },\n },\n });\n\n assertDefined(\n uri,\n 'Failed to establish WalletConnect session: no URI returned'\n );\n\n /**\n * Once the approval promise resolves, the WalletConnect session is established\n * between the wallet application and the dapp (this app).\n */\n const walletAccountsPromise = approval().then(async (session) => {\n assertDefined(\n session.namespaces.solana,\n `WalletConnect session did not establish a Solana connection. Found instead: ${Object.keys(\n session.namespaces\n ).join(', ')}`\n );\n\n return importWalletConnectSession(\n {\n addToDynamicWalletAccounts,\n sessionTopic: session.topic,\n walletProviderBuilder:\n createWalletProviderFromWalletConnectSolanaSession,\n },\n client\n );\n });\n\n return { approval: () => walletAccountsPromise, uri };\n};\n","import { verifyWalletAccount } from '@dynamic-labs-sdk/client';\nimport { assertDefined, getDefaultClient } from '@dynamic-labs-sdk/client/core';\nimport type { WalletConnectConnectionResult } from '@dynamic-labs-sdk/wallet-connect';\n\nimport { connectWithWalletConnectSolana } from '../connectWithWalletConnectSolana';\n\n/**\n * Connects to a WalletConnect Solana wallet and verifies ownership through message signing.\n *\n * This function will first perform a regular connect and then verify the wallet accounts via\n * verifyWalletAccount.\n *\n * **Note on connecting and verifying in a single step:**\n * Currently WalletConnect does NOT support the authenticate method for any non eip155 chains.\n * This means there is no way to perform connection and verification in a single step.\n * This can easily be tested by attempting to call `signClient.authenticate` with a solana namespace\n * and checking whether WalletConnect will throw the following error:\n * ```\n * 'Only eip155 namespace is supported for authenticated sessions. Please use .connect() for non-eip155 chains.'\n * ```\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns A promise that resolves to the connected and verified wallet account.\n * @not-instrumented\n */\nexport const connectAndVerifyWithWalletConnectSolana = async (\n client = getDefaultClient()\n): Promise<WalletConnectConnectionResult> => {\n const { approval, uri } = await connectWithWalletConnectSolana(\n // We don't want to add the wallet accounts to the dynamic's wallet accounts state\n // while we are still verifying them.\n { addToDynamicWalletAccounts: false },\n client\n );\n\n assertDefined(\n uri,\n 'Failed to establish WalletConnect session: no URI returned'\n );\n\n /**\n * Once the approval promise resolves, the WalletConnect session is established\n * between the wallet application and the dapp (this app).\n */\n const walletAccountsPromise = approval().then(async ({ walletAccounts }) => {\n // This should not be concurrent because the first will be a verify and the rest will be a link\n for (const walletAccount of walletAccounts) {\n await verifyWalletAccount({ walletAccount }, client);\n }\n\n return { walletAccounts };\n });\n\n return { approval: () => walletAccountsPromise, uri };\n};\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 { addWalletConnectSolanaExtension } from '../walletConnect/addWalletConnectSolanaExtension';\nexport { connectAndVerifyWithWalletConnectSolana } from '../walletConnect/connectAndVerifyWithWalletConnectSolana';\nexport { connectWithWalletConnectSolana } from '../walletConnect/connectWithWalletConnectSolana';\nexport type { WalletConnectSolanaWalletProvider } from '../walletConnect/walletConnectSolanaWalletProvider.types';\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { c as isVersionedTransaction, d as name, f as version, i as solanaExecuteSwapTransaction, o as solanaConfirmTransaction, t as solanaTransferAmount, u as registerSolanaNetworkProviderBuilder } from "./solanaTransferAmount-CiEQTFW3.esm.js";
1
+ import { c as isVersionedTransaction, d as name, f as version, i as solanaExecuteSwapTransaction, o as solanaConfirmTransaction, t as solanaTransferAmount, u as registerSolanaNetworkProviderBuilder } from "./solanaTransferAmount-D3T1LAPQ.esm.js";
2
2
  import { t as assertBufferAvailable } from "./assertBufferAvailable-DEfVz5ER.esm.js";
3
3
  import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
4
- import { CHAINS_INFO_MAP, WalletProviderPriority, assertDefined, bufferToBase64, emitEvent, filterDuplicates, formatWalletProviderGroupKey, formatWalletProviderKey, getActiveNetworkIdFromLastKnownRegistry, getDefaultClient, getWalletProviderRegistry, registerExtension, switchActiveNetworkInLastKnownRegistry, waitForProjectSettings } from "@dynamic-labs-sdk/client/core";
4
+ import { CHAINS_INFO_MAP, WalletProviderPriority, assertDefined, bufferToBase64, emitEvent, filterDuplicates, formatWalletProviderGroupKey, formatWalletProviderKey, getActiveNetworkIdFromLastKnownRegistry, getCore, getDefaultClient, getWalletProviderRegistry, registerExtension, switchActiveNetworkInLastKnownRegistry, waitForProjectSettings } from "@dynamic-labs-sdk/client/core";
5
5
  import { getActiveNetworkData, getDefaultClient as getDefaultClient$1, hasExtension as hasExtension$1, verifyWalletAccount } from "@dynamic-labs-sdk/client";
6
6
  import { PublicKey, Transaction, VersionedTransaction } from "@solana/web3.js";
7
7
  import { WalletProviderEnum } from "@dynamic-labs/sdk-api-core";
@@ -27,7 +27,7 @@ const createWalletProviderFromWalletConnectSolanaSession = async ({ sessionTopic
27
27
  const getSession = () => {
28
28
  const session = signClient.session.get(sessionTopic);
29
29
  if (!session) {
30
- disconnect();
30
+ destroy().catch(() => void 0);
31
31
  throw new SessionClosedUnexpectedlyError({
32
32
  sessionTopic,
33
33
  walletDisplayName: displayName
@@ -59,17 +59,10 @@ const createWalletProviderFromWalletConnectSolanaSession = async ({ sessionTopic
59
59
  walletProviderKey: key
60
60
  });
61
61
  };
62
- const disconnect = async () => {
63
- await signClient.disconnect({
64
- reason: SDK_ERRORS.USER_DISCONNECTED,
65
- topic: sessionTopic
66
- });
67
- getWalletProviderRegistry(client).unregister(key);
68
- };
69
62
  /**
70
63
  * We actually clear up the entire WC session and its wallet provider
71
64
  */
72
- const disconnectWalletAccount = async () => disconnect();
65
+ const disconnectWalletAccount = async () => destroy();
73
66
  /**
74
67
  * Helper function to make WalletConnect requests
75
68
  */
@@ -122,7 +115,18 @@ const createWalletProviderFromWalletConnectSolanaSession = async ({ sessionTopic
122
115
  sessionTopic,
123
116
  signClient
124
117
  });
125
- const terminate = async () => cleanupEventEmitter();
118
+ const destroy = async () => {
119
+ cleanupEventEmitter();
120
+ try {
121
+ await signClient.disconnect({
122
+ reason: SDK_ERRORS.USER_DISCONNECTED,
123
+ topic: sessionTopic
124
+ });
125
+ getWalletProviderRegistry(client).unregister(key);
126
+ } catch (err) {
127
+ getCore(client).logger.error(`[${key}] destroy: remote signal failed`, err);
128
+ }
129
+ };
126
130
  const signTransaction = async ({ transaction, walletAccount }) => {
127
131
  assertDefined(walletAccount, "Wallet account is required");
128
132
  const { transaction: signedTransaction } = await makeRequest({
@@ -157,7 +161,7 @@ const createWalletProviderFromWalletConnectSolanaSession = async ({ sessionTopic
157
161
  return {
158
162
  chain: "SOL",
159
163
  confirmTransaction: (args) => solanaConfirmTransaction(args, client),
160
- disconnect,
164
+ destroy,
161
165
  disconnectWalletAccount,
162
166
  get events() {
163
167
  return getEventEmitter();
@@ -178,7 +182,6 @@ const createWalletProviderFromWalletConnectSolanaSession = async ({ sessionTopic
178
182
  signMessage,
179
183
  signTransaction,
180
184
  switchActiveNetwork,
181
- terminate,
182
185
  transferAmount: (args) => solanaTransferAmount(args, client),
183
186
  walletProviderType
184
187
  };
@@ -1 +1 @@
1
- {"version":3,"file":"walletConnect.esm.js","names":["methodsThatRequireUserAction: string[]","getActiveNetworkId: WalletConnectSolanaWalletProvider['getActiveNetworkId']","switchActiveNetwork: WalletConnectSolanaWalletProvider['switchActiveNetwork']","disconnect: NonNullable<\n WalletConnectSolanaWalletProvider['disconnect']\n >","disconnectWalletAccount: WalletConnectSolanaWalletProvider['disconnectWalletAccount']","signMessage: WalletConnectSolanaWalletProvider['signMessage']","getConnectedAddresses: WalletConnectSolanaWalletProvider['getConnectedAddresses']","terminate: WalletConnectSolanaWalletProvider['terminate']","signTransaction: WalletConnectSolanaWalletProvider['signTransaction']","signAllTransactions: WalletConnectSolanaWalletProvider['signAllTransactions']","signAndSendTransaction: WalletConnectSolanaWalletProvider['signAndSendTransaction']","getDefaultClient","hasExtension","getDefaultClient","packageName","packageVersion"],"sources":["../src/walletConnect/createWalletProviderFromWalletConnectSolanaSession/createWalletProviderFromWalletConnectSolanaSession.ts","../src/walletConnect/recoverSolanaWalletConnectWalletProviders/recoverSolanaWalletConnectWalletProviders.ts","../src/walletConnect/addWalletConnectSolanaExtension/addWalletConnectSolanaExtension.ts","../src/walletConnect/consts.ts","../src/walletConnect/connectWithWalletConnectSolana/connectWithWalletConnectSolana.ts","../src/walletConnect/connectAndVerifyWithWalletConnectSolana/connectAndVerifyWithWalletConnectSolana.ts","../src/exports/walletConnect.ts"],"sourcesContent":["import {\n type DynamicClient,\n getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n bufferToBase64,\n emitEvent,\n filterDuplicates,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n getWalletProviderRegistry,\n switchActiveNetworkInLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport { SessionClosedUnexpectedlyError } from '@dynamic-labs-sdk/wallet-connect';\nimport {\n createWalletConnectSessionEventEmitter,\n getSignClient,\n splitCaip10Token,\n} from '@dynamic-labs-sdk/wallet-connect/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { PublicKey, Transaction, VersionedTransaction } from '@solana/web3.js';\nimport { SDK_ERRORS } from '@walletconnect/utils';\nimport bs58 from 'bs58';\n\nimport type { SolanaWalletAccount } from '../../SolanaWalletAccount.types';\nimport { isVersionedTransaction } from '../../utils/isVersionedTransaction';\nimport { solanaConfirmTransaction } from '../../utils/solanaConfirmTransaction';\nimport { solanaExecuteSwapTransaction } from '../../utils/solanaExecuteSwapTransaction';\nimport { solanaTransferAmount } from '../../utils/solanaTransferAmount';\nimport type { solanaMethods } from '../consts';\nimport type { WalletConnectSolanaWalletProvider } from '../walletConnectSolanaWalletProvider.types';\nimport type {\n AvailableSolanaSessionRequests,\n SolanaSessionRequest,\n SolanaSessionRequestResultMap,\n} from './walletConnectSolanaSessionRequest.types';\n\ntype createWalletProviderFromWalletConnectSolanaSessionParams = {\n sessionTopic: string;\n};\n\n/**\n * The list of Solana request methods that require user action.\n * We will raise a user action requested event for these methods.\n */\nconst methodsThatRequireUserAction: string[] = [\n 'solana_signMessage',\n 'solana_signTransaction',\n 'solana_signAllTransactions',\n 'solana_signAndSendTransaction',\n] satisfies (typeof solanaMethods)[number][];\n\n/** @not-instrumented */\nexport const createWalletProviderFromWalletConnectSolanaSession = async (\n { sessionTopic }: createWalletProviderFromWalletConnectSolanaSessionParams,\n client: DynamicClient\n): Promise<WalletConnectSolanaWalletProvider> => {\n const signClient = await getSignClient(client);\n\n const getSession = () => {\n const session = signClient.session.get(sessionTopic);\n\n if (!session) {\n void disconnect();\n\n throw new SessionClosedUnexpectedlyError({\n sessionTopic,\n walletDisplayName: displayName,\n });\n }\n\n return session;\n };\n\n const displayName = getSession().peer.metadata.name;\n\n const namespaceKey = 'solana';\n\n const walletProviderType = WalletProviderEnum.WalletConnect;\n\n const key = formatWalletProviderKey({\n chain: 'SOL',\n displayName,\n suffix: sessionTopic,\n walletProviderType,\n });\n\n const getActiveNetworkId: WalletConnectSolanaWalletProvider['getActiveNetworkId'] =\n async () => {\n // Assert the session is still valid\n getSession();\n\n return await getActiveNetworkIdFromLastKnownRegistry({\n client,\n walletProviderKey: key,\n });\n };\n\n const switchActiveNetwork: WalletConnectSolanaWalletProvider['switchActiveNetwork'] =\n async ({ networkId }) => {\n // Assert the session is still valid\n getSession();\n\n await switchActiveNetworkInLastKnownRegistry({\n client,\n networkId,\n walletProviderKey: key,\n });\n };\n\n const disconnect: NonNullable<\n WalletConnectSolanaWalletProvider['disconnect']\n > = async () => {\n await signClient.disconnect({\n reason: SDK_ERRORS.USER_DISCONNECTED,\n topic: sessionTopic,\n });\n\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n walletProviderRegistry.unregister(key);\n };\n\n /**\n * We actually clear up the entire WC session and its wallet provider\n */\n const disconnectWalletAccount: WalletConnectSolanaWalletProvider['disconnectWalletAccount'] =\n async () => disconnect();\n\n /**\n * Helper function to make WalletConnect requests\n */\n // eslint-disable-next-line custom-rules/require-single-object-param\n const makeRequest = async <T extends AvailableSolanaSessionRequests>(\n request: SolanaSessionRequest<T>,\n walletAccount: SolanaWalletAccount\n ): Promise<SolanaSessionRequestResultMap[T]> => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const session = getSession();\n\n const peerMetadata = session.peer.metadata;\n\n if (methodsThatRequireUserAction.includes(request.method)) {\n emitEvent(\n {\n args: {\n walletMetadata: peerMetadata,\n walletProviderKey: key,\n },\n event: 'walletConnectUserActionRequested',\n },\n client\n );\n }\n\n const { networkData } = await getActiveNetworkData(\n { walletAccount },\n client\n );\n\n assertDefined(\n networkData,\n `Failed to get network data for wallet account ${walletAccount.address}`\n );\n\n return signClient.request<SolanaSessionRequestResultMap[T]>({\n chainId: `${namespaceKey}:${networkData.genesisHash}`,\n request,\n topic: sessionTopic,\n });\n };\n\n /**\n * Serializes a transaction for WalletConnect\n * Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L193\n */\n // eslint-disable-next-line custom-rules/require-single-object-param\n const serializeTransaction = (\n transaction: Transaction | VersionedTransaction\n ) => {\n const serialized = transaction.serialize({\n requireAllSignatures: false,\n verifySignatures: false,\n });\n\n return bs58.encode(new Uint8Array(serialized));\n };\n\n const signMessage: WalletConnectSolanaWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const publicKey = new PublicKey(walletAccount.address);\n\n const { signature } = await makeRequest(\n {\n method: 'solana_signMessage',\n params: { message, pubkey: publicKey.toBase58() },\n },\n walletAccount\n );\n\n const signatureBytes = bs58.decode(signature);\n\n return {\n signature: bufferToBase64(signatureBytes),\n };\n };\n\n const getConnectedAddresses: WalletConnectSolanaWalletProvider['getConnectedAddresses'] =\n async () => {\n const addresses = filterDuplicates(\n getSession().namespaces[namespaceKey].accounts.map(\n (account) => splitCaip10Token(account).address\n )\n );\n\n return { addresses };\n };\n\n const { cleanupEventEmitter, getEventEmitter } =\n createWalletConnectSessionEventEmitter({\n getSession,\n namespaceKey,\n sessionTopic,\n signClient,\n });\n\n const terminate: WalletConnectSolanaWalletProvider['terminate'] = async () =>\n cleanupEventEmitter();\n\n const signTransaction: WalletConnectSolanaWalletProvider['signTransaction'] =\n async ({ transaction, walletAccount }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n type T = typeof transaction;\n\n const serializedTransaction = serializeTransaction(transaction);\n\n // Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L98\n const { transaction: signedTransaction } = await makeRequest(\n {\n method: 'solana_signTransaction',\n params: { transaction: serializedTransaction },\n },\n walletAccount\n );\n\n const decodedTransaction = bs58.decode(signedTransaction);\n\n if (isVersionedTransaction(transaction)) {\n return {\n signedTransaction: VersionedTransaction.deserialize(\n decodedTransaction\n ) as T,\n };\n }\n\n return { signedTransaction: Transaction.from(decodedTransaction) as T };\n };\n\n const signAllTransactions: WalletConnectSolanaWalletProvider['signAllTransactions'] =\n async ({ transactions, walletAccount }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n type T = (typeof transactions)[number];\n\n const serializedTransactions = transactions.map(serializeTransaction);\n\n // Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L143\n const { transactions: signedTransactions } = await makeRequest(\n {\n method: 'solana_signAllTransactions',\n params: { transactions: serializedTransactions },\n },\n walletAccount\n );\n\n const signedTransactionsArray = signedTransactions.map(\n (signedTransaction, index) => {\n const originalTransaction = transactions[index];\n\n const decodedTransaction = bs58.decode(signedTransaction);\n\n if (isVersionedTransaction(originalTransaction)) {\n return VersionedTransaction.deserialize(decodedTransaction) as T;\n }\n\n return Transaction.from(decodedTransaction) as T;\n }\n );\n\n return { signedTransactions: signedTransactionsArray };\n };\n\n const signAndSendTransaction: WalletConnectSolanaWalletProvider['signAndSendTransaction'] =\n async ({ transaction, walletAccount }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const serializedTransaction = serializeTransaction(transaction);\n\n // Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L114\n const { signature } = await makeRequest(\n {\n method: 'solana_signAndSendTransaction',\n params: { transaction: serializedTransaction },\n },\n walletAccount\n );\n\n return { signature };\n };\n\n return {\n chain: 'SOL',\n confirmTransaction: (args) => solanaConfirmTransaction(args, client),\n disconnect,\n disconnectWalletAccount,\n get events() {\n return getEventEmitter();\n },\n executeSwapTransaction: (args) =>\n solanaExecuteSwapTransaction(args, client),\n getActiveNetworkId,\n getConnectedAddresses,\n getSession,\n groupKey: formatWalletProviderGroupKey(displayName),\n key,\n metadata: {\n displayName,\n icon: getSession().peer.metadata.icons[0],\n },\n namespaceKey,\n signAllTransactions,\n signAndSendTransaction,\n signMessage,\n signTransaction,\n switchActiveNetwork,\n terminate,\n transferAmount: (args) => solanaTransferAmount(args, client),\n walletProviderType,\n };\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n WalletProviderPriority,\n getWalletProviderRegistry,\n waitForProjectSettings,\n} from '@dynamic-labs-sdk/client/core';\nimport { getSignClient } from '@dynamic-labs-sdk/wallet-connect/core';\n\nimport { createWalletProviderFromWalletConnectSolanaSession } from '../createWalletProviderFromWalletConnectSolanaSession';\n\n/** @not-instrumented */\nexport const recoverSolanaWalletConnectWalletProviders = async (\n client: DynamicClient\n) => {\n await waitForProjectSettings(client);\n\n const signClient = await getSignClient(client);\n\n /**\n * Recreate the wallet providers for all existing Solana sessions\n */\n const sessions = signClient.session.getAll();\n\n const currentTime = Math.floor(Date.now() / 1000);\n\n for (const session of sessions) {\n if (!('solana' in session.namespaces)) {\n continue;\n }\n\n if (session.expiry <= currentTime) {\n continue;\n }\n\n const walletProvider =\n await createWalletProviderFromWalletConnectSolanaSession(\n {\n sessionTopic: session.topic,\n },\n client\n );\n\n getWalletProviderRegistry(client).register({\n priority: WalletProviderPriority.WALLET_SDK,\n walletProvider,\n });\n }\n};\n","import { getDefaultClient, hasExtension } from '@dynamic-labs-sdk/client';\nimport { registerExtension } from '@dynamic-labs-sdk/client/core';\n\nimport { registerSolanaNetworkProviderBuilder } from '../../registerSolanaNetworkProviderBuilder';\nimport { assertBufferAvailable } from '../../utils/assertBufferAvailable/assertBufferAvailable';\nimport { recoverSolanaWalletConnectWalletProviders } from '../recoverSolanaWalletConnectWalletProviders';\n\nexport const WALLET_CONNECT_SOLANA_EXTENSION_KEY = 'walletConnectSolana';\n\n/** @not-instrumented */\nexport const addWalletConnectSolanaExtension = async (\n client = getDefaultClient()\n) => {\n if (\n hasExtension({ extensionKey: WALLET_CONNECT_SOLANA_EXTENSION_KEY }, client)\n ) {\n return;\n }\n\n assertBufferAvailable();\n\n registerExtension(\n { extensionKey: WALLET_CONNECT_SOLANA_EXTENSION_KEY },\n client\n );\n\n registerSolanaNetworkProviderBuilder(client);\n\n await recoverSolanaWalletConnectWalletProviders(client);\n};\n","import { CHAINS_INFO_MAP } from '@dynamic-labs-sdk/client/core';\n\nexport const solanaApiChainName = CHAINS_INFO_MAP.SOL.apiChainName;\n\n/**\n * List of methods that may be requested from Solana wallet applications.\n *\n * Source: https://github.com/reown-com/appkit/blob/fe11a72507af09efcfe89228189aeda04dfe17a9/packages/appkit-utils/src/WCNamespaceUtil.ts#L9\n */\nexport const solanaMethods = [\n 'solana_signMessage',\n 'solana_signTransaction',\n 'solana_requestAccounts',\n 'solana_getAccounts',\n 'solana_signAllTransactions',\n 'solana_signAndSendTransaction',\n] as const;\n\n/**\n * List of blockchain hashes for all solana networks.\n *\n * You will find the main hashes here: https://namespaces.chainagnostic.org/solana/caip10\n * However, this list also includes the legacy hashes for mainnet and devnet for maximum compatibility.\n * You will find the legacy hashes here: https://chainagnostic.org/CAIPs/caip-30\n *\n * Note that this list was not originally fetched from those sources, however. Instead, we manually inspected\n * which networks were passed as argument to the signClient.connect method in the official reown Solana demo\n * which you can find here: https://lab.reown.com/appkit/?name=multichain-all\n */\nexport const solanaNetworks = [\n // mainnet\n 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n // legacy mainnet\n 'solana:4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ',\n // testnet\n 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n // devnet\n 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n // legacy devnet\n 'solana:8E9rvCKLFQia2Y35HXjjpWzj8weVo44K',\n] as const;\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { assertDefined } from '@dynamic-labs-sdk/client/core';\nimport type { WalletConnectConnectionResult } from '@dynamic-labs-sdk/wallet-connect';\nimport {\n getSignClient,\n importWalletConnectSession,\n} from '@dynamic-labs-sdk/wallet-connect/core';\n\nimport { solanaApiChainName, solanaMethods } from '../consts';\nimport { createWalletProviderFromWalletConnectSolanaSession } from '../createWalletProviderFromWalletConnectSolanaSession';\n\ntype ConnectWithWalletConnectSolanaParams = {\n /**\n * Whether this session's wallet accounts should be added to the dynamic's wallet accounts.\n */\n addToDynamicWalletAccounts?: boolean;\n};\n\n/** @not-instrumented */\nexport const connectWithWalletConnectSolana = async (\n {\n addToDynamicWalletAccounts = true,\n }: ConnectWithWalletConnectSolanaParams = {},\n client = getDefaultClient()\n): Promise<WalletConnectConnectionResult> => {\n const signClient = await getSignClient(client);\n\n assertDefined(client.projectSettings, 'Project settings unavailable');\n\n const solanaNetworks = client.projectSettings.networks?.find(\n (network) => network.chainName === solanaApiChainName\n )?.networks;\n\n assertDefined(solanaNetworks, 'Solana networks not found');\n\n /**\n * By inspecting the official reown Solana demo, we can see that the genesis hash is used as the chain id.\n * https://lab.reown.com/appkit/?name=multichain-all\n */\n const walletConnectChains = solanaNetworks.map(\n (network) => `solana:${network.genesisHash}`\n );\n\n /**\n * A WalletConnect connection request generates a URI and a promise.\n *\n * The URI must be handed to an external wallet application that will use it\n * to establish a connection via a WalletConnect relay server. Typically, this\n * is done by scanning a QR code or deep linking to the wallet application.\n *\n * The promise will resolve when the connection is established.\n */\n const { approval, uri } = await signClient.connect({\n optionalNamespaces: {\n solana: {\n chains: walletConnectChains,\n events: ['accountsChanged', 'chainChanged', 'disconnected'],\n methods: solanaMethods as unknown as string[],\n },\n },\n });\n\n assertDefined(\n uri,\n 'Failed to establish WalletConnect session: no URI returned'\n );\n\n /**\n * Once the approval promise resolves, the WalletConnect session is established\n * between the wallet application and the dapp (this app).\n */\n const walletAccountsPromise = approval().then(async (session) => {\n assertDefined(\n session.namespaces.solana,\n `WalletConnect session did not establish a Solana connection. Found instead: ${Object.keys(\n session.namespaces\n ).join(', ')}`\n );\n\n return importWalletConnectSession(\n {\n addToDynamicWalletAccounts,\n sessionTopic: session.topic,\n walletProviderBuilder:\n createWalletProviderFromWalletConnectSolanaSession,\n },\n client\n );\n });\n\n return { approval: () => walletAccountsPromise, uri };\n};\n","import { verifyWalletAccount } from '@dynamic-labs-sdk/client';\nimport { assertDefined, getDefaultClient } from '@dynamic-labs-sdk/client/core';\nimport type { WalletConnectConnectionResult } from '@dynamic-labs-sdk/wallet-connect';\n\nimport { connectWithWalletConnectSolana } from '../connectWithWalletConnectSolana';\n\n/**\n * Connects to a WalletConnect Solana wallet and verifies ownership through message signing.\n *\n * This function will first perform a regular connect and then verify the wallet accounts via\n * verifyWalletAccount.\n *\n * **Note on connecting and verifying in a single step:**\n * Currently WalletConnect does NOT support the authenticate method for any non eip155 chains.\n * This means there is no way to perform connection and verification in a single step.\n * This can easily be tested by attempting to call `signClient.authenticate` with a solana namespace\n * and checking whether WalletConnect will throw the following error:\n * ```\n * 'Only eip155 namespace is supported for authenticated sessions. Please use .connect() for non-eip155 chains.'\n * ```\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns A promise that resolves to the connected and verified wallet account.\n * @not-instrumented\n */\nexport const connectAndVerifyWithWalletConnectSolana = async (\n client = getDefaultClient()\n): Promise<WalletConnectConnectionResult> => {\n const { approval, uri } = await connectWithWalletConnectSolana(\n // We don't want to add the wallet accounts to the dynamic's wallet accounts state\n // while we are still verifying them.\n { addToDynamicWalletAccounts: false },\n client\n );\n\n assertDefined(\n uri,\n 'Failed to establish WalletConnect session: no URI returned'\n );\n\n /**\n * Once the approval promise resolves, the WalletConnect session is established\n * between the wallet application and the dapp (this app).\n */\n const walletAccountsPromise = approval().then(async ({ walletAccounts }) => {\n // This should not be concurrent because the first will be a verify and the rest will be a link\n for (const walletAccount of walletAccounts) {\n await verifyWalletAccount({ walletAccount }, client);\n }\n\n return { walletAccounts };\n });\n\n return { approval: () => walletAccountsPromise, uri };\n};\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 { addWalletConnectSolanaExtension } from '../walletConnect/addWalletConnectSolanaExtension';\nexport { connectAndVerifyWithWalletConnectSolana } from '../walletConnect/connectAndVerifyWithWalletConnectSolana';\nexport { connectWithWalletConnectSolana } from '../walletConnect/connectWithWalletConnectSolana';\nexport type { WalletConnectSolanaWalletProvider } from '../walletConnect/walletConnectSolanaWalletProvider.types';\n"],"mappings":"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"}
1
+ {"version":3,"file":"walletConnect.esm.js","names":["methodsThatRequireUserAction: string[]","getActiveNetworkId: WalletConnectSolanaWalletProvider['getActiveNetworkId']","switchActiveNetwork: WalletConnectSolanaWalletProvider['switchActiveNetwork']","disconnectWalletAccount: WalletConnectSolanaWalletProvider['disconnectWalletAccount']","signMessage: WalletConnectSolanaWalletProvider['signMessage']","getConnectedAddresses: WalletConnectSolanaWalletProvider['getConnectedAddresses']","destroy: NonNullable<\n WalletConnectSolanaWalletProvider['destroy']\n >","signTransaction: WalletConnectSolanaWalletProvider['signTransaction']","signAllTransactions: WalletConnectSolanaWalletProvider['signAllTransactions']","signAndSendTransaction: WalletConnectSolanaWalletProvider['signAndSendTransaction']","getDefaultClient","hasExtension","getDefaultClient","packageName","packageVersion"],"sources":["../src/walletConnect/createWalletProviderFromWalletConnectSolanaSession/createWalletProviderFromWalletConnectSolanaSession.ts","../src/walletConnect/recoverSolanaWalletConnectWalletProviders/recoverSolanaWalletConnectWalletProviders.ts","../src/walletConnect/addWalletConnectSolanaExtension/addWalletConnectSolanaExtension.ts","../src/walletConnect/consts.ts","../src/walletConnect/connectWithWalletConnectSolana/connectWithWalletConnectSolana.ts","../src/walletConnect/connectAndVerifyWithWalletConnectSolana/connectAndVerifyWithWalletConnectSolana.ts","../src/exports/walletConnect.ts"],"sourcesContent":["import {\n type DynamicClient,\n getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n bufferToBase64,\n emitEvent,\n filterDuplicates,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n getCore,\n getWalletProviderRegistry,\n switchActiveNetworkInLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport { SessionClosedUnexpectedlyError } from '@dynamic-labs-sdk/wallet-connect';\nimport {\n createWalletConnectSessionEventEmitter,\n getSignClient,\n splitCaip10Token,\n} from '@dynamic-labs-sdk/wallet-connect/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { PublicKey, Transaction, VersionedTransaction } from '@solana/web3.js';\nimport { SDK_ERRORS } from '@walletconnect/utils';\nimport bs58 from 'bs58';\n\nimport type { SolanaWalletAccount } from '../../SolanaWalletAccount.types';\nimport { isVersionedTransaction } from '../../utils/isVersionedTransaction';\nimport { solanaConfirmTransaction } from '../../utils/solanaConfirmTransaction';\nimport { solanaExecuteSwapTransaction } from '../../utils/solanaExecuteSwapTransaction';\nimport { solanaTransferAmount } from '../../utils/solanaTransferAmount';\nimport type { solanaMethods } from '../consts';\nimport type { WalletConnectSolanaWalletProvider } from '../walletConnectSolanaWalletProvider.types';\nimport type {\n AvailableSolanaSessionRequests,\n SolanaSessionRequest,\n SolanaSessionRequestResultMap,\n} from './walletConnectSolanaSessionRequest.types';\n\ntype createWalletProviderFromWalletConnectSolanaSessionParams = {\n sessionTopic: string;\n};\n\n/**\n * The list of Solana request methods that require user action.\n * We will raise a user action requested event for these methods.\n */\nconst methodsThatRequireUserAction: string[] = [\n 'solana_signMessage',\n 'solana_signTransaction',\n 'solana_signAllTransactions',\n 'solana_signAndSendTransaction',\n] satisfies (typeof solanaMethods)[number][];\n\n/** @not-instrumented */\nexport const createWalletProviderFromWalletConnectSolanaSession = async (\n { sessionTopic }: createWalletProviderFromWalletConnectSolanaSessionParams,\n client: DynamicClient\n): Promise<WalletConnectSolanaWalletProvider> => {\n const signClient = await getSignClient(client);\n\n const getSession = () => {\n const session = signClient.session.get(sessionTopic);\n\n if (!session) {\n // destroy never throws (it logs internally), but explicit .catch makes\n // the fire-and-forget intent obvious and silences static analyzers.\n destroy().catch(() => undefined);\n\n throw new SessionClosedUnexpectedlyError({\n sessionTopic,\n walletDisplayName: displayName,\n });\n }\n\n return session;\n };\n\n const displayName = getSession().peer.metadata.name;\n\n const namespaceKey = 'solana';\n\n const walletProviderType = WalletProviderEnum.WalletConnect;\n\n const key = formatWalletProviderKey({\n chain: 'SOL',\n displayName,\n suffix: sessionTopic,\n walletProviderType,\n });\n\n const getActiveNetworkId: WalletConnectSolanaWalletProvider['getActiveNetworkId'] =\n async () => {\n // Assert the session is still valid\n getSession();\n\n return await getActiveNetworkIdFromLastKnownRegistry({\n client,\n walletProviderKey: key,\n });\n };\n\n const switchActiveNetwork: WalletConnectSolanaWalletProvider['switchActiveNetwork'] =\n async ({ networkId }) => {\n // Assert the session is still valid\n getSession();\n\n await switchActiveNetworkInLastKnownRegistry({\n client,\n networkId,\n walletProviderKey: key,\n });\n };\n\n /**\n * We actually clear up the entire WC session and its wallet provider\n */\n const disconnectWalletAccount: WalletConnectSolanaWalletProvider['disconnectWalletAccount'] =\n async () => destroy();\n\n /**\n * Helper function to make WalletConnect requests\n */\n // eslint-disable-next-line custom-rules/require-single-object-param\n const makeRequest = async <T extends AvailableSolanaSessionRequests>(\n request: SolanaSessionRequest<T>,\n walletAccount: SolanaWalletAccount\n ): Promise<SolanaSessionRequestResultMap[T]> => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const session = getSession();\n\n const peerMetadata = session.peer.metadata;\n\n if (methodsThatRequireUserAction.includes(request.method)) {\n emitEvent(\n {\n args: {\n walletMetadata: peerMetadata,\n walletProviderKey: key,\n },\n event: 'walletConnectUserActionRequested',\n },\n client\n );\n }\n\n const { networkData } = await getActiveNetworkData(\n { walletAccount },\n client\n );\n\n assertDefined(\n networkData,\n `Failed to get network data for wallet account ${walletAccount.address}`\n );\n\n return signClient.request<SolanaSessionRequestResultMap[T]>({\n chainId: `${namespaceKey}:${networkData.genesisHash}`,\n request,\n topic: sessionTopic,\n });\n };\n\n /**\n * Serializes a transaction for WalletConnect\n * Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L193\n */\n // eslint-disable-next-line custom-rules/require-single-object-param\n const serializeTransaction = (\n transaction: Transaction | VersionedTransaction\n ) => {\n const serialized = transaction.serialize({\n requireAllSignatures: false,\n verifySignatures: false,\n });\n\n return bs58.encode(new Uint8Array(serialized));\n };\n\n const signMessage: WalletConnectSolanaWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const publicKey = new PublicKey(walletAccount.address);\n\n const { signature } = await makeRequest(\n {\n method: 'solana_signMessage',\n params: { message, pubkey: publicKey.toBase58() },\n },\n walletAccount\n );\n\n const signatureBytes = bs58.decode(signature);\n\n return {\n signature: bufferToBase64(signatureBytes),\n };\n };\n\n const getConnectedAddresses: WalletConnectSolanaWalletProvider['getConnectedAddresses'] =\n async () => {\n const addresses = filterDuplicates(\n getSession().namespaces[namespaceKey].accounts.map(\n (account) => splitCaip10Token(account).address\n )\n );\n\n return { addresses };\n };\n\n const { cleanupEventEmitter, getEventEmitter } =\n createWalletConnectSessionEventEmitter({\n getSession,\n namespaceKey,\n sessionTopic,\n signClient,\n });\n\n const destroy: NonNullable<\n WalletConnectSolanaWalletProvider['destroy']\n > = async () => {\n cleanupEventEmitter();\n try {\n await signClient.disconnect({\n reason: SDK_ERRORS.USER_DISCONNECTED,\n topic: sessionTopic,\n });\n\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n walletProviderRegistry.unregister(key);\n } catch (err) {\n getCore(client).logger.error(\n `[${key}] destroy: remote signal failed`,\n err\n );\n }\n };\n\n const signTransaction: WalletConnectSolanaWalletProvider['signTransaction'] =\n async ({ transaction, walletAccount }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n type T = typeof transaction;\n\n const serializedTransaction = serializeTransaction(transaction);\n\n // Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L98\n const { transaction: signedTransaction } = await makeRequest(\n {\n method: 'solana_signTransaction',\n params: { transaction: serializedTransaction },\n },\n walletAccount\n );\n\n const decodedTransaction = bs58.decode(signedTransaction);\n\n if (isVersionedTransaction(transaction)) {\n return {\n signedTransaction: VersionedTransaction.deserialize(\n decodedTransaction\n ) as T,\n };\n }\n\n return { signedTransaction: Transaction.from(decodedTransaction) as T };\n };\n\n const signAllTransactions: WalletConnectSolanaWalletProvider['signAllTransactions'] =\n async ({ transactions, walletAccount }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n type T = (typeof transactions)[number];\n\n const serializedTransactions = transactions.map(serializeTransaction);\n\n // Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L143\n const { transactions: signedTransactions } = await makeRequest(\n {\n method: 'solana_signAllTransactions',\n params: { transactions: serializedTransactions },\n },\n walletAccount\n );\n\n const signedTransactionsArray = signedTransactions.map(\n (signedTransaction, index) => {\n const originalTransaction = transactions[index];\n\n const decodedTransaction = bs58.decode(signedTransaction);\n\n if (isVersionedTransaction(originalTransaction)) {\n return VersionedTransaction.deserialize(decodedTransaction) as T;\n }\n\n return Transaction.from(decodedTransaction) as T;\n }\n );\n\n return { signedTransactions: signedTransactionsArray };\n };\n\n const signAndSendTransaction: WalletConnectSolanaWalletProvider['signAndSendTransaction'] =\n async ({ transaction, walletAccount }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const serializedTransaction = serializeTransaction(transaction);\n\n // Reference: https://github.com/reown-com/appkit/blob/552b6b39b46e6c604b4d7d290634b9fa96bf7ed0/packages/adapters/solana/src/providers/AuthProvider.ts#L114\n const { signature } = await makeRequest(\n {\n method: 'solana_signAndSendTransaction',\n params: { transaction: serializedTransaction },\n },\n walletAccount\n );\n\n return { signature };\n };\n\n return {\n chain: 'SOL',\n confirmTransaction: (args) => solanaConfirmTransaction(args, client),\n destroy,\n disconnectWalletAccount,\n get events() {\n return getEventEmitter();\n },\n executeSwapTransaction: (args) =>\n solanaExecuteSwapTransaction(args, client),\n getActiveNetworkId,\n getConnectedAddresses,\n getSession,\n groupKey: formatWalletProviderGroupKey(displayName),\n key,\n metadata: {\n displayName,\n icon: getSession().peer.metadata.icons[0],\n },\n namespaceKey,\n signAllTransactions,\n signAndSendTransaction,\n signMessage,\n signTransaction,\n switchActiveNetwork,\n transferAmount: (args) => solanaTransferAmount(args, client),\n walletProviderType,\n };\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n WalletProviderPriority,\n getWalletProviderRegistry,\n waitForProjectSettings,\n} from '@dynamic-labs-sdk/client/core';\nimport { getSignClient } from '@dynamic-labs-sdk/wallet-connect/core';\n\nimport { createWalletProviderFromWalletConnectSolanaSession } from '../createWalletProviderFromWalletConnectSolanaSession';\n\n/** @not-instrumented */\nexport const recoverSolanaWalletConnectWalletProviders = async (\n client: DynamicClient\n) => {\n await waitForProjectSettings(client);\n\n const signClient = await getSignClient(client);\n\n /**\n * Recreate the wallet providers for all existing Solana sessions\n */\n const sessions = signClient.session.getAll();\n\n const currentTime = Math.floor(Date.now() / 1000);\n\n for (const session of sessions) {\n if (!('solana' in session.namespaces)) {\n continue;\n }\n\n if (session.expiry <= currentTime) {\n continue;\n }\n\n const walletProvider =\n await createWalletProviderFromWalletConnectSolanaSession(\n {\n sessionTopic: session.topic,\n },\n client\n );\n\n getWalletProviderRegistry(client).register({\n priority: WalletProviderPriority.WALLET_SDK,\n walletProvider,\n });\n }\n};\n","import { getDefaultClient, hasExtension } from '@dynamic-labs-sdk/client';\nimport { registerExtension } from '@dynamic-labs-sdk/client/core';\n\nimport { registerSolanaNetworkProviderBuilder } from '../../registerSolanaNetworkProviderBuilder';\nimport { assertBufferAvailable } from '../../utils/assertBufferAvailable/assertBufferAvailable';\nimport { recoverSolanaWalletConnectWalletProviders } from '../recoverSolanaWalletConnectWalletProviders';\n\nexport const WALLET_CONNECT_SOLANA_EXTENSION_KEY = 'walletConnectSolana';\n\n/** @not-instrumented */\nexport const addWalletConnectSolanaExtension = async (\n client = getDefaultClient()\n) => {\n if (\n hasExtension({ extensionKey: WALLET_CONNECT_SOLANA_EXTENSION_KEY }, client)\n ) {\n return;\n }\n\n assertBufferAvailable();\n\n registerExtension(\n { extensionKey: WALLET_CONNECT_SOLANA_EXTENSION_KEY },\n client\n );\n\n registerSolanaNetworkProviderBuilder(client);\n\n await recoverSolanaWalletConnectWalletProviders(client);\n};\n","import { CHAINS_INFO_MAP } from '@dynamic-labs-sdk/client/core';\n\nexport const solanaApiChainName = CHAINS_INFO_MAP.SOL.apiChainName;\n\n/**\n * List of methods that may be requested from Solana wallet applications.\n *\n * Source: https://github.com/reown-com/appkit/blob/fe11a72507af09efcfe89228189aeda04dfe17a9/packages/appkit-utils/src/WCNamespaceUtil.ts#L9\n */\nexport const solanaMethods = [\n 'solana_signMessage',\n 'solana_signTransaction',\n 'solana_requestAccounts',\n 'solana_getAccounts',\n 'solana_signAllTransactions',\n 'solana_signAndSendTransaction',\n] as const;\n\n/**\n * List of blockchain hashes for all solana networks.\n *\n * You will find the main hashes here: https://namespaces.chainagnostic.org/solana/caip10\n * However, this list also includes the legacy hashes for mainnet and devnet for maximum compatibility.\n * You will find the legacy hashes here: https://chainagnostic.org/CAIPs/caip-30\n *\n * Note that this list was not originally fetched from those sources, however. Instead, we manually inspected\n * which networks were passed as argument to the signClient.connect method in the official reown Solana demo\n * which you can find here: https://lab.reown.com/appkit/?name=multichain-all\n */\nexport const solanaNetworks = [\n // mainnet\n 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n // legacy mainnet\n 'solana:4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ',\n // testnet\n 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n // devnet\n 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n // legacy devnet\n 'solana:8E9rvCKLFQia2Y35HXjjpWzj8weVo44K',\n] as const;\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { assertDefined } from '@dynamic-labs-sdk/client/core';\nimport type { WalletConnectConnectionResult } from '@dynamic-labs-sdk/wallet-connect';\nimport {\n getSignClient,\n importWalletConnectSession,\n} from '@dynamic-labs-sdk/wallet-connect/core';\n\nimport { solanaApiChainName, solanaMethods } from '../consts';\nimport { createWalletProviderFromWalletConnectSolanaSession } from '../createWalletProviderFromWalletConnectSolanaSession';\n\ntype ConnectWithWalletConnectSolanaParams = {\n /**\n * Whether this session's wallet accounts should be added to the dynamic's wallet accounts.\n */\n addToDynamicWalletAccounts?: boolean;\n};\n\n/** @not-instrumented */\nexport const connectWithWalletConnectSolana = async (\n {\n addToDynamicWalletAccounts = true,\n }: ConnectWithWalletConnectSolanaParams = {},\n client = getDefaultClient()\n): Promise<WalletConnectConnectionResult> => {\n const signClient = await getSignClient(client);\n\n assertDefined(client.projectSettings, 'Project settings unavailable');\n\n const solanaNetworks = client.projectSettings.networks?.find(\n (network) => network.chainName === solanaApiChainName\n )?.networks;\n\n assertDefined(solanaNetworks, 'Solana networks not found');\n\n /**\n * By inspecting the official reown Solana demo, we can see that the genesis hash is used as the chain id.\n * https://lab.reown.com/appkit/?name=multichain-all\n */\n const walletConnectChains = solanaNetworks.map(\n (network) => `solana:${network.genesisHash}`\n );\n\n /**\n * A WalletConnect connection request generates a URI and a promise.\n *\n * The URI must be handed to an external wallet application that will use it\n * to establish a connection via a WalletConnect relay server. Typically, this\n * is done by scanning a QR code or deep linking to the wallet application.\n *\n * The promise will resolve when the connection is established.\n */\n const { approval, uri } = await signClient.connect({\n optionalNamespaces: {\n solana: {\n chains: walletConnectChains,\n events: ['accountsChanged', 'chainChanged', 'disconnected'],\n methods: solanaMethods as unknown as string[],\n },\n },\n });\n\n assertDefined(\n uri,\n 'Failed to establish WalletConnect session: no URI returned'\n );\n\n /**\n * Once the approval promise resolves, the WalletConnect session is established\n * between the wallet application and the dapp (this app).\n */\n const walletAccountsPromise = approval().then(async (session) => {\n assertDefined(\n session.namespaces.solana,\n `WalletConnect session did not establish a Solana connection. Found instead: ${Object.keys(\n session.namespaces\n ).join(', ')}`\n );\n\n return importWalletConnectSession(\n {\n addToDynamicWalletAccounts,\n sessionTopic: session.topic,\n walletProviderBuilder:\n createWalletProviderFromWalletConnectSolanaSession,\n },\n client\n );\n });\n\n return { approval: () => walletAccountsPromise, uri };\n};\n","import { verifyWalletAccount } from '@dynamic-labs-sdk/client';\nimport { assertDefined, getDefaultClient } from '@dynamic-labs-sdk/client/core';\nimport type { WalletConnectConnectionResult } from '@dynamic-labs-sdk/wallet-connect';\n\nimport { connectWithWalletConnectSolana } from '../connectWithWalletConnectSolana';\n\n/**\n * Connects to a WalletConnect Solana wallet and verifies ownership through message signing.\n *\n * This function will first perform a regular connect and then verify the wallet accounts via\n * verifyWalletAccount.\n *\n * **Note on connecting and verifying in a single step:**\n * Currently WalletConnect does NOT support the authenticate method for any non eip155 chains.\n * This means there is no way to perform connection and verification in a single step.\n * This can easily be tested by attempting to call `signClient.authenticate` with a solana namespace\n * and checking whether WalletConnect will throw the following error:\n * ```\n * 'Only eip155 namespace is supported for authenticated sessions. Please use .connect() for non-eip155 chains.'\n * ```\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns A promise that resolves to the connected and verified wallet account.\n * @not-instrumented\n */\nexport const connectAndVerifyWithWalletConnectSolana = async (\n client = getDefaultClient()\n): Promise<WalletConnectConnectionResult> => {\n const { approval, uri } = await connectWithWalletConnectSolana(\n // We don't want to add the wallet accounts to the dynamic's wallet accounts state\n // while we are still verifying them.\n { addToDynamicWalletAccounts: false },\n client\n );\n\n assertDefined(\n uri,\n 'Failed to establish WalletConnect session: no URI returned'\n );\n\n /**\n * Once the approval promise resolves, the WalletConnect session is established\n * between the wallet application and the dapp (this app).\n */\n const walletAccountsPromise = approval().then(async ({ walletAccounts }) => {\n // This should not be concurrent because the first will be a verify and the rest will be a link\n for (const walletAccount of walletAccounts) {\n await verifyWalletAccount({ walletAccount }, client);\n }\n\n return { walletAccounts };\n });\n\n return { approval: () => walletAccountsPromise, uri };\n};\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 { addWalletConnectSolanaExtension } from '../walletConnect/addWalletConnectSolanaExtension';\nexport { connectAndVerifyWithWalletConnectSolana } from '../walletConnect/connectAndVerifyWithWalletConnectSolana';\nexport { connectWithWalletConnectSolana } from '../walletConnect/connectWithWalletConnectSolana';\nexport type { WalletConnectSolanaWalletProvider } from '../walletConnect/walletConnectSolanaWalletProvider.types';\n"],"mappings":";;;;;;;;;;;;;;;;;AAgDA,MAAMA,+BAAyC;CAC7C;CACA;CACA;CACA;CACD;;AAGD,MAAa,qDAAqD,OAChE,EAAE,gBACF,WAC+C;CAC/C,MAAM,aAAa,MAAM,cAAc,OAAO;CAE9C,MAAM,mBAAmB;EACvB,MAAM,UAAU,WAAW,QAAQ,IAAI,aAAa;AAEpD,MAAI,CAAC,SAAS;AAGZ,YAAS,CAAC,YAAY,OAAU;AAEhC,SAAM,IAAI,+BAA+B;IACvC;IACA,mBAAmB;IACpB,CAAC;;AAGJ,SAAO;;CAGT,MAAM,cAAc,YAAY,CAAC,KAAK,SAAS;CAE/C,MAAM,eAAe;CAErB,MAAM,qBAAqB,mBAAmB;CAE9C,MAAM,MAAM,wBAAwB;EAClC,OAAO;EACP;EACA,QAAQ;EACR;EACD,CAAC;CAEF,MAAMC,qBACJ,YAAY;AAEV,cAAY;AAEZ,SAAO,MAAM,wCAAwC;GACnD;GACA,mBAAmB;GACpB,CAAC;;CAGN,MAAMC,sBACJ,OAAO,EAAE,gBAAgB;AAEvB,cAAY;AAEZ,QAAM,uCAAuC;GAC3C;GACA;GACA,mBAAmB;GACpB,CAAC;;;;;CAMN,MAAMC,0BACJ,YAAY,SAAS;;;;CAMvB,MAAM,cAAc,OAClB,SACA,kBAC8C;AAC9C,gBAAc,eAAe,6BAA6B;EAI1D,MAAM,eAFU,YAAY,CAEC,KAAK;AAElC,MAAI,6BAA6B,SAAS,QAAQ,OAAO,CACvD,WACE;GACE,MAAM;IACJ,gBAAgB;IAChB,mBAAmB;IACpB;GACD,OAAO;GACR,EACD,OACD;EAGH,MAAM,EAAE,gBAAgB,MAAM,qBAC5B,EAAE,eAAe,EACjB,OACD;AAED,gBACE,aACA,iDAAiD,cAAc,UAChE;AAED,SAAO,WAAW,QAA0C;GAC1D,SAAS,GAAG,aAAa,GAAG,YAAY;GACxC;GACA,OAAO;GACR,CAAC;;;;;;CAQJ,MAAM,wBACJ,gBACG;EACH,MAAM,aAAa,YAAY,UAAU;GACvC,sBAAsB;GACtB,kBAAkB;GACnB,CAAC;AAEF,SAAO,KAAK,OAAO,IAAI,WAAW,WAAW,CAAC;;CAGhD,MAAMC,cAAgE,OAAO,EAC3E,SACA,oBACI;AACJ,gBAAc,eAAe,6BAA6B;EAI1D,MAAM,EAAE,cAAc,MAAM,YAC1B;GACE,QAAQ;GACR,QAAQ;IAAE;IAAS,QALL,IAAI,UAAU,cAAc,QAAQ,CAKb,UAAU;IAAE;GAClD,EACD,cACD;AAID,SAAO,EACL,WAAW,eAHU,KAAK,OAAO,UAAU,CAGF,EAC1C;;CAGH,MAAMC,wBACJ,YAAY;AAOV,SAAO,EAAE,WANS,iBAChB,YAAY,CAAC,WAAW,cAAc,SAAS,KAC5C,YAAY,iBAAiB,QAAQ,CAAC,QACxC,CACF,EAEmB;;CAGxB,MAAM,EAAE,qBAAqB,oBAC3B,uCAAuC;EACrC;EACA;EACA;EACA;EACD,CAAC;CAEJ,MAAMC,UAEF,YAAY;AACd,uBAAqB;AACrB,MAAI;AACF,SAAM,WAAW,WAAW;IAC1B,QAAQ,WAAW;IACnB,OAAO;IACR,CAAC;AAIF,GAF+B,0BAA0B,OAAO,CAEzC,WAAW,IAAI;WAC/B,KAAK;AACZ,WAAQ,OAAO,CAAC,OAAO,MACrB,IAAI,IAAI,kCACR,IACD;;;CAIL,MAAMC,kBACJ,OAAO,EAAE,aAAa,oBAAoB;AACxC,gBAAc,eAAe,6BAA6B;EAO1D,MAAM,EAAE,aAAa,sBAAsB,MAAM,YAC/C;GACE,QAAQ;GACR,QAAQ,EAAE,aANgB,qBAAqB,YAAY,EAMb;GAC/C,EACD,cACD;EAED,MAAM,qBAAqB,KAAK,OAAO,kBAAkB;AAEzD,MAAI,uBAAuB,YAAY,CACrC,QAAO,EACL,mBAAmB,qBAAqB,YACtC,mBACD,EACF;AAGH,SAAO,EAAE,mBAAmB,YAAY,KAAK,mBAAmB,EAAO;;CAG3E,MAAMC,sBACJ,OAAO,EAAE,cAAc,oBAAoB;AACzC,gBAAc,eAAe,6BAA6B;EAO1D,MAAM,EAAE,cAAc,uBAAuB,MAAM,YACjD;GACE,QAAQ;GACR,QAAQ,EAAE,cANiB,aAAa,IAAI,qBAAqB,EAMjB;GACjD,EACD,cACD;AAgBD,SAAO,EAAE,oBAduB,mBAAmB,KAChD,mBAAmB,UAAU;GAC5B,MAAM,sBAAsB,aAAa;GAEzC,MAAM,qBAAqB,KAAK,OAAO,kBAAkB;AAEzD,OAAI,uBAAuB,oBAAoB,CAC7C,QAAO,qBAAqB,YAAY,mBAAmB;AAG7D,UAAO,YAAY,KAAK,mBAAmB;IAE9C,EAEqD;;CAG1D,MAAMC,yBACJ,OAAO,EAAE,aAAa,oBAAoB;AACxC,gBAAc,eAAe,6BAA6B;EAK1D,MAAM,EAAE,cAAc,MAAM,YAC1B;GACE,QAAQ;GACR,QAAQ,EAAE,aANgB,qBAAqB,YAAY,EAMb;GAC/C,EACD,cACD;AAED,SAAO,EAAE,WAAW;;AAGxB,QAAO;EACL,OAAO;EACP,qBAAqB,SAAS,yBAAyB,MAAM,OAAO;EACpE;EACA;EACA,IAAI,SAAS;AACX,UAAO,iBAAiB;;EAE1B,yBAAyB,SACvB,6BAA6B,MAAM,OAAO;EAC5C;EACA;EACA;EACA,UAAU,6BAA6B,YAAY;EACnD;EACA,UAAU;GACR;GACA,MAAM,YAAY,CAAC,KAAK,SAAS,MAAM;GACxC;EACD;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB,SAAS,qBAAqB,MAAM,OAAO;EAC5D;EACD;;;;;;ACtVH,MAAa,4CAA4C,OACvD,WACG;AACH,OAAM,uBAAuB,OAAO;;;;CAOpC,MAAM,YALa,MAAM,cAAc,OAAO,EAKlB,QAAQ,QAAQ;CAE5C,MAAM,cAAc,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;AAEjD,MAAK,MAAM,WAAW,UAAU;AAC9B,MAAI,EAAE,YAAY,QAAQ,YACxB;AAGF,MAAI,QAAQ,UAAU,YACpB;EAGF,MAAM,iBACJ,MAAM,mDACJ,EACE,cAAc,QAAQ,OACvB,EACD,OACD;AAEH,4BAA0B,OAAO,CAAC,SAAS;GACzC,UAAU,uBAAuB;GACjC;GACD,CAAC;;;;;;ACtCN,MAAa,sCAAsC;;AAGnD,MAAa,kCAAkC,OAC7C,SAASC,oBAAkB,KACxB;AACH,KACEC,eAAa,EAAE,cAAc,qCAAqC,EAAE,OAAO,CAE3E;AAGF,wBAAuB;AAEvB,mBACE,EAAE,cAAc,qCAAqC,EACrD,OACD;AAED,sCAAqC,OAAO;AAE5C,OAAM,0CAA0C,OAAO;;;;;AC1BzD,MAAa,qBAAqB,gBAAgB,IAAI;;;;;;AAOtD,MAAa,gBAAgB;CAC3B;CACA;CACA;CACA;CACA;CACA;CACD;;;;;ACGD,MAAa,iCAAiC,OAC5C,EACE,6BAA6B,SACW,EAAE,EAC5C,SAASC,oBAAkB,KACgB;CAC3C,MAAM,aAAa,MAAM,cAAc,OAAO;AAE9C,eAAc,OAAO,iBAAiB,+BAA+B;CAErE,MAAM,iBAAiB,OAAO,gBAAgB,UAAU,MACrD,YAAY,QAAQ,cAAc,mBACpC,EAAE;AAEH,eAAc,gBAAgB,4BAA4B;;;;;CAM1D,MAAM,sBAAsB,eAAe,KACxC,YAAY,UAAU,QAAQ,cAChC;;;;;;;;;;CAWD,MAAM,EAAE,UAAU,QAAQ,MAAM,WAAW,QAAQ,EACjD,oBAAoB,EAClB,QAAQ;EACN,QAAQ;EACR,QAAQ;GAAC;GAAmB;GAAgB;GAAe;EAC3D,SAAS;EACV,EACF,EACF,CAAC;AAEF,eACE,KACA,6DACD;;;;;CAMD,MAAM,wBAAwB,UAAU,CAAC,KAAK,OAAO,YAAY;AAC/D,gBACE,QAAQ,WAAW,QACnB,+EAA+E,OAAO,KACpF,QAAQ,WACT,CAAC,KAAK,KAAK,GACb;AAED,SAAO,2BACL;GACE;GACA,cAAc,QAAQ;GACtB,uBACE;GACH,EACD,OACD;GACD;AAEF,QAAO;EAAE,gBAAgB;EAAuB;EAAK;;;;;;;;;;;;;;;;;;;;;;;;ACjEvD,MAAa,0CAA0C,OACrD,SAAS,kBAAkB,KACgB;CAC3C,MAAM,EAAE,UAAU,QAAQ,MAAM,+BAG9B,EAAE,4BAA4B,OAAO,EACrC,OACD;AAED,eACE,KACA,6DACD;;;;;CAMD,MAAM,wBAAwB,UAAU,CAAC,KAAK,OAAO,EAAE,qBAAqB;AAE1E,OAAK,MAAM,iBAAiB,eAC1B,OAAM,oBAAoB,EAAE,eAAe,EAAE,OAAO;AAGtD,SAAO,EAAE,gBAAgB;GACzB;AAEF,QAAO;EAAE,gBAAgB;EAAuB;EAAK;;;;;AC/CvD,qBAAqBC,MAAaC,QAAe"}
@@ -1 +1 @@
1
- {"version":3,"file":"createWalletProviderFromSolanaStandardWallet.d.ts","sourceRoot":"","sources":["../../../../src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/createWalletProviderFromSolanaStandardWallet.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,0BAA0B,CAAC;AAYlC,OAAO,KAAK,EAAE,MAAM,IAAI,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAQhF,KAAK,kDAAkD,GAAG;IACxD,aAAa,EAAE,aAAa,CAAC;IAC7B,oBAAoB,EAAE,oBAAoB,CAAC;CAC5C,CAAC;AAEF,wBAAwB;AACxB,eAAO,MAAM,4CAA4C,6CAGtD,kDAAkD,KAAG,oBAuRvD,CAAC"}
1
+ {"version":3,"file":"createWalletProviderFromSolanaStandardWallet.d.ts","sourceRoot":"","sources":["../../../../src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/createWalletProviderFromSolanaStandardWallet.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,0BAA0B,CAAC;AAalC,OAAO,KAAK,EAAE,MAAM,IAAI,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAQhF,KAAK,kDAAkD,GAAG;IACxD,aAAa,EAAE,aAAa,CAAC;IAC7B,oBAAoB,EAAE,oBAAoB,CAAC;CAC5C,CAAC;AAEF,wBAAwB;AACxB,eAAO,MAAM,4CAA4C,6CAGtD,kDAAkD,KAAG,oBA8RvD,CAAC"}
@@ -1,6 +1,6 @@
1
1
  const require_chunk = require('./chunk-CbDLau6x.cjs');
2
- const require_solanaTransferAmount = require('./solanaTransferAmount-CZjIlZKZ.cjs');
3
- const require_addSolanaWalletStandardExtension = require('./addSolanaWalletStandardExtension-X8e2MusO.cjs');
2
+ const require_solanaTransferAmount = require('./solanaTransferAmount-DkQcGiN_.cjs');
3
+ const require_addSolanaWalletStandardExtension = require('./addSolanaWalletStandardExtension-DBe7a3S_.cjs');
4
4
  let _dynamic_labs_sdk_assert_package_version = require("@dynamic-labs-sdk/assert-package-version");
5
5
 
6
6
  //#region src/exports/walletStandard.ts
@@ -1,5 +1,5 @@
1
- import { d as name, f as version } from "./solanaTransferAmount-CiEQTFW3.esm.js";
2
- import { t as addSolanaWalletStandardExtension } from "./addSolanaWalletStandardExtension-BGRoCMAL.esm.js";
1
+ import { d as name, f as version } from "./solanaTransferAmount-D3T1LAPQ.esm.js";
2
+ import { t as addSolanaWalletStandardExtension } from "./addSolanaWalletStandardExtension-XbXWMTqr.esm.js";
3
3
  import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
4
4
 
5
5
  //#region src/exports/walletStandard.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamic-labs-sdk/solana",
3
- "version": "0.26.10",
3
+ "version": "0.27.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.esm.js",
@@ -32,7 +32,7 @@
32
32
  }
33
33
  },
34
34
  "dependencies": {
35
- "@dynamic-labs/sdk-api-core": "0.0.964",
35
+ "@dynamic-labs/sdk-api-core": "0.0.968",
36
36
  "@solana/spl-token": "0.4.14",
37
37
  "@solana/web3.js": "1.98.1",
38
38
  "@wallet-standard/app": "1.0.1",
@@ -44,12 +44,12 @@
44
44
  "eventemitter3": "5.0.1",
45
45
  "tweetnacl": "1.0.3",
46
46
  "zod": "4.0.5",
47
- "@dynamic-labs-sdk/assert-package-version": "0.26.10",
48
- "@dynamic-labs-sdk/client": "0.26.10",
49
- "@dynamic-labs-sdk/wallet-connect": "0.26.10"
47
+ "@dynamic-labs-sdk/assert-package-version": "0.27.1",
48
+ "@dynamic-labs-sdk/client": "0.27.1",
49
+ "@dynamic-labs-sdk/wallet-connect": "0.27.1"
50
50
  },
51
51
  "devDependencies": {
52
- "vitest": "1.6.1"
52
+ "vitest": "2.1.9"
53
53
  },
54
54
  "scripts": {
55
55
  "build": "rm -rf dist && tsdown && pnpm exec tsc --emitDeclarationOnly -p ./tsconfig.lib.json",
@@ -1 +0,0 @@
1
- {"version":3,"file":"addSolanaWalletStandardExtension-BGRoCMAL.esm.js","names":["connect: SolanaWalletProvider['connect']","getActiveNetworkId: SolanaWalletProvider['getActiveNetworkId']","getConnectedAddresses: SolanaWalletProvider['getConnectedAddresses']","signAllTransactions: SolanaWalletProvider['signAllTransactions']","signAndSendTransaction: SolanaWalletProvider['signAndSendTransaction']","signMessage: SolanaWalletProvider['signMessage']","signTransaction: SolanaWalletProvider['signTransaction']","switchActiveNetwork: SolanaWalletProvider['switchActiveNetwork']","terminate: SolanaWalletProvider['terminate']"],"sources":["../src/walletStandard/utils/getActiveNetworkCluster/getActiveNetworkCluster.ts","../src/walletStandard/utils/getFeaturesForSolanaStandardWallet/getFeaturesForSolanaStandardWallet.ts","../src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/createWalletProviderFromSolanaStandardWallet.ts","../src/walletStandard/utils/hasAllRequiredFeatures/hasAllRequiredFeatures.ts","../src/walletStandard/addSolanaWalletStandardExtension/addSolanaWalletStandardExtension.ts"],"sourcesContent":["import type { DynamicClient, WalletAccount } from '@dynamic-labs-sdk/client';\nimport { getActiveNetworkData } from '@dynamic-labs-sdk/client';\n\ntype GetActiveNetworkClusterParams = {\n walletAccount: WalletAccount;\n};\n\n/** @not-instrumented */\nexport const getActiveNetworkCluster = async (\n { walletAccount }: GetActiveNetworkClusterParams,\n client: DynamicClient\n): Promise<`solana:${string}` | undefined> => {\n const { networkData } = await getActiveNetworkData({ walletAccount }, client);\n\n if (!networkData?.cluster) {\n return;\n }\n\n return `solana:${networkData.cluster}`;\n};\n","import type { Wallet } from '@wallet-standard/base';\nimport type {\n SignAndSendTransactionFeature,\n SignMessageFeature,\n SignTransactionFeature,\n} from '@wallet-standard/experimental-features';\nimport type {\n StandardConnectFeature,\n StandardDisconnectFeature,\n StandardEventsFeature,\n} from '@wallet-standard/features';\n\ntype WalletStandardFeatures = {\n 'solana:signAndSendTransaction': SignAndSendTransactionFeature['experimental:signAndSendTransaction'];\n 'solana:signMessage': SignMessageFeature['experimental:signMessage'];\n 'solana:signTransaction': SignTransactionFeature['experimental:signTransaction'];\n} & StandardConnectFeature &\n Partial<StandardDisconnectFeature> &\n StandardEventsFeature;\n\n/** @not-instrumented */\nexport const getFeaturesForSolanaStandardWallet = (wallet: Wallet) => {\n return wallet.features as WalletStandardFeatures;\n};\n","import {\n type DynamicClient,\n assertWalletAccountSigningAvailability,\n} from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n bufferToBase64,\n createWalletProviderEventEmitter,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n switchActiveNetworkInLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { Transaction, VersionedTransaction } from '@solana/web3.js';\nimport type { Wallet as WalletStandardWallet } from '@wallet-standard/base';\nimport type { SignTransactionInput } from '@wallet-standard/experimental-features';\nimport bs58 from 'bs58';\n\nimport type { SolanaWalletProvider } from '../../../SolanaWalletProvider.types';\nimport { isVersionedTransaction } from '../../../utils/isVersionedTransaction';\nimport { solanaConfirmTransaction } from '../../../utils/solanaConfirmTransaction';\nimport { solanaExecuteSwapTransaction } from '../../../utils/solanaExecuteSwapTransaction';\nimport { solanaTransferAmount } from '../../../utils/solanaTransferAmount';\nimport { getActiveNetworkCluster } from '../getActiveNetworkCluster';\nimport { getFeaturesForSolanaStandardWallet } from '../getFeaturesForSolanaStandardWallet';\n\ntype CreateWalletProviderFromSolanaStandardWalletParams = {\n dynamicClient: DynamicClient;\n walletStandardWallet: WalletStandardWallet;\n};\n\n/** @not-instrumented */\nexport const createWalletProviderFromSolanaStandardWallet = ({\n dynamicClient,\n walletStandardWallet,\n}: CreateWalletProviderFromSolanaStandardWalletParams): SolanaWalletProvider => {\n const features = getFeaturesForSolanaStandardWallet(walletStandardWallet);\n\n const walletProviderType = WalletProviderEnum.BrowserExtension;\n\n const key = formatWalletProviderKey({\n chain: 'SOL',\n displayName: walletStandardWallet.name,\n walletProviderType,\n });\n\n const connect: SolanaWalletProvider['connect'] = async () => {\n const autoConnectedAccounts = walletStandardWallet.accounts;\n\n // some wallets like Farcaster will auto inject the account into the wallet object\n // instead of returning it from the connect method\n // so we need to check for that first\n if (\n autoConnectedAccounts?.length &&\n autoConnectedAccounts[0].publicKey &&\n autoConnectedAccounts[0].address\n ) {\n return {\n addresses: [\n {\n address: autoConnectedAccounts[0].address,\n publicKey: autoConnectedAccounts[0].publicKey.toString(),\n },\n ],\n };\n }\n\n const connectMethod = features['standard:connect']?.connect;\n\n assertDefined(connectMethod, 'connect method not found in wallet features');\n\n const result = await connectMethod({ silent: false });\n\n return {\n addresses: result.accounts?.map((account) => ({\n address: account.address,\n publicKey: account.publicKey?.toString(),\n })),\n };\n };\n const disconnectFeature = features['standard:disconnect']?.disconnect;\n\n const getActiveNetworkId: SolanaWalletProvider['getActiveNetworkId'] =\n async () =>\n getActiveNetworkIdFromLastKnownRegistry({\n client: dynamicClient,\n walletProviderKey: key,\n });\n\n const getCurrentAccount = async () => {\n if (!isConnected() && connect) {\n await connect();\n }\n\n const account = walletStandardWallet.accounts?.[0];\n\n assertDefined(account, 'No connected accounts found');\n\n return account;\n };\n\n const isConnected = (): boolean => {\n return walletStandardWallet.accounts?.length > 0;\n };\n\n const getConnectedAddresses: SolanaWalletProvider['getConnectedAddresses'] =\n async () => {\n if (!isConnected() && connect) {\n await connect();\n }\n\n return {\n addresses: walletStandardWallet.accounts.map(\n (account) => account.address\n ),\n };\n };\n\n const signAllTransactions: SolanaWalletProvider['signAllTransactions'] =\n async ({ transactions, walletAccount }) => {\n const signTransactionMethod =\n features['solana:signTransaction']?.signTransaction;\n\n assertDefined(\n signTransactionMethod,\n 'signTransaction method not found in wallet features'\n );\n\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const account = await getCurrentAccount();\n\n const chain = await getActiveNetworkCluster(\n { walletAccount },\n dynamicClient\n );\n assertDefined(chain, 'Could not get active chain for wallet account');\n\n const transactionsInput: SignTransactionInput[] = transactions.map(\n (transaction) => ({\n account,\n chain,\n transaction: transaction.serialize({\n requireAllSignatures: false,\n }) as Uint8Array<ArrayBufferLike>,\n })\n );\n\n const signTransactionResult = await signTransactionMethod(\n ...transactionsInput\n );\n\n const signedTransactions = signTransactionResult.map(\n ({ signedTransaction }, index) => {\n const inputTransaction = transactions[index];\n type T = typeof inputTransaction;\n\n if (isVersionedTransaction(inputTransaction)) {\n return VersionedTransaction.deserialize(signedTransaction) as T;\n }\n return Transaction.from(signedTransaction) as T;\n }\n );\n\n return { signedTransactions };\n };\n\n const signAndSendTransaction: SolanaWalletProvider['signAndSendTransaction'] =\n async ({ transaction, walletAccount }) => {\n await assertWalletAccountSigningAvailability(\n {\n walletAccount,\n },\n dynamicClient\n );\n\n const signAndSendTransactionMethod =\n features['solana:signAndSendTransaction']?.signAndSendTransaction;\n\n assertDefined(\n signAndSendTransactionMethod,\n 'signAndSendTransaction method not found in wallet features'\n );\n\n const account = await getCurrentAccount();\n\n const chain = await getActiveNetworkCluster(\n { walletAccount },\n dynamicClient\n );\n assertDefined(chain, 'Could not get active chain for wallet account');\n\n const signedTransactions = await signAndSendTransactionMethod({\n account,\n chain,\n transaction: transaction.serialize({\n requireAllSignatures: false,\n }) as Uint8Array<ArrayBufferLike>,\n });\n\n const [{ signature }] = signedTransactions;\n\n return { signature: bs58.encode(signature) };\n };\n\n const signMessage: SolanaWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n }) => {\n const signMessageMethod = features['solana:signMessage']?.signMessage;\n\n assertDefined(\n signMessageMethod,\n 'signMessage method not found in wallet features'\n );\n\n assertDefined(walletAccount, 'Wallet account not found');\n\n await assertWalletAccountSigningAvailability(\n {\n walletAccount,\n },\n dynamicClient\n );\n\n const encodedMessage = new TextEncoder().encode(message);\n\n const account = await getCurrentAccount();\n\n const messages = await signMessageMethod({\n account,\n message: encodedMessage,\n });\n\n return { signature: bufferToBase64(messages[0].signature) };\n };\n\n const signTransaction: SolanaWalletProvider['signTransaction'] = async ({\n transaction,\n walletAccount,\n }) => {\n const signedTransactions = await signAllTransactions({\n transactions: [transaction],\n walletAccount,\n });\n\n return { signedTransaction: signedTransactions.signedTransactions[0] };\n };\n\n const switchActiveNetwork: SolanaWalletProvider['switchActiveNetwork'] =\n async ({ networkId }) =>\n switchActiveNetworkInLastKnownRegistry({\n client: dynamicClient,\n networkId,\n walletProviderKey: key,\n });\n\n const { getEventEmitter, cleanupEventEmitter } =\n createWalletProviderEventEmitter<VoidFunction>({\n removeEventListeners: ({ setupReturnValue }) => {\n assertDefined(setupReturnValue, 'Setup return value not defined');\n\n setupReturnValue();\n },\n\n setupEventListeners: ({ handleAccountsChanged }) => {\n const eventsFeature = features['standard:events'];\n\n return eventsFeature.on('change', ({ accounts }) => {\n handleAccountsChanged({\n addresses: accounts?.map((account) => account.address) ?? [],\n });\n });\n },\n\n supportedEvents: ['accountsChanged'],\n });\n\n const terminate: SolanaWalletProvider['terminate'] = async () => {\n cleanupEventEmitter();\n };\n\n const walletProvider: SolanaWalletProvider = {\n chain: 'SOL',\n confirmTransaction: (args) => solanaConfirmTransaction(args, dynamicClient),\n connect,\n disconnect: disconnectFeature,\n get events() {\n return getEventEmitter();\n },\n executeSwapTransaction: (args) =>\n solanaExecuteSwapTransaction(args, dynamicClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(walletStandardWallet.name),\n key,\n metadata: {\n displayName: walletStandardWallet.name,\n icon: walletStandardWallet.icon,\n },\n signAllTransactions,\n signAndSendTransaction,\n signMessage,\n signTransaction,\n switchActiveNetwork,\n terminate,\n transferAmount: (args) => solanaTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n\n return walletProvider;\n};\n","import type { Wallet } from '@wallet-standard/base';\n\n/** @not-instrumented */\nexport const hasAllRequiredFeatures = (wallet: Wallet): boolean => {\n return Boolean(\n wallet.features?.['standard:events'] &&\n wallet.features?.['standard:connect'] &&\n wallet.features?.['solana:signTransaction'] &&\n wallet.features?.['solana:signMessage']\n );\n};\n","import {\n WalletProviderPriority,\n getDefaultClient,\n getWalletProviderRegistry,\n hasExtension,\n registerExtension,\n} from '@dynamic-labs-sdk/client/core';\nimport { getWallets } from '@wallet-standard/app';\n\nimport { registerSolanaNetworkProviderBuilder } from '../../registerSolanaNetworkProviderBuilder';\nimport { createWalletProviderFromSolanaStandardWallet } from '../utils/createWalletProviderFromSolanaStandardWallet';\nimport { hasAllRequiredFeatures } from '../utils/hasAllRequiredFeatures';\n\nexport const SOLANA_WALLET_STANDARD_EXTENSION_KEY = 'solanaWalletStandard';\n\n/**\n * Adds the Solana Wallet Standard extension to the Dynamic client.\n *\n * This extension enables integration with wallets that implement the Solana Wallet Standard,\n * automatically detecting and registering compatible wallets for use with the Dynamic SDK.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @not-instrumented\n */\nexport const addSolanaWalletStandardExtension = (\n client = getDefaultClient()\n): void => {\n if (\n hasExtension({ extensionKey: SOLANA_WALLET_STANDARD_EXTENSION_KEY }, client)\n ) {\n return;\n }\n\n registerExtension(\n { extensionKey: SOLANA_WALLET_STANDARD_EXTENSION_KEY },\n client\n );\n\n registerSolanaNetworkProviderBuilder(client);\n\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n const walletStandardWallets = getWallets()\n .get()\n .filter(hasAllRequiredFeatures);\n\n walletStandardWallets.forEach((walletStandardWallet) => {\n const walletProvider = createWalletProviderFromSolanaStandardWallet({\n dynamicClient: client,\n walletStandardWallet,\n });\n\n walletProviderRegistry.register({\n priority: WalletProviderPriority.WALLET_SELF_ANNOUNCEMENT_STANDARD,\n walletProvider,\n });\n });\n};\n"],"mappings":"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"}