@dynamic-labs-sdk/solana 0.9.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/{addSolanaWalletStandardExtension-C7EDAeZ9.cjs.js → addSolanaWalletStandardExtension-BUUXr9jq.cjs.js} +2 -2
  2. package/dist/{addSolanaWalletStandardExtension-C7EDAeZ9.cjs.js.map → addSolanaWalletStandardExtension-BUUXr9jq.cjs.js.map} +1 -1
  3. package/dist/{addSolanaWalletStandardExtension-CgTdsk3z.esm.js → addSolanaWalletStandardExtension-BvUDC6Lu.esm.js} +2 -2
  4. package/dist/{addSolanaWalletStandardExtension-CgTdsk3z.esm.js.map → addSolanaWalletStandardExtension-BvUDC6Lu.esm.js.map} +1 -1
  5. package/dist/{addWaasSolanaExtension-B5avqA3F.cjs.js → addWaasSolanaExtension-B_Ql3oie.cjs.js} +3 -5
  6. package/dist/addWaasSolanaExtension-B_Ql3oie.cjs.js.map +1 -0
  7. package/dist/{addWaasSolanaExtension-B7q49sv3.esm.js → addWaasSolanaExtension-CCl6etu6.esm.js} +2 -4
  8. package/dist/addWaasSolanaExtension-CCl6etu6.esm.js.map +1 -0
  9. package/dist/exports/index.d.ts +3 -0
  10. package/dist/exports/index.d.ts.map +1 -1
  11. package/dist/index.cjs.js +172 -3
  12. package/dist/index.cjs.js.map +1 -1
  13. package/dist/index.esm.js +172 -6
  14. package/dist/index.esm.js.map +1 -1
  15. package/dist/{isVersionedTransaction-DvMYHm_2.cjs.js → isVersionedTransaction-D6zyaSEe.cjs.js} +3 -3
  16. package/dist/{isVersionedTransaction-DvMYHm_2.cjs.js.map → isVersionedTransaction-D6zyaSEe.cjs.js.map} +1 -1
  17. package/dist/{isVersionedTransaction-CuHTBZE9.esm.js → isVersionedTransaction-FjlIFg4E.esm.js} +2 -2
  18. package/dist/{isVersionedTransaction-CuHTBZE9.esm.js.map → isVersionedTransaction-FjlIFg4E.esm.js.map} +1 -1
  19. package/dist/simulateSolanaTransaction/index.d.ts +2 -0
  20. package/dist/simulateSolanaTransaction/index.d.ts.map +1 -0
  21. package/dist/simulateSolanaTransaction/simulateSolanaTransaction.d.ts +46 -0
  22. package/dist/simulateSolanaTransaction/simulateSolanaTransaction.d.ts.map +1 -0
  23. package/dist/transactionSimulation.types.d.ts +12 -0
  24. package/dist/transactionSimulation.types.d.ts.map +1 -0
  25. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  26. package/dist/utils/calculateSolanaTransactionFee/calculateSolanaTransactionFee.d.ts +24 -0
  27. package/dist/utils/calculateSolanaTransactionFee/calculateSolanaTransactionFee.d.ts.map +1 -0
  28. package/dist/utils/calculateSolanaTransactionFee/index.d.ts +2 -0
  29. package/dist/utils/calculateSolanaTransactionFee/index.d.ts.map +1 -0
  30. package/dist/waas/utils/sponsorTransaction/sponsorTransaction.d.ts +0 -2
  31. package/dist/waas/utils/sponsorTransaction/sponsorTransaction.d.ts.map +1 -1
  32. package/dist/waas.cjs.js +3 -3
  33. package/dist/waas.esm.js +2 -2
  34. package/dist/walletStandard.cjs.js +2 -2
  35. package/dist/walletStandard.esm.js +2 -2
  36. package/package.json +5 -5
  37. package/dist/addWaasSolanaExtension-B5avqA3F.cjs.js.map +0 -1
  38. package/dist/addWaasSolanaExtension-B7q49sv3.esm.js.map +0 -1
@@ -25,7 +25,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
25
  }) : target, mod));
26
26
 
27
27
  //#endregion
28
- const require_isVersionedTransaction = require('./isVersionedTransaction-DvMYHm_2.cjs.js');
28
+ const require_isVersionedTransaction = require('./isVersionedTransaction-D6zyaSEe.cjs.js');
29
29
  let _dynamic_labs_sdk_client_core = require("@dynamic-labs-sdk/client/core");
30
30
  let _solana_web3_js = require("@solana/web3.js");
31
31
  let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
@@ -228,4 +228,4 @@ Object.defineProperty(exports, 'addSolanaWalletStandardExtension', {
228
228
  return addSolanaWalletStandardExtension;
229
229
  }
230
230
  });
231
- //# sourceMappingURL=addSolanaWalletStandardExtension-C7EDAeZ9.cjs.js.map
231
+ //# sourceMappingURL=addSolanaWalletStandardExtension-BUUXr9jq.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"addSolanaWalletStandardExtension-C7EDAeZ9.cjs.js","names":["WalletProviderEnum","connect: SolanaWalletProvider['connect']","getActiveNetworkId: SolanaWalletProvider['getActiveNetworkId']","getConnectedAddresses: SolanaWalletProvider['getConnectedAddresses']","signAllTransactions: SolanaWalletProvider['signAllTransactions']","isVersionedTransaction","VersionedTransaction","Transaction","signAndSendTransaction: SolanaWalletProvider['signAndSendTransaction']","signMessage: SolanaWalletProvider['signMessage']","signTransaction: SolanaWalletProvider['signTransaction']","switchActiveNetwork: SolanaWalletProvider['switchActiveNetwork']","terminate: SolanaWalletProvider['terminate']","WalletProviderPriority"],"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\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\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 { getActiveNetworkCluster } from '../getActiveNetworkCluster';\nimport { getFeaturesForSolanaStandardWallet } from '../getFeaturesForSolanaStandardWallet';\n\ntype CreateWalletProviderFromSolanaStandardWalletParams = {\n dynamicClient: DynamicClient;\n walletStandardWallet: WalletStandardWallet;\n};\n\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 connect,\n disconnect: disconnectFeature,\n get events() {\n return getEventEmitter();\n },\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 walletProviderType,\n };\n\n return walletProvider;\n};\n","import type { Wallet } from '@wallet-standard/base';\n\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 */\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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"}
1
+ {"version":3,"file":"addSolanaWalletStandardExtension-BUUXr9jq.cjs.js","names":["WalletProviderEnum","connect: SolanaWalletProvider['connect']","getActiveNetworkId: SolanaWalletProvider['getActiveNetworkId']","getConnectedAddresses: SolanaWalletProvider['getConnectedAddresses']","signAllTransactions: SolanaWalletProvider['signAllTransactions']","isVersionedTransaction","VersionedTransaction","Transaction","signAndSendTransaction: SolanaWalletProvider['signAndSendTransaction']","signMessage: SolanaWalletProvider['signMessage']","signTransaction: SolanaWalletProvider['signTransaction']","switchActiveNetwork: SolanaWalletProvider['switchActiveNetwork']","terminate: SolanaWalletProvider['terminate']","WalletProviderPriority"],"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\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\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 { getActiveNetworkCluster } from '../getActiveNetworkCluster';\nimport { getFeaturesForSolanaStandardWallet } from '../getFeaturesForSolanaStandardWallet';\n\ntype CreateWalletProviderFromSolanaStandardWalletParams = {\n dynamicClient: DynamicClient;\n walletStandardWallet: WalletStandardWallet;\n};\n\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 connect,\n disconnect: disconnectFeature,\n get events() {\n return getEventEmitter();\n },\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 walletProviderType,\n };\n\n return walletProvider;\n};\n","import type { Wallet } from '@wallet-standard/base';\n\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 */\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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"}
@@ -1,4 +1,4 @@
1
- import { n as registerSolanaNetworkProviderBuilder, t as isVersionedTransaction } from "./isVersionedTransaction-CuHTBZE9.esm.js";
1
+ import { n as registerSolanaNetworkProviderBuilder, t as isVersionedTransaction } from "./isVersionedTransaction-FjlIFg4E.esm.js";
2
2
  import { WalletProviderPriority, assertDefined, bufferToBase64, createWalletProviderEventEmitter, formatWalletProviderGroupKey, formatWalletProviderKey, getActiveNetworkIdFromLastKnownRegistry, getDefaultClient, getWalletProviderRegistry, hasExtension, registerExtension, switchActiveNetworkInLastKnownRegistry } from "@dynamic-labs-sdk/client/core";
3
3
  import { Transaction, VersionedTransaction } from "@solana/web3.js";
4
4
  import { assertWalletAccountSigningAvailability, getActiveNetworkData } from "@dynamic-labs-sdk/client";
@@ -189,4 +189,4 @@ const addSolanaWalletStandardExtension = (client = getDefaultClient()) => {
189
189
 
190
190
  //#endregion
191
191
  export { addSolanaWalletStandardExtension as t };
192
- //# sourceMappingURL=addSolanaWalletStandardExtension-CgTdsk3z.esm.js.map
192
+ //# sourceMappingURL=addSolanaWalletStandardExtension-BvUDC6Lu.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"addSolanaWalletStandardExtension-CgTdsk3z.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\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\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 { getActiveNetworkCluster } from '../getActiveNetworkCluster';\nimport { getFeaturesForSolanaStandardWallet } from '../getFeaturesForSolanaStandardWallet';\n\ntype CreateWalletProviderFromSolanaStandardWalletParams = {\n dynamicClient: DynamicClient;\n walletStandardWallet: WalletStandardWallet;\n};\n\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 connect,\n disconnect: disconnectFeature,\n get events() {\n return getEventEmitter();\n },\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 walletProviderType,\n };\n\n return walletProvider;\n};\n","import type { Wallet } from '@wallet-standard/base';\n\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 */\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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"}
1
+ {"version":3,"file":"addSolanaWalletStandardExtension-BvUDC6Lu.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\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\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 { getActiveNetworkCluster } from '../getActiveNetworkCluster';\nimport { getFeaturesForSolanaStandardWallet } from '../getFeaturesForSolanaStandardWallet';\n\ntype CreateWalletProviderFromSolanaStandardWalletParams = {\n dynamicClient: DynamicClient;\n walletStandardWallet: WalletStandardWallet;\n};\n\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 connect,\n disconnect: disconnectFeature,\n get events() {\n return getEventEmitter();\n },\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 walletProviderType,\n };\n\n return walletProvider;\n};\n","import type { Wallet } from '@wallet-standard/base';\n\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 */\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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"}
@@ -1,5 +1,5 @@
1
- const require_addSolanaWalletStandardExtension = require('./addSolanaWalletStandardExtension-C7EDAeZ9.cjs.js');
2
- const require_isVersionedTransaction = require('./isVersionedTransaction-DvMYHm_2.cjs.js');
1
+ const require_addSolanaWalletStandardExtension = require('./addSolanaWalletStandardExtension-BUUXr9jq.cjs.js');
2
+ const require_isVersionedTransaction = require('./isVersionedTransaction-D6zyaSEe.cjs.js');
3
3
  let _dynamic_labs_sdk_client_core = require("@dynamic-labs-sdk/client/core");
4
4
  let _solana_web3_js = require("@solana/web3.js");
5
5
  let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
@@ -53,8 +53,6 @@ var SponsorTransactionError = class extends _dynamic_labs_sdk_client.BaseError {
53
53
  * fee payer with a sponsored account. This allows users to execute
54
54
  * transactions without holding SOL for gas fees.
55
55
  *
56
- * This function always attempts sponsorship and throws on failure.
57
- *
58
56
  * @param params - The parameters object containing the transaction
59
57
  * @param params.transaction - The Solana transaction to sponsor
60
58
  * @param client - The Dynamic client instance used for API calls and state access
@@ -228,4 +226,4 @@ Object.defineProperty(exports, 'getSolanaConnection', {
228
226
  return getSolanaConnection;
229
227
  }
230
228
  });
231
- //# sourceMappingURL=addWaasSolanaExtension-B5avqA3F.cjs.js.map
229
+ //# sourceMappingURL=addWaasSolanaExtension-B_Ql3oie.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addWaasSolanaExtension-B_Ql3oie.cjs.js","names":["Connection","BaseError","isVersionedTransaction","VersionedTransaction","chain: Chain","WalletProviderEnum","DYNAMIC_WAAS_METADATA","getActiveNetworkId: WaasSolanaWalletProvider['getActiveNetworkId']","switchActiveNetwork: WaasSolanaWalletProvider['switchActiveNetwork']","getConnectedAddresses: WaasSolanaWalletProvider['getConnectedAddresses']","signAndSendTransaction: WaasSolanaWalletProvider['signAndSendTransaction']","signAndSendSponsoredTransaction: WaasSolanaWalletProvider['signAndSendSponsoredTransaction']","signTransaction: WaasSolanaWalletProvider['signTransaction']","isVersionedTransaction","PublicKey","signAllTransactions: WaasSolanaWalletProvider['signAllTransactions']","signMessage: WaasSolanaWalletProvider['signMessage']","WalletProviderPriority"],"sources":["../src/getSolanaConnection/getSolanaConnection.ts","../src/errors/SponsorTransactionError/SponsorTransactionError.ts","../src/waas/utils/sponsorTransaction/sponsorTransaction.ts","../src/waas/utils/createWalletProviderForWaasSolana/createWalletProviderForWaasSolana.ts","../src/waas/addWaasSolanaExtension/addWaasSolanaExtension.ts"],"sourcesContent":["import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport type { Commitment, ConnectionConfig } from '@solana/web3.js';\nimport { Connection } from '@solana/web3.js';\n\ntype GetSolanaConnectionOptions = {\n commitmentOrConfig?: Commitment | ConnectionConfig;\n networkData: NetworkData;\n};\n\n/**\n * Returns a new Solana connection for the given network provider.\n *\n * @example\n * ```ts\n * import { getActiveNetworkData } from '@dynamic-labs-sdk/client';\n * import { isSolanaNetworkProvider, getSolanaConnection } from '@dynamic-labs-sdk/solana';\n *\n * const { networkData } = getActiveNetworkData({ walletAccount });\n *\n * if(!networkData) {\n * throw new Error('No network data found');\n * }\n *\n * const connection = getSolanaConnection({\n * networkData,\n * });\n * ```\n */\nexport const getSolanaConnection = ({\n networkData,\n commitmentOrConfig,\n}: GetSolanaConnectionOptions) => {\n return new Connection(networkData.rpcUrls.http[0], commitmentOrConfig);\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class SponsorTransactionError extends BaseError {\n constructor(cause?: Error | null) {\n super({\n cause: cause ?? null,\n code: 'sponsor_transaction_error',\n docsUrl: null,\n name: 'SponsorTransactionError',\n shortMessage: 'Failed to sponsor transaction',\n });\n }\n}\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n createApiClient,\n getBuffer,\n getCore,\n} from '@dynamic-labs-sdk/client/core';\nimport type { Transaction } from '@solana/web3.js';\nimport { VersionedTransaction } from '@solana/web3.js';\n\nimport { SponsorTransactionError } from '../../../errors/SponsorTransactionError/SponsorTransactionError';\nimport { isVersionedTransaction } from '../../../utils/isVersionedTransaction';\n\ntype SponsorTransactionParams = {\n transaction: Transaction | VersionedTransaction;\n};\n\n/**\n * Sponsors a Solana transaction using the Dynamic backend.\n *\n * Sends the transaction to Dynamic's sponsorship API, which replaces the\n * fee payer with a sponsored account. This allows users to execute\n * transactions without holding SOL for gas fees.\n *\n * @param params - The parameters object containing the transaction\n * @param params.transaction - The Solana transaction to sponsor\n * @param client - The Dynamic client instance used for API calls and state access\n * @returns The sponsored transaction as a VersionedTransaction\n * @throws {SponsorTransactionError} If the API response is missing the transaction field\n */\nexport const sponsorTransaction = async (\n { transaction }: SponsorTransactionParams,\n client: DynamicClient\n): Promise<VersionedTransaction> => {\n const core = getCore(client);\n\n const serialized = isVersionedTransaction(transaction)\n ? transaction.serialize()\n : transaction.serialize({\n requireAllSignatures: false,\n verifySignatures: false,\n });\n\n const base64Transaction = getBuffer()\n .from(serialized as Uint8Array)\n .toString('base64');\n\n const apiClient = createApiClient({}, client);\n\n let data;\n\n try {\n data = await apiClient.sponsorSVMTransaction({\n environmentId: core.environmentId,\n sponsorSVMTransactionRequest: {\n transaction: base64Transaction,\n },\n });\n } catch (error) {\n const cause = error instanceof Error ? error : null;\n throw new SponsorTransactionError(cause);\n }\n\n if (!data.transaction) {\n throw new SponsorTransactionError();\n }\n\n const buffer = getBuffer().from(data.transaction, 'base64');\n\n return VersionedTransaction.deserialize(new Uint8Array(buffer));\n};\n","import {\n type Chain,\n type DynamicClient,\n getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n getBuffer,\n switchActiveNetworkInLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport {\n DYNAMIC_WAAS_METADATA,\n createWaasProvider,\n getAllUserWaasAddressesForChain,\n} from '@dynamic-labs-sdk/client/waas/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { getSolanaConnection } from '../../../getSolanaConnection';\nimport { isVersionedTransaction } from '../../../utils/isVersionedTransaction';\nimport type { WaasSolanaWalletProvider } from '../../WaasSolanaWalletProvider.types';\nimport { sponsorTransaction } from '../sponsorTransaction';\n\nexport const createWalletProviderForWaasSolana = (\n sdkClient: DynamicClient\n): WaasSolanaWalletProvider => {\n const chain: Chain = 'SOL';\n\n const walletProviderType = WalletProviderEnum.EmbeddedWallet;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: DYNAMIC_WAAS_METADATA.displayName,\n walletProviderType,\n });\n\n const waasProvider = createWaasProvider({ chain, sdkClient });\n\n const getActiveNetworkId: WaasSolanaWalletProvider['getActiveNetworkId'] =\n async () =>\n getActiveNetworkIdFromLastKnownRegistry({\n client: sdkClient,\n walletProviderKey: key,\n });\n\n const switchActiveNetwork: WaasSolanaWalletProvider['switchActiveNetwork'] =\n async ({ networkId }) =>\n switchActiveNetworkInLastKnownRegistry({\n client: sdkClient,\n networkId,\n walletProviderKey: key,\n });\n\n const getConnectedAddresses: WaasSolanaWalletProvider['getConnectedAddresses'] =\n async () => {\n const waasSolanaAddresses = getAllUserWaasAddressesForChain(\n { chain },\n sdkClient\n );\n\n return {\n addresses: waasSolanaAddresses,\n };\n };\n\n const signAndSendTransaction: WaasSolanaWalletProvider['signAndSendTransaction'] =\n async ({ transaction, walletAccount, options }) => {\n const { signedTransaction } = await signTransaction({\n transaction,\n walletAccount,\n });\n\n const { networkData } = await getActiveNetworkData(\n { walletAccount },\n sdkClient\n );\n\n assertDefined(networkData, 'Network data is required');\n\n const connection = getSolanaConnection({ networkData });\n\n const rawTransaction = signedTransaction.serialize();\n\n const signature = await connection.sendRawTransaction(\n rawTransaction,\n options\n );\n\n return { signature };\n };\n\n const signAndSendSponsoredTransaction: WaasSolanaWalletProvider['signAndSendSponsoredTransaction'] =\n async ({ transaction, walletAccount, options }) => {\n const sponsoredTx = await sponsorTransaction(\n { transaction },\n sdkClient\n );\n\n const { signedTransaction } = await signTransaction({\n transaction: sponsoredTx,\n walletAccount,\n });\n\n const { networkData } = await getActiveNetworkData(\n { walletAccount },\n sdkClient\n );\n\n assertDefined(networkData, 'Network data is required');\n\n const connection = getSolanaConnection({ networkData });\n\n const rawTransaction = signedTransaction.serialize();\n\n // Skip preflight simulation to avoid false\n // \"Attempt to debit an account but found no record of a prior credit\"\n // errors — the fee payer has been replaced but preflight may still reject it\n const signature = await connection.sendRawTransaction(rawTransaction, {\n skipPreflight: true,\n ...options,\n });\n\n return { signature };\n };\n\n const signTransaction: WaasSolanaWalletProvider['signTransaction'] = async ({\n transaction,\n walletAccount,\n }) => {\n const messageBytes = isVersionedTransaction(transaction)\n ? transaction.message.serialize()\n : transaction.serializeMessage();\n\n const serializedTransaction = getBuffer()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .from(messageBytes as any)\n .toString('hex');\n\n const { signature } = await waasProvider.signSerializedTransaction({\n serializedTransaction,\n walletAccount,\n });\n\n const publicKey = new PublicKey(walletAccount.address);\n\n transaction.addSignature(\n publicKey,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getBuffer().from(signature, 'hex') as any\n );\n\n transaction.serialize({\n requireAllSignatures: false,\n verifySignatures: true,\n });\n\n return { signedTransaction: transaction };\n };\n\n const signAllTransactions: WaasSolanaWalletProvider['signAllTransactions'] =\n async ({ transactions, walletAccount }) => {\n const signedTransactions = await Promise.all(\n transactions.map(async (transaction) => {\n const { signedTransaction } = await signTransaction({\n transaction,\n walletAccount,\n });\n\n return signedTransaction;\n })\n );\n\n return { signedTransactions };\n };\n\n const signMessage: WaasSolanaWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n return waasProvider.signMessage({ message, walletAccount });\n };\n\n return {\n ...waasProvider,\n chain,\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(DYNAMIC_WAAS_METADATA.displayName),\n key,\n metadata: {\n displayName: DYNAMIC_WAAS_METADATA.displayName,\n icon: DYNAMIC_WAAS_METADATA.icon,\n },\n signAllTransactions,\n signAndSendSponsoredTransaction,\n signAndSendTransaction,\n signMessage,\n signTransaction,\n switchActiveNetwork,\n walletProviderType,\n };\n};\n","import {\n WalletProviderPriority,\n getDefaultClient,\n getWalletProviderRegistry,\n hasExtension,\n registerExtension,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { registerSolanaNetworkProviderBuilder } from '../../registerSolanaNetworkProviderBuilder';\nimport { createWalletProviderForWaasSolana } from '../utils/createWalletProviderForWaasSolana';\n\nexport const WAAS_SOLANA_EXTENSION_KEY = 'waasSolana';\n\n/**\n * Adds the Dynamic WaaS (Wallet as a Service) Solana extension to the Dynamic client.\n *\n * This extension enables embedded wallet functionality for Solana blockchain,\n * allowing users to have wallets managed by Dynamic's infrastructure.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n */\nexport const addWaasSolanaExtension = (client = getDefaultClient()): void => {\n if (hasExtension({ extensionKey: WAAS_SOLANA_EXTENSION_KEY }, client)) {\n return;\n }\n\n registerExtension({ extensionKey: WAAS_SOLANA_EXTENSION_KEY }, client);\n registerSolanaNetworkProviderBuilder(client);\n\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n const walletProvider = createWalletProviderForWaasSolana(client);\n\n walletProviderRegistry.register({\n priority: WalletProviderPriority.WALLET_SDK,\n walletProvider,\n });\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { n as registerSolanaNetworkProviderBuilder, t as isVersionedTransaction } from "./isVersionedTransaction-CuHTBZE9.esm.js";
1
+ import { n as registerSolanaNetworkProviderBuilder, t as isVersionedTransaction } from "./isVersionedTransaction-FjlIFg4E.esm.js";
2
2
  import { WalletProviderPriority, assertDefined, createApiClient, formatWalletProviderGroupKey, formatWalletProviderKey, getActiveNetworkIdFromLastKnownRegistry, getBuffer, getCore, getDefaultClient, getWalletProviderRegistry, hasExtension, registerExtension, switchActiveNetworkInLastKnownRegistry } from "@dynamic-labs-sdk/client/core";
3
3
  import { Connection, PublicKey, VersionedTransaction } from "@solana/web3.js";
4
4
  import { BaseError, getActiveNetworkData } from "@dynamic-labs-sdk/client";
@@ -52,8 +52,6 @@ var SponsorTransactionError = class extends BaseError {
52
52
  * fee payer with a sponsored account. This allows users to execute
53
53
  * transactions without holding SOL for gas fees.
54
54
  *
55
- * This function always attempts sponsorship and throws on failure.
56
- *
57
55
  * @param params - The parameters object containing the transaction
58
56
  * @param params.transaction - The Solana transaction to sponsor
59
57
  * @param client - The Dynamic client instance used for API calls and state access
@@ -210,4 +208,4 @@ const addWaasSolanaExtension = (client = getDefaultClient()) => {
210
208
 
211
209
  //#endregion
212
210
  export { SponsorTransactionError as n, getSolanaConnection as r, addWaasSolanaExtension as t };
213
- //# sourceMappingURL=addWaasSolanaExtension-B7q49sv3.esm.js.map
211
+ //# sourceMappingURL=addWaasSolanaExtension-CCl6etu6.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addWaasSolanaExtension-CCl6etu6.esm.js","names":["chain: Chain","getActiveNetworkId: WaasSolanaWalletProvider['getActiveNetworkId']","switchActiveNetwork: WaasSolanaWalletProvider['switchActiveNetwork']","getConnectedAddresses: WaasSolanaWalletProvider['getConnectedAddresses']","signAndSendTransaction: WaasSolanaWalletProvider['signAndSendTransaction']","signAndSendSponsoredTransaction: WaasSolanaWalletProvider['signAndSendSponsoredTransaction']","signTransaction: WaasSolanaWalletProvider['signTransaction']","signAllTransactions: WaasSolanaWalletProvider['signAllTransactions']","signMessage: WaasSolanaWalletProvider['signMessage']"],"sources":["../src/getSolanaConnection/getSolanaConnection.ts","../src/errors/SponsorTransactionError/SponsorTransactionError.ts","../src/waas/utils/sponsorTransaction/sponsorTransaction.ts","../src/waas/utils/createWalletProviderForWaasSolana/createWalletProviderForWaasSolana.ts","../src/waas/addWaasSolanaExtension/addWaasSolanaExtension.ts"],"sourcesContent":["import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport type { Commitment, ConnectionConfig } from '@solana/web3.js';\nimport { Connection } from '@solana/web3.js';\n\ntype GetSolanaConnectionOptions = {\n commitmentOrConfig?: Commitment | ConnectionConfig;\n networkData: NetworkData;\n};\n\n/**\n * Returns a new Solana connection for the given network provider.\n *\n * @example\n * ```ts\n * import { getActiveNetworkData } from '@dynamic-labs-sdk/client';\n * import { isSolanaNetworkProvider, getSolanaConnection } from '@dynamic-labs-sdk/solana';\n *\n * const { networkData } = getActiveNetworkData({ walletAccount });\n *\n * if(!networkData) {\n * throw new Error('No network data found');\n * }\n *\n * const connection = getSolanaConnection({\n * networkData,\n * });\n * ```\n */\nexport const getSolanaConnection = ({\n networkData,\n commitmentOrConfig,\n}: GetSolanaConnectionOptions) => {\n return new Connection(networkData.rpcUrls.http[0], commitmentOrConfig);\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class SponsorTransactionError extends BaseError {\n constructor(cause?: Error | null) {\n super({\n cause: cause ?? null,\n code: 'sponsor_transaction_error',\n docsUrl: null,\n name: 'SponsorTransactionError',\n shortMessage: 'Failed to sponsor transaction',\n });\n }\n}\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n createApiClient,\n getBuffer,\n getCore,\n} from '@dynamic-labs-sdk/client/core';\nimport type { Transaction } from '@solana/web3.js';\nimport { VersionedTransaction } from '@solana/web3.js';\n\nimport { SponsorTransactionError } from '../../../errors/SponsorTransactionError/SponsorTransactionError';\nimport { isVersionedTransaction } from '../../../utils/isVersionedTransaction';\n\ntype SponsorTransactionParams = {\n transaction: Transaction | VersionedTransaction;\n};\n\n/**\n * Sponsors a Solana transaction using the Dynamic backend.\n *\n * Sends the transaction to Dynamic's sponsorship API, which replaces the\n * fee payer with a sponsored account. This allows users to execute\n * transactions without holding SOL for gas fees.\n *\n * @param params - The parameters object containing the transaction\n * @param params.transaction - The Solana transaction to sponsor\n * @param client - The Dynamic client instance used for API calls and state access\n * @returns The sponsored transaction as a VersionedTransaction\n * @throws {SponsorTransactionError} If the API response is missing the transaction field\n */\nexport const sponsorTransaction = async (\n { transaction }: SponsorTransactionParams,\n client: DynamicClient\n): Promise<VersionedTransaction> => {\n const core = getCore(client);\n\n const serialized = isVersionedTransaction(transaction)\n ? transaction.serialize()\n : transaction.serialize({\n requireAllSignatures: false,\n verifySignatures: false,\n });\n\n const base64Transaction = getBuffer()\n .from(serialized as Uint8Array)\n .toString('base64');\n\n const apiClient = createApiClient({}, client);\n\n let data;\n\n try {\n data = await apiClient.sponsorSVMTransaction({\n environmentId: core.environmentId,\n sponsorSVMTransactionRequest: {\n transaction: base64Transaction,\n },\n });\n } catch (error) {\n const cause = error instanceof Error ? error : null;\n throw new SponsorTransactionError(cause);\n }\n\n if (!data.transaction) {\n throw new SponsorTransactionError();\n }\n\n const buffer = getBuffer().from(data.transaction, 'base64');\n\n return VersionedTransaction.deserialize(new Uint8Array(buffer));\n};\n","import {\n type Chain,\n type DynamicClient,\n getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n getBuffer,\n switchActiveNetworkInLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport {\n DYNAMIC_WAAS_METADATA,\n createWaasProvider,\n getAllUserWaasAddressesForChain,\n} from '@dynamic-labs-sdk/client/waas/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { getSolanaConnection } from '../../../getSolanaConnection';\nimport { isVersionedTransaction } from '../../../utils/isVersionedTransaction';\nimport type { WaasSolanaWalletProvider } from '../../WaasSolanaWalletProvider.types';\nimport { sponsorTransaction } from '../sponsorTransaction';\n\nexport const createWalletProviderForWaasSolana = (\n sdkClient: DynamicClient\n): WaasSolanaWalletProvider => {\n const chain: Chain = 'SOL';\n\n const walletProviderType = WalletProviderEnum.EmbeddedWallet;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: DYNAMIC_WAAS_METADATA.displayName,\n walletProviderType,\n });\n\n const waasProvider = createWaasProvider({ chain, sdkClient });\n\n const getActiveNetworkId: WaasSolanaWalletProvider['getActiveNetworkId'] =\n async () =>\n getActiveNetworkIdFromLastKnownRegistry({\n client: sdkClient,\n walletProviderKey: key,\n });\n\n const switchActiveNetwork: WaasSolanaWalletProvider['switchActiveNetwork'] =\n async ({ networkId }) =>\n switchActiveNetworkInLastKnownRegistry({\n client: sdkClient,\n networkId,\n walletProviderKey: key,\n });\n\n const getConnectedAddresses: WaasSolanaWalletProvider['getConnectedAddresses'] =\n async () => {\n const waasSolanaAddresses = getAllUserWaasAddressesForChain(\n { chain },\n sdkClient\n );\n\n return {\n addresses: waasSolanaAddresses,\n };\n };\n\n const signAndSendTransaction: WaasSolanaWalletProvider['signAndSendTransaction'] =\n async ({ transaction, walletAccount, options }) => {\n const { signedTransaction } = await signTransaction({\n transaction,\n walletAccount,\n });\n\n const { networkData } = await getActiveNetworkData(\n { walletAccount },\n sdkClient\n );\n\n assertDefined(networkData, 'Network data is required');\n\n const connection = getSolanaConnection({ networkData });\n\n const rawTransaction = signedTransaction.serialize();\n\n const signature = await connection.sendRawTransaction(\n rawTransaction,\n options\n );\n\n return { signature };\n };\n\n const signAndSendSponsoredTransaction: WaasSolanaWalletProvider['signAndSendSponsoredTransaction'] =\n async ({ transaction, walletAccount, options }) => {\n const sponsoredTx = await sponsorTransaction(\n { transaction },\n sdkClient\n );\n\n const { signedTransaction } = await signTransaction({\n transaction: sponsoredTx,\n walletAccount,\n });\n\n const { networkData } = await getActiveNetworkData(\n { walletAccount },\n sdkClient\n );\n\n assertDefined(networkData, 'Network data is required');\n\n const connection = getSolanaConnection({ networkData });\n\n const rawTransaction = signedTransaction.serialize();\n\n // Skip preflight simulation to avoid false\n // \"Attempt to debit an account but found no record of a prior credit\"\n // errors — the fee payer has been replaced but preflight may still reject it\n const signature = await connection.sendRawTransaction(rawTransaction, {\n skipPreflight: true,\n ...options,\n });\n\n return { signature };\n };\n\n const signTransaction: WaasSolanaWalletProvider['signTransaction'] = async ({\n transaction,\n walletAccount,\n }) => {\n const messageBytes = isVersionedTransaction(transaction)\n ? transaction.message.serialize()\n : transaction.serializeMessage();\n\n const serializedTransaction = getBuffer()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .from(messageBytes as any)\n .toString('hex');\n\n const { signature } = await waasProvider.signSerializedTransaction({\n serializedTransaction,\n walletAccount,\n });\n\n const publicKey = new PublicKey(walletAccount.address);\n\n transaction.addSignature(\n publicKey,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getBuffer().from(signature, 'hex') as any\n );\n\n transaction.serialize({\n requireAllSignatures: false,\n verifySignatures: true,\n });\n\n return { signedTransaction: transaction };\n };\n\n const signAllTransactions: WaasSolanaWalletProvider['signAllTransactions'] =\n async ({ transactions, walletAccount }) => {\n const signedTransactions = await Promise.all(\n transactions.map(async (transaction) => {\n const { signedTransaction } = await signTransaction({\n transaction,\n walletAccount,\n });\n\n return signedTransaction;\n })\n );\n\n return { signedTransactions };\n };\n\n const signMessage: WaasSolanaWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n return waasProvider.signMessage({ message, walletAccount });\n };\n\n return {\n ...waasProvider,\n chain,\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(DYNAMIC_WAAS_METADATA.displayName),\n key,\n metadata: {\n displayName: DYNAMIC_WAAS_METADATA.displayName,\n icon: DYNAMIC_WAAS_METADATA.icon,\n },\n signAllTransactions,\n signAndSendSponsoredTransaction,\n signAndSendTransaction,\n signMessage,\n signTransaction,\n switchActiveNetwork,\n walletProviderType,\n };\n};\n","import {\n WalletProviderPriority,\n getDefaultClient,\n getWalletProviderRegistry,\n hasExtension,\n registerExtension,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { registerSolanaNetworkProviderBuilder } from '../../registerSolanaNetworkProviderBuilder';\nimport { createWalletProviderForWaasSolana } from '../utils/createWalletProviderForWaasSolana';\n\nexport const WAAS_SOLANA_EXTENSION_KEY = 'waasSolana';\n\n/**\n * Adds the Dynamic WaaS (Wallet as a Service) Solana extension to the Dynamic client.\n *\n * This extension enables embedded wallet functionality for Solana blockchain,\n * allowing users to have wallets managed by Dynamic's infrastructure.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n */\nexport const addWaasSolanaExtension = (client = getDefaultClient()): void => {\n if (hasExtension({ extensionKey: WAAS_SOLANA_EXTENSION_KEY }, client)) {\n return;\n }\n\n registerExtension({ extensionKey: WAAS_SOLANA_EXTENSION_KEY }, client);\n registerSolanaNetworkProviderBuilder(client);\n\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n const walletProvider = createWalletProviderForWaasSolana(client);\n\n walletProviderRegistry.register({\n priority: WalletProviderPriority.WALLET_SDK,\n walletProvider,\n });\n};\n"],"mappings":"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"}
@@ -4,8 +4,11 @@ export { SponsorTransactionError } from '../errors/SponsorTransactionError/Spons
4
4
  export { getSolanaConnection } from '../getSolanaConnection';
5
5
  export { isSolanaNetworkProvider } from '../isSolanaNetworkProvider';
6
6
  export { isSolanaWalletAccount } from '../isSolanaWalletAccount';
7
+ export { simulateSolanaTransaction } from '../simulateSolanaTransaction';
7
8
  export type { SolanaNetworkProvider } from '../SolanaNetworkProvider.types';
8
9
  export type { SolanaWalletAccount } from '../SolanaWalletAccount.types';
10
+ export type { SolanaSimulationResult, SolanaTransactionFeeData, } from '../transactionSimulation.types';
11
+ export { calculateSolanaTransactionFee } from '../utils/calculateSolanaTransactionFee';
9
12
  export { signAllTransactions } from '../signAllTransactions';
10
13
  export { signAndSendSponsoredTransaction } from '../signAndSendSponsoredTransaction';
11
14
  export { signAndSendTransaction } from '../signAndSendTransaction';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/exports/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2DAA2D,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,YAAY,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,YAAY,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/exports/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2DAA2D,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,YAAY,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,YAAY,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxE,YAAY,EACV,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AAEvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.cjs.js CHANGED
@@ -1,9 +1,12 @@
1
- const require_addSolanaWalletStandardExtension = require('./addSolanaWalletStandardExtension-C7EDAeZ9.cjs.js');
2
- const require_isVersionedTransaction = require('./isVersionedTransaction-DvMYHm_2.cjs.js');
3
- const require_addWaasSolanaExtension = require('./addWaasSolanaExtension-B5avqA3F.cjs.js');
1
+ const require_addSolanaWalletStandardExtension = require('./addSolanaWalletStandardExtension-BUUXr9jq.cjs.js');
2
+ const require_isVersionedTransaction = require('./isVersionedTransaction-D6zyaSEe.cjs.js');
3
+ const require_addWaasSolanaExtension = require('./addWaasSolanaExtension-B_Ql3oie.cjs.js');
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");
6
+ let _solana_web3_js = require("@solana/web3.js");
6
7
  let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
8
+ let bs58 = require("bs58");
9
+ bs58 = require_addSolanaWalletStandardExtension.__toESM(bs58);
7
10
 
8
11
  //#region src/addSolanaExtension/addSolanaExtension.ts
9
12
  /**
@@ -56,6 +59,170 @@ const isSolanaNetworkProvider = (networkProvider) => networkProvider.chain === "
56
59
  */
57
60
  const isSolanaWalletAccount = (walletAccount) => walletAccount.chain === "SOL";
58
61
 
62
+ //#endregion
63
+ //#region src/utils/calculateSolanaTransactionFee/calculateSolanaTransactionFee.ts
64
+ const MAX_RETRIES = 5;
65
+ const RETRY_DELAY_MS = 500;
66
+ const sleep = (ms) => new Promise((resolve) => {
67
+ setTimeout(resolve, ms);
68
+ });
69
+ /**
70
+ * Calculates the estimated fee for a Solana transaction.
71
+ *
72
+ * This function fetches the transaction fee by compiling the transaction message
73
+ * and querying the network. It handles both legacy Transaction and VersionedTransaction
74
+ * formats and includes retry logic for network requests.
75
+ *
76
+ * @param params.transaction - The Solana transaction to estimate fees for.
77
+ * @param params.networkData - Network configuration for RPC connection.
78
+ * @param params.nativeTokenPriceUsd - Optional USD price of SOL for fee conversion.
79
+ * @returns Fee data in lamports and human-readable SOL format.
80
+ * @throws {FeeEstimationFailedError} If fee retrieval fails after retries.
81
+ */
82
+ const calculateSolanaTransactionFee = async ({ transaction, networkData, nativeTokenPriceUsd }) => {
83
+ try {
84
+ const connection = new _solana_web3_js.Connection(networkData.rpcUrls.http[0]);
85
+ if (require_isVersionedTransaction.isVersionedTransaction(transaction)) {
86
+ if (!transaction.message.recentBlockhash) {
87
+ const { blockhash } = await connection.getLatestBlockhash();
88
+ transaction.message.recentBlockhash = blockhash;
89
+ }
90
+ } else if (!transaction.recentBlockhash) {
91
+ const { blockhash } = await connection.getLatestBlockhash();
92
+ transaction.recentBlockhash = blockhash;
93
+ }
94
+ const message = require_isVersionedTransaction.isVersionedTransaction(transaction) ? transaction.message : transaction.compileMessage();
95
+ let lastError;
96
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) try {
97
+ const feeResponse = await connection.getFeeForMessage(message);
98
+ if (feeResponse.value === null) throw new _dynamic_labs_sdk_client.FeeEstimationFailedError({ message: "Fee calculation returned null" });
99
+ const nativeAmount = BigInt(feeResponse.value);
100
+ const humanReadableAmount = (Number(nativeAmount) / _solana_web3_js.LAMPORTS_PER_SOL).toString();
101
+ return {
102
+ humanReadableAmount,
103
+ nativeAmount,
104
+ usdAmount: nativeTokenPriceUsd ? (Number(humanReadableAmount) * nativeTokenPriceUsd).toFixed(2) : void 0
105
+ };
106
+ } catch (error) {
107
+ lastError = error instanceof Error ? error : void 0;
108
+ if (attempt < MAX_RETRIES - 1) await sleep(RETRY_DELAY_MS * (attempt + 1));
109
+ }
110
+ throw new _dynamic_labs_sdk_client.FeeEstimationFailedError({
111
+ cause: lastError,
112
+ message: "Failed to get fee after retries"
113
+ });
114
+ } catch (error) {
115
+ throw new _dynamic_labs_sdk_client.FeeEstimationFailedError({
116
+ cause: error instanceof Error ? error : void 0,
117
+ message: "Failed to estimate Solana transaction fee"
118
+ });
119
+ }
120
+ };
121
+
122
+ //#endregion
123
+ //#region src/simulateSolanaTransaction/simulateSolanaTransaction.ts
124
+ /**
125
+ * Simulates a Solana transaction to preview its effects before execution.
126
+ *
127
+ * This function uses the Blockaid API to analyze the transaction and returns
128
+ * information about asset transfers, security validation, and optionally fee estimates.
129
+ * The simulation shows what will happen when the transaction is executed without
130
+ * actually sending it to the blockchain.
131
+ *
132
+ * **Important**: A successful simulation does not guarantee the transaction will succeed.
133
+ * The simulation may succeed but indicate the transaction would fail (e.g., due to
134
+ * insufficient balance). Check the `validation` field in the result for potential issues.
135
+ *
136
+ * @example
137
+ * ```typescript
138
+ * const result = await simulateSolanaTransaction({
139
+ * walletAccount,
140
+ * transaction,
141
+ * includeFees: true
142
+ * });
143
+ *
144
+ * // Check if transaction would fail
145
+ * if (result.validation?.reason?.includes('not enough SOL')) {
146
+ * console.log('Transaction would fail due to insufficient balance');
147
+ * }
148
+ * ```
149
+ *
150
+ * @param params.walletAccount - The Solana wallet account that will sign the transaction.
151
+ * @param params.transaction - The Solana transaction (legacy or versioned) to simulate.
152
+ * @param params.includeFees - Whether to calculate transaction fees (default: false).
153
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
154
+ * @returns Simulation result with asset diffs, security validation, and optional fee data.
155
+ * @throws {InvalidParamError} If wallet account is not a Solana account.
156
+ * @throws {SimulationFailedError} If the simulation API call fails.
157
+ * @throws {FeeEstimationFailedError} If includeFees is true and fee calculation fails.
158
+ */
159
+ const simulateSolanaTransaction = async ({ walletAccount, transaction, includeFees = false }, client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => {
160
+ if (!isSolanaWalletAccount(walletAccount)) throw new _dynamic_labs_sdk_client.InvalidParamError("Wallet account must be a Solana wallet account");
161
+ const { networkData } = await (0, _dynamic_labs_sdk_client.getActiveNetworkData)({ walletAccount }, client);
162
+ if (!networkData) throw new _dynamic_labs_sdk_client.InvalidParamError("Network data not found for wallet account");
163
+ try {
164
+ const transactionBytes = require_isVersionedTransaction.isVersionedTransaction(transaction) ? transaction.serialize() : transaction.serialize({
165
+ requireAllSignatures: false,
166
+ verifySignatures: false
167
+ });
168
+ const serialized = bs58.default.encode(transactionBytes);
169
+ console.log("[SIMULATE SOLANA TX] Serialization details:", {
170
+ accountAddress: walletAccount.address,
171
+ isVersioned: require_isVersionedTransaction.isVersionedTransaction(transaction),
172
+ serializedBase58: serialized,
173
+ serializedLength: serialized.length,
174
+ transactionLength: transactionBytes.length
175
+ });
176
+ const core = (0, _dynamic_labs_sdk_client_core.getCore)(client);
177
+ const apiClient = (0, _dynamic_labs_sdk_client_core.createApiClient)({}, client);
178
+ const requestPayload = {
179
+ environmentId: core.environmentId,
180
+ simulateSVMTransactionRequest: {
181
+ accountAddress: walletAccount.address,
182
+ chain: "solana",
183
+ method: "solana_signTransaction",
184
+ transactions: [serialized]
185
+ }
186
+ };
187
+ console.log("[SIMULATE SOLANA TX] API Request:", requestPayload);
188
+ const response = await apiClient.simulateSVMTransaction(requestPayload);
189
+ let feeData;
190
+ if (includeFees) {
191
+ const walletPublicKey = new _solana_web3_js.PublicKey(walletAccount.address);
192
+ const feePayer = require_isVersionedTransaction.isVersionedTransaction(transaction) ? transaction.message.staticAccountKeys[0] : transaction.feePayer;
193
+ if (feePayer && !feePayer.equals(walletPublicKey)) feeData = {
194
+ humanReadableAmount: "0",
195
+ nativeAmount: 0n,
196
+ usdAmount: "0.00"
197
+ };
198
+ else feeData = await calculateSolanaTransactionFee({
199
+ nativeTokenPriceUsd: response.priceData?.nativeTokenUsdPrice,
200
+ networkData,
201
+ transaction
202
+ });
203
+ }
204
+ return {
205
+ counterparties: response.counterparties,
206
+ feeData,
207
+ inAssets: response.inAssets || [],
208
+ outAssets: response.outAssets || [],
209
+ priceData: response.priceData,
210
+ showTotalFiat: response.showTotalFiat,
211
+ validation: response.validation ? {
212
+ description: response.validation.description,
213
+ reason: response.validation.reason,
214
+ result: response.validation.result
215
+ } : void 0
216
+ };
217
+ } catch (error) {
218
+ if (error instanceof _dynamic_labs_sdk_client.FeeEstimationFailedError) throw error;
219
+ throw new _dynamic_labs_sdk_client.SimulationFailedError({
220
+ cause: error instanceof Error ? error : void 0,
221
+ message: "Failed to simulate Solana transaction"
222
+ });
223
+ }
224
+ };
225
+
59
226
  //#endregion
60
227
  //#region src/isSolanaWalletProvider/isSolanaWalletProvider.ts
61
228
  const isSolanaWalletProvider = (provider) => {
@@ -149,6 +316,7 @@ const signTransaction = async ({ walletAccount, transaction }, client = (0, _dyn
149
316
  exports.NotSolanaProviderError = NotSolanaProviderError;
150
317
  exports.SponsorTransactionError = require_addWaasSolanaExtension.SponsorTransactionError;
151
318
  exports.addSolanaExtension = addSolanaExtension;
319
+ exports.calculateSolanaTransactionFee = calculateSolanaTransactionFee;
152
320
  exports.getSolanaConnection = require_addWaasSolanaExtension.getSolanaConnection;
153
321
  exports.isSolanaNetworkProvider = isSolanaNetworkProvider;
154
322
  exports.isSolanaWalletAccount = isSolanaWalletAccount;
@@ -156,4 +324,5 @@ exports.signAllTransactions = signAllTransactions;
156
324
  exports.signAndSendSponsoredTransaction = signAndSendSponsoredTransaction;
157
325
  exports.signAndSendTransaction = signAndSendTransaction;
158
326
  exports.signTransaction = signTransaction;
327
+ exports.simulateSolanaTransaction = simulateSolanaTransaction;
159
328
  //# sourceMappingURL=index.cjs.js.map