@dynamic-labs-sdk/solana 0.15.0 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{addSolanaWalletStandardExtension-Bf8r6-4V.cjs.js → addSolanaWalletStandardExtension-0JyyakfO.cjs.js} +2 -2
- package/dist/{addSolanaWalletStandardExtension-Bf8r6-4V.cjs.js.map → addSolanaWalletStandardExtension-0JyyakfO.cjs.js.map} +1 -1
- package/dist/{addSolanaWalletStandardExtension-BngOUdym.esm.js → addSolanaWalletStandardExtension-CPT-KI29.esm.js} +2 -2
- package/dist/{addSolanaWalletStandardExtension-BngOUdym.esm.js.map → addSolanaWalletStandardExtension-CPT-KI29.esm.js.map} +1 -1
- package/dist/{addWaasSolanaExtension-BYxLx6fj.esm.js → addWaasSolanaExtension-CLhieXpF.esm.js} +4 -2
- package/dist/{addWaasSolanaExtension-BYxLx6fj.esm.js.map → addWaasSolanaExtension-CLhieXpF.esm.js.map} +1 -1
- package/dist/{addWaasSolanaExtension-CSzXRhvr.cjs.js → addWaasSolanaExtension-s5RmA285.cjs.js} +5 -3
- package/dist/{addWaasSolanaExtension-CSzXRhvr.cjs.js.map → addWaasSolanaExtension-s5RmA285.cjs.js.map} +1 -1
- package/dist/index.cjs.js +41 -40
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +43 -42
- package/dist/index.esm.js.map +1 -1
- package/dist/phantomRedirect/addPhantomRedirectSolanaExtension/addPhantomRedirectSolanaExtension.d.ts.map +1 -1
- package/dist/phantomRedirect/completePhantomRedirect/completePhantomRedirect.d.ts.map +1 -1
- package/dist/phantomRedirect/createPhantomRedirectWalletProvider/createPhantomRedirectWalletProvider.d.ts.map +1 -1
- package/dist/phantomRedirect/detectPhantomRedirect/detectPhantomRedirect.d.ts +10 -0
- package/dist/phantomRedirect/detectPhantomRedirect/detectPhantomRedirect.d.ts.map +1 -1
- package/dist/{solanaTransferAmount-C1cnaJBQ.esm.js → solanaTransferAmount-Bd39IUO-.esm.js} +2 -2
- package/dist/{solanaTransferAmount-C1cnaJBQ.esm.js.map → solanaTransferAmount-Bd39IUO-.esm.js.map} +1 -1
- package/dist/{solanaTransferAmount-sL92hrfS.cjs.js → solanaTransferAmount-DQusACZn.cjs.js} +3 -3
- package/dist/{solanaTransferAmount-sL92hrfS.cjs.js.map → solanaTransferAmount-DQusACZn.cjs.js.map} +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/waas/utils/createWalletProviderForWaasSolana/createWalletProviderForWaasSolana.d.ts.map +1 -1
- package/dist/waas.cjs.js +3 -3
- package/dist/waas.esm.js +2 -2
- package/dist/walletStandard.cjs.js +2 -2
- package/dist/walletStandard.esm.js +2 -2
- package/package.json +5 -5
|
@@ -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_solanaTransferAmount = require('./solanaTransferAmount-
|
|
28
|
+
const require_solanaTransferAmount = require('./solanaTransferAmount-DQusACZn.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");
|
|
@@ -230,4 +230,4 @@ Object.defineProperty(exports, 'addSolanaWalletStandardExtension', {
|
|
|
230
230
|
return addSolanaWalletStandardExtension;
|
|
231
231
|
}
|
|
232
232
|
});
|
|
233
|
-
//# sourceMappingURL=addSolanaWalletStandardExtension-
|
|
233
|
+
//# sourceMappingURL=addSolanaWalletStandardExtension-0JyyakfO.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addSolanaWalletStandardExtension-Bf8r6-4V.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']","solanaExecuteCheckoutTransaction","solanaTransferAmount","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 { solanaExecuteCheckoutTransaction } from '../../../utils/solanaExecuteCheckoutTransaction';\nimport { solanaTransferAmount } from '../../../utils/solanaTransferAmount';\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 executeCheckoutTransaction: (args) =>\n solanaExecuteCheckoutTransaction(args, dynamicClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(walletStandardWallet.name),\n key,\n metadata: {\n displayName: walletStandardWallet.name,\n icon: walletStandardWallet.icon,\n },\n signAllTransactions,\n signAndSendTransaction,\n signMessage,\n signTransaction,\n switchActiveNetwork,\n terminate,\n transferAmount: (args) => solanaTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n\n return walletProvider;\n};\n","import type { Wallet } from '@wallet-standard/base';\n\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-0JyyakfO.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']","solanaExecuteCheckoutTransaction","solanaTransferAmount","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 { solanaExecuteCheckoutTransaction } from '../../../utils/solanaExecuteCheckoutTransaction';\nimport { solanaTransferAmount } from '../../../utils/solanaTransferAmount';\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 executeCheckoutTransaction: (args) =>\n solanaExecuteCheckoutTransaction(args, dynamicClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(walletStandardWallet.name),\n key,\n metadata: {\n displayName: walletStandardWallet.name,\n icon: walletStandardWallet.icon,\n },\n signAllTransactions,\n signAndSendTransaction,\n signMessage,\n signTransaction,\n switchActiveNetwork,\n terminate,\n transferAmount: (args) => solanaTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n\n return walletProvider;\n};\n","import type { Wallet } from '@wallet-standard/base';\n\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 { i as solanaExecuteCheckoutTransaction, l as registerSolanaNetworkProviderBuilder, s as isVersionedTransaction, t as solanaTransferAmount } from "./solanaTransferAmount-
|
|
1
|
+
import { i as solanaExecuteCheckoutTransaction, l as registerSolanaNetworkProviderBuilder, s as isVersionedTransaction, t as solanaTransferAmount } from "./solanaTransferAmount-Bd39IUO-.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";
|
|
@@ -191,4 +191,4 @@ const addSolanaWalletStandardExtension = (client = getDefaultClient()) => {
|
|
|
191
191
|
|
|
192
192
|
//#endregion
|
|
193
193
|
export { addSolanaWalletStandardExtension as t };
|
|
194
|
-
//# sourceMappingURL=addSolanaWalletStandardExtension-
|
|
194
|
+
//# sourceMappingURL=addSolanaWalletStandardExtension-CPT-KI29.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addSolanaWalletStandardExtension-BngOUdym.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 { solanaExecuteCheckoutTransaction } from '../../../utils/solanaExecuteCheckoutTransaction';\nimport { solanaTransferAmount } from '../../../utils/solanaTransferAmount';\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 executeCheckoutTransaction: (args) =>\n solanaExecuteCheckoutTransaction(args, dynamicClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(walletStandardWallet.name),\n key,\n metadata: {\n displayName: walletStandardWallet.name,\n icon: walletStandardWallet.icon,\n },\n signAllTransactions,\n signAndSendTransaction,\n signMessage,\n signTransaction,\n switchActiveNetwork,\n terminate,\n transferAmount: (args) => solanaTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n\n return walletProvider;\n};\n","import type { Wallet } from '@wallet-standard/base';\n\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":";;;;;;;;;AAOA,MAAa,0BAA0B,OACrC,EAAE,iBACF,WAC4C;CAC5C,MAAM,EAAE,gBAAgB,MAAM,qBAAqB,EAAE,eAAe,EAAE,OAAO;AAE7E,KAAI,CAAC,aAAa,QAChB;AAGF,QAAO,UAAU,YAAY;;;;;ACG/B,MAAa,sCAAsC,WAAmB;AACpE,QAAO,OAAO;;;;;ACUhB,MAAa,gDAAgD,EAC3D,eACA,2BAC8E;CAC9E,MAAM,WAAW,mCAAmC,qBAAqB;CAEzE,MAAM,qBAAqB,mBAAmB;CAE9C,MAAM,MAAM,wBAAwB;EAClC,OAAO;EACP,aAAa,qBAAqB;EAClC;EACD,CAAC;CAEF,MAAMA,UAA2C,YAAY;EAC3D,MAAM,wBAAwB,qBAAqB;AAKnD,MACE,uBAAuB,UACvB,sBAAsB,GAAG,aACzB,sBAAsB,GAAG,QAEzB,QAAO,EACL,WAAW,CACT;GACE,SAAS,sBAAsB,GAAG;GAClC,WAAW,sBAAsB,GAAG,UAAU,UAAU;GACzD,CACF,EACF;EAGH,MAAM,gBAAgB,SAAS,qBAAqB;AAEpD,gBAAc,eAAe,8CAA8C;AAI3E,SAAO,EACL,YAHa,MAAM,cAAc,EAAE,QAAQ,OAAO,CAAC,EAGjC,UAAU,KAAK,aAAa;GAC5C,SAAS,QAAQ;GACjB,WAAW,QAAQ,WAAW,UAAU;GACzC,EAAE,EACJ;;CAEH,MAAM,oBAAoB,SAAS,wBAAwB;CAE3D,MAAMC,qBACJ,YACE,wCAAwC;EACtC,QAAQ;EACR,mBAAmB;EACpB,CAAC;CAEN,MAAM,oBAAoB,YAAY;AACpC,MAAI,CAAC,aAAa,IAAI,QACpB,OAAM,SAAS;EAGjB,MAAM,UAAU,qBAAqB,WAAW;AAEhD,gBAAc,SAAS,8BAA8B;AAErD,SAAO;;CAGT,MAAM,oBAA6B;AACjC,SAAO,qBAAqB,UAAU,SAAS;;CAGjD,MAAMC,wBACJ,YAAY;AACV,MAAI,CAAC,aAAa,IAAI,QACpB,OAAM,SAAS;AAGjB,SAAO,EACL,WAAW,qBAAqB,SAAS,KACtC,YAAY,QAAQ,QACtB,EACF;;CAGL,MAAMC,sBACJ,OAAO,EAAE,cAAc,oBAAoB;EACzC,MAAM,wBACJ,SAAS,2BAA2B;AAEtC,gBACE,uBACA,sDACD;AAED,QAAM,uCACJ,EAAE,eAAe,EACjB,cACD;EAED,MAAM,UAAU,MAAM,mBAAmB;EAEzC,MAAM,QAAQ,MAAM,wBAClB,EAAE,eAAe,EACjB,cACD;AACD,gBAAc,OAAO,gDAAgD;AA4BrE,SAAO,EAAE,qBAhBqB,MAAM,sBAClC,GAXgD,aAAa,KAC5D,iBAAiB;GAChB;GACA;GACA,aAAa,YAAY,UAAU,EACjC,sBAAsB,OACvB,CAAC;GACH,EACF,CAIA,EAEgD,KAC9C,EAAE,qBAAqB,UAAU;GAChC,MAAM,mBAAmB,aAAa;AAGtC,OAAI,uBAAuB,iBAAiB,CAC1C,QAAO,qBAAqB,YAAY,kBAAkB;AAE5D,UAAO,YAAY,KAAK,kBAAkB;IAE7C,EAE4B;;CAGjC,MAAMC,yBACJ,OAAO,EAAE,aAAa,oBAAoB;AACxC,QAAM,uCACJ,EACE,eACD,EACD,cACD;EAED,MAAM,+BACJ,SAAS,kCAAkC;AAE7C,gBACE,8BACA,6DACD;EAED,MAAM,UAAU,MAAM,mBAAmB;EAEzC,MAAM,QAAQ,MAAM,wBAClB,EAAE,eAAe,EACjB,cACD;AACD,gBAAc,OAAO,gDAAgD;EAUrE,MAAM,CAAC,EAAE,eARkB,MAAM,6BAA6B;GAC5D;GACA;GACA,aAAa,YAAY,UAAU,EACjC,sBAAsB,OACvB,CAAC;GACH,CAAC;AAIF,SAAO,EAAE,WAAW,KAAK,OAAO,UAAU,EAAE;;CAGhD,MAAMC,cAAmD,OAAO,EAC9D,SACA,oBACI;EACJ,MAAM,oBAAoB,SAAS,uBAAuB;AAE1D,gBACE,mBACA,kDACD;AAED,gBAAc,eAAe,2BAA2B;AAExD,QAAM,uCACJ,EACE,eACD,EACD,cACD;EAED,MAAM,iBAAiB,IAAI,aAAa,CAAC,OAAO,QAAQ;AASxD,SAAO,EAAE,WAAW,gBALH,MAAM,kBAAkB;GACvC,SAHc,MAAM,mBAAmB;GAIvC,SAAS;GACV,CAAC,EAE0C,GAAG,UAAU,EAAE;;CAG7D,MAAMC,kBAA2D,OAAO,EACtE,aACA,oBACI;AAMJ,SAAO,EAAE,oBALkB,MAAM,oBAAoB;GACnD,cAAc,CAAC,YAAY;GAC3B;GACD,CAAC,EAE6C,mBAAmB,IAAI;;CAGxE,MAAMC,sBACJ,OAAO,EAAE,gBACP,uCAAuC;EACrC,QAAQ;EACR;EACA,mBAAmB;EACpB,CAAC;CAEN,MAAM,EAAE,iBAAiB,wBACvB,iCAA+C;EAC7C,uBAAuB,EAAE,uBAAuB;AAC9C,iBAAc,kBAAkB,iCAAiC;AAEjE,qBAAkB;;EAGpB,sBAAsB,EAAE,4BAA4B;AAGlD,UAFsB,SAAS,mBAEV,GAAG,WAAW,EAAE,eAAe;AAClD,0BAAsB,EACpB,WAAW,UAAU,KAAK,YAAY,QAAQ,QAAQ,IAAI,EAAE,EAC7D,CAAC;KACF;;EAGJ,iBAAiB,CAAC,kBAAkB;EACrC,CAAC;CAEJ,MAAMC,YAA+C,YAAY;AAC/D,uBAAqB;;AA8BvB,QA3B6C;EAC3C,OAAO;EACP;EACA,YAAY;EACZ,IAAI,SAAS;AACX,UAAO,iBAAiB;;EAE1B,6BAA6B,SAC3B,iCAAiC,MAAM,cAAc;EACvD;EACA;EACA,UAAU,6BAA6B,qBAAqB,KAAK;EACjE;EACA,UAAU;GACR,aAAa,qBAAqB;GAClC,MAAM,qBAAqB;GAC5B;EACD;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB,SAAS,qBAAqB,MAAM,cAAc;EACnE;EACD;;;;;ACnTH,MAAa,0BAA0B,WAA4B;AACjE,QAAO,QACL,OAAO,WAAW,sBAChB,OAAO,WAAW,uBAClB,OAAO,WAAW,6BAClB,OAAO,WAAW,sBACrB;;;;;ACKH,MAAa,uCAAuC;;;;;;;;;AAUpD,MAAa,oCACX,SAAS,kBAAkB,KAClB;AACT,KACE,aAAa,EAAE,cAAc,sCAAsC,EAAE,OAAO,CAE5E;AAGF,mBACE,EAAE,cAAc,sCAAsC,EACtD,OACD;AAED,sCAAqC,OAAO;CAE5C,MAAM,yBAAyB,0BAA0B,OAAO;AAMhE,CAJ8B,YAAY,CACvC,KAAK,CACL,OAAO,uBAAuB,CAEX,SAAS,yBAAyB;EACtD,MAAM,iBAAiB,6CAA6C;GAClE,eAAe;GACf;GACD,CAAC;AAEF,yBAAuB,SAAS;GAC9B,UAAU,uBAAuB;GACjC;GACD,CAAC;GACF"}
|
|
1
|
+
{"version":3,"file":"addSolanaWalletStandardExtension-CPT-KI29.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 { solanaExecuteCheckoutTransaction } from '../../../utils/solanaExecuteCheckoutTransaction';\nimport { solanaTransferAmount } from '../../../utils/solanaTransferAmount';\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 executeCheckoutTransaction: (args) =>\n solanaExecuteCheckoutTransaction(args, dynamicClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(walletStandardWallet.name),\n key,\n metadata: {\n displayName: walletStandardWallet.name,\n icon: walletStandardWallet.icon,\n },\n signAllTransactions,\n signAndSendTransaction,\n signMessage,\n signTransaction,\n switchActiveNetwork,\n terminate,\n transferAmount: (args) => solanaTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n\n return walletProvider;\n};\n","import type { Wallet } from '@wallet-standard/base';\n\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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"}
|
package/dist/{addWaasSolanaExtension-BYxLx6fj.esm.js → addWaasSolanaExtension-CLhieXpF.esm.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as getSolanaConnection, i as solanaExecuteCheckoutTransaction, l as registerSolanaNetworkProviderBuilder, s as isVersionedTransaction, t as solanaTransferAmount } from "./solanaTransferAmount-
|
|
1
|
+
import { c as getSolanaConnection, i as solanaExecuteCheckoutTransaction, l as registerSolanaNetworkProviderBuilder, s as isVersionedTransaction, t as solanaTransferAmount } from "./solanaTransferAmount-Bd39IUO-.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 { PublicKey, VersionedTransaction } from "@solana/web3.js";
|
|
4
4
|
import { BaseError, getActiveNetworkData } from "@dynamic-labs-sdk/client";
|
|
@@ -109,7 +109,9 @@ const createWalletProviderForWaasSolana = (sdkClient) => {
|
|
|
109
109
|
const signTransaction = async ({ transaction, walletAccount }) => {
|
|
110
110
|
const messageBytes = isVersionedTransaction(transaction) ? transaction.message.serialize() : transaction.serializeMessage();
|
|
111
111
|
const serializedTransaction = getBuffer().from(messageBytes).toString("hex");
|
|
112
|
+
const { networkData } = await getActiveNetworkData({ walletAccount }, sdkClient);
|
|
112
113
|
const { signature } = await waasProvider.signSerializedTransaction({
|
|
114
|
+
chainId: networkData?.networkId,
|
|
113
115
|
serializedTransaction,
|
|
114
116
|
walletAccount
|
|
115
117
|
});
|
|
@@ -185,4 +187,4 @@ const addWaasSolanaExtension = (client = getDefaultClient()) => {
|
|
|
185
187
|
|
|
186
188
|
//#endregion
|
|
187
189
|
export { SponsorTransactionError as n, addWaasSolanaExtension as t };
|
|
188
|
-
//# sourceMappingURL=addWaasSolanaExtension-
|
|
190
|
+
//# sourceMappingURL=addWaasSolanaExtension-CLhieXpF.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addWaasSolanaExtension-BYxLx6fj.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/errors/SponsorTransactionError/SponsorTransactionError.ts","../src/waas/utils/sponsorTransaction/sponsorTransaction.ts","../src/waas/utils/createWalletProviderForWaasSolana/createWalletProviderForWaasSolana.ts","../src/waas/addWaasSolanaExtension/addWaasSolanaExtension.ts"],"sourcesContent":["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 { solanaExecuteCheckoutTransaction } from '../../../utils/solanaExecuteCheckoutTransaction';\nimport { solanaTransferAmount } from '../../../utils/solanaTransferAmount';\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({ transaction }, sdkClient);\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 executeCheckoutTransaction: (args) =>\n solanaExecuteCheckoutTransaction(args, sdkClient),\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 transferAmount: (args) => solanaTransferAmount(args, sdkClient),\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":";;;;;;;;AAEA,IAAa,0BAAb,cAA6C,UAAU;CACrD,YAAY,OAAsB;AAChC,QAAM;GACJ,OAAO,SAAS;GAChB,MAAM;GACN,SAAS;GACT,MAAM;GACN,cAAc;GACf,CAAC;;;;;;;;;;;;;;;;;;;ACmBN,MAAa,qBAAqB,OAChC,EAAE,eACF,WACkC;CAClC,MAAM,OAAO,QAAQ,OAAO;CAE5B,MAAM,aAAa,uBAAuB,YAAY,GAClD,YAAY,WAAW,GACvB,YAAY,UAAU;EACpB,sBAAsB;EACtB,kBAAkB;EACnB,CAAC;CAEN,MAAM,oBAAoB,WAAW,CAClC,KAAK,WAAyB,CAC9B,SAAS,SAAS;CAErB,MAAM,YAAY,gBAAgB,EAAE,EAAE,OAAO;CAE7C,IAAI;AAEJ,KAAI;AACF,SAAO,MAAM,UAAU,sBAAsB;GAC3C,eAAe,KAAK;GACpB,8BAA8B,EAC5B,aAAa,mBACd;GACF,CAAC;UACK,OAAO;AAEd,QAAM,IAAI,wBADI,iBAAiB,QAAQ,QAAQ,KACP;;AAG1C,KAAI,CAAC,KAAK,YACR,OAAM,IAAI,yBAAyB;CAGrC,MAAM,SAAS,WAAW,CAAC,KAAK,KAAK,aAAa,SAAS;AAE3D,QAAO,qBAAqB,YAAY,IAAI,WAAW,OAAO,CAAC;;;;;ACxCjE,MAAa,qCACX,cAC6B;CAC7B,MAAMA,QAAe;CAErB,MAAM,qBAAqB,mBAAmB;CAE9C,MAAM,MAAM,wBAAwB;EAClC;EACA,aAAa,sBAAsB;EACnC;EACD,CAAC;CAEF,MAAM,eAAe,mBAAmB;EAAE;EAAO;EAAW,CAAC;CAE7D,MAAMC,qBACJ,YACE,wCAAwC;EACtC,QAAQ;EACR,mBAAmB;EACpB,CAAC;CAEN,MAAMC,sBACJ,OAAO,EAAE,gBACP,uCAAuC;EACrC,QAAQ;EACR;EACA,mBAAmB;EACpB,CAAC;CAEN,MAAMC,wBACJ,YAAY;AAMV,SAAO,EACL,WAN0B,gCAC1B,EAAE,OAAO,EACT,UACD,EAIA;;CAGL,MAAMC,yBACJ,OAAO,EAAE,aAAa,eAAe,cAAc;EACjD,MAAM,EAAE,sBAAsB,MAAM,gBAAgB;GAClD;GACA;GACD,CAAC;EAEF,MAAM,EAAE,gBAAgB,MAAM,qBAC5B,EAAE,eAAe,EACjB,UACD;AAED,gBAAc,aAAa,2BAA2B;EAEtD,MAAM,aAAa,oBAAoB,EAAE,aAAa,CAAC;EAEvD,MAAM,iBAAiB,kBAAkB,WAAW;AAOpD,SAAO,EAAE,WALS,MAAM,WAAW,mBACjC,gBACA,QACD,EAEmB;;CAGxB,MAAMC,kCACJ,OAAO,EAAE,aAAa,eAAe,cAAc;EAGjD,MAAM,EAAE,sBAAsB,MAAM,gBAAgB;GAClD,aAHkB,MAAM,mBAAmB,EAAE,aAAa,EAAE,UAAU;GAItE;GACD,CAAC;EAEF,MAAM,EAAE,gBAAgB,MAAM,qBAC5B,EAAE,eAAe,EACjB,UACD;AAED,gBAAc,aAAa,2BAA2B;EAEtD,MAAM,aAAa,oBAAoB,EAAE,aAAa,CAAC;EAEvD,MAAM,iBAAiB,kBAAkB,WAAW;AAUpD,SAAO,EAAE,WALS,MAAM,WAAW,mBAAmB,gBAAgB;GACpE,eAAe;GACf,GAAG;GACJ,CAAC,EAEkB;;CAGxB,MAAMC,kBAA+D,OAAO,EAC1E,aACA,oBACI;EACJ,MAAM,eAAe,uBAAuB,YAAY,GACpD,YAAY,QAAQ,WAAW,GAC/B,YAAY,kBAAkB;EAElC,MAAM,wBAAwB,WAAW,CAEtC,KAAK,aAAoB,CACzB,SAAS,MAAM;EAElB,MAAM,EAAE,cAAc,MAAM,aAAa,0BAA0B;GACjE;GACA;GACD,CAAC;EAEF,MAAM,YAAY,IAAI,UAAU,cAAc,QAAQ;AAEtD,cAAY,aACV,WAEA,WAAW,CAAC,KAAK,WAAW,MAAM,CACnC;AAED,cAAY,UAAU;GACpB,sBAAsB;GACtB,kBAAkB;GACnB,CAAC;AAEF,SAAO,EAAE,mBAAmB,aAAa;;CAG3C,MAAMC,sBACJ,OAAO,EAAE,cAAc,oBAAoB;AAYzC,SAAO,EAAE,oBAXkB,MAAM,QAAQ,IACvC,aAAa,IAAI,OAAO,gBAAgB;GACtC,MAAM,EAAE,sBAAsB,MAAM,gBAAgB;IAClD;IACA;IACD,CAAC;AAEF,UAAO;IACP,CACH,EAE4B;;CAGjC,MAAMC,cAAuD,OAAO,EAClE,SACA,oBACI;AACJ,gBAAc,eAAe,6BAA6B;AAE1D,SAAO,aAAa,YAAY;GAAE;GAAS;GAAe,CAAC;;AAG7D,QAAO;EACL,GAAG;EACH;EACA,6BAA6B,SAC3B,iCAAiC,MAAM,UAAU;EACnD;EACA;EACA,UAAU,6BAA6B,sBAAsB,YAAY;EACzE;EACA,UAAU;GACR,aAAa,sBAAsB;GACnC,MAAM,sBAAsB;GAC7B;EACD;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB,SAAS,qBAAqB,MAAM,UAAU;EAC/D;EACD;;;;;ACpMH,MAAa,4BAA4B;;;;;;;;;AAUzC,MAAa,0BAA0B,SAAS,kBAAkB,KAAW;AAC3E,KAAI,aAAa,EAAE,cAAc,2BAA2B,EAAE,OAAO,CACnE;AAGF,mBAAkB,EAAE,cAAc,2BAA2B,EAAE,OAAO;AACtE,sCAAqC,OAAO;CAE5C,MAAM,yBAAyB,0BAA0B,OAAO;CAEhE,MAAM,iBAAiB,kCAAkC,OAAO;AAEhE,wBAAuB,SAAS;EAC9B,UAAU,uBAAuB;EACjC;EACD,CAAC"}
|
|
1
|
+
{"version":3,"file":"addWaasSolanaExtension-CLhieXpF.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/errors/SponsorTransactionError/SponsorTransactionError.ts","../src/waas/utils/sponsorTransaction/sponsorTransaction.ts","../src/waas/utils/createWalletProviderForWaasSolana/createWalletProviderForWaasSolana.ts","../src/waas/addWaasSolanaExtension/addWaasSolanaExtension.ts"],"sourcesContent":["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 { solanaExecuteCheckoutTransaction } from '../../../utils/solanaExecuteCheckoutTransaction';\nimport { solanaTransferAmount } from '../../../utils/solanaTransferAmount';\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({ transaction }, sdkClient);\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 { networkData } = await getActiveNetworkData(\n { walletAccount },\n sdkClient\n );\n\n const { signature } = await waasProvider.signSerializedTransaction({\n chainId: networkData?.networkId,\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 executeCheckoutTransaction: (args) =>\n solanaExecuteCheckoutTransaction(args, sdkClient),\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 transferAmount: (args) => solanaTransferAmount(args, sdkClient),\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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"}
|
package/dist/{addWaasSolanaExtension-CSzXRhvr.cjs.js → addWaasSolanaExtension-s5RmA285.cjs.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const require_addSolanaWalletStandardExtension = require('./addSolanaWalletStandardExtension-
|
|
2
|
-
const require_solanaTransferAmount = require('./solanaTransferAmount-
|
|
1
|
+
const require_addSolanaWalletStandardExtension = require('./addSolanaWalletStandardExtension-0JyyakfO.cjs.js');
|
|
2
|
+
const require_solanaTransferAmount = require('./solanaTransferAmount-DQusACZn.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");
|
|
@@ -110,7 +110,9 @@ const createWalletProviderForWaasSolana = (sdkClient) => {
|
|
|
110
110
|
const signTransaction = async ({ transaction, walletAccount }) => {
|
|
111
111
|
const messageBytes = require_solanaTransferAmount.isVersionedTransaction(transaction) ? transaction.message.serialize() : transaction.serializeMessage();
|
|
112
112
|
const serializedTransaction = (0, _dynamic_labs_sdk_client_core.getBuffer)().from(messageBytes).toString("hex");
|
|
113
|
+
const { networkData } = await (0, _dynamic_labs_sdk_client.getActiveNetworkData)({ walletAccount }, sdkClient);
|
|
113
114
|
const { signature } = await waasProvider.signSerializedTransaction({
|
|
115
|
+
chainId: networkData?.networkId,
|
|
114
116
|
serializedTransaction,
|
|
115
117
|
walletAccount
|
|
116
118
|
});
|
|
@@ -197,4 +199,4 @@ Object.defineProperty(exports, 'addWaasSolanaExtension', {
|
|
|
197
199
|
return addWaasSolanaExtension;
|
|
198
200
|
}
|
|
199
201
|
});
|
|
200
|
-
//# sourceMappingURL=addWaasSolanaExtension-
|
|
202
|
+
//# sourceMappingURL=addWaasSolanaExtension-s5RmA285.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addWaasSolanaExtension-CSzXRhvr.cjs.js","names":["BaseError","isVersionedTransaction","VersionedTransaction","chain: Chain","WalletProviderEnum","DYNAMIC_WAAS_METADATA","getActiveNetworkId: WaasSolanaWalletProvider['getActiveNetworkId']","switchActiveNetwork: WaasSolanaWalletProvider['switchActiveNetwork']","getConnectedAddresses: WaasSolanaWalletProvider['getConnectedAddresses']","signAndSendTransaction: WaasSolanaWalletProvider['signAndSendTransaction']","getSolanaConnection","signAndSendSponsoredTransaction: WaasSolanaWalletProvider['signAndSendSponsoredTransaction']","signTransaction: WaasSolanaWalletProvider['signTransaction']","isVersionedTransaction","PublicKey","signAllTransactions: WaasSolanaWalletProvider['signAllTransactions']","signMessage: WaasSolanaWalletProvider['signMessage']","solanaExecuteCheckoutTransaction","solanaTransferAmount","WalletProviderPriority"],"sources":["../src/errors/SponsorTransactionError/SponsorTransactionError.ts","../src/waas/utils/sponsorTransaction/sponsorTransaction.ts","../src/waas/utils/createWalletProviderForWaasSolana/createWalletProviderForWaasSolana.ts","../src/waas/addWaasSolanaExtension/addWaasSolanaExtension.ts"],"sourcesContent":["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 { solanaExecuteCheckoutTransaction } from '../../../utils/solanaExecuteCheckoutTransaction';\nimport { solanaTransferAmount } from '../../../utils/solanaTransferAmount';\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({ transaction }, sdkClient);\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 executeCheckoutTransaction: (args) =>\n solanaExecuteCheckoutTransaction(args, sdkClient),\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 transferAmount: (args) => solanaTransferAmount(args, sdkClient),\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
|
+
{"version":3,"file":"addWaasSolanaExtension-s5RmA285.cjs.js","names":["BaseError","isVersionedTransaction","VersionedTransaction","chain: Chain","WalletProviderEnum","DYNAMIC_WAAS_METADATA","getActiveNetworkId: WaasSolanaWalletProvider['getActiveNetworkId']","switchActiveNetwork: WaasSolanaWalletProvider['switchActiveNetwork']","getConnectedAddresses: WaasSolanaWalletProvider['getConnectedAddresses']","signAndSendTransaction: WaasSolanaWalletProvider['signAndSendTransaction']","getSolanaConnection","signAndSendSponsoredTransaction: WaasSolanaWalletProvider['signAndSendSponsoredTransaction']","signTransaction: WaasSolanaWalletProvider['signTransaction']","isVersionedTransaction","PublicKey","signAllTransactions: WaasSolanaWalletProvider['signAllTransactions']","signMessage: WaasSolanaWalletProvider['signMessage']","solanaExecuteCheckoutTransaction","solanaTransferAmount","WalletProviderPriority"],"sources":["../src/errors/SponsorTransactionError/SponsorTransactionError.ts","../src/waas/utils/sponsorTransaction/sponsorTransaction.ts","../src/waas/utils/createWalletProviderForWaasSolana/createWalletProviderForWaasSolana.ts","../src/waas/addWaasSolanaExtension/addWaasSolanaExtension.ts"],"sourcesContent":["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 { solanaExecuteCheckoutTransaction } from '../../../utils/solanaExecuteCheckoutTransaction';\nimport { solanaTransferAmount } from '../../../utils/solanaTransferAmount';\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({ transaction }, sdkClient);\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 { networkData } = await getActiveNetworkData(\n { walletAccount },\n sdkClient\n );\n\n const { signature } = await waasProvider.signSerializedTransaction({\n chainId: networkData?.networkId,\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 executeCheckoutTransaction: (args) =>\n solanaExecuteCheckoutTransaction(args, sdkClient),\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 transferAmount: (args) => solanaTransferAmount(args, sdkClient),\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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"}
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const require_addSolanaWalletStandardExtension = require('./addSolanaWalletStandardExtension-
|
|
2
|
-
const require_solanaTransferAmount = require('./solanaTransferAmount-
|
|
3
|
-
const require_addWaasSolanaExtension = require('./addWaasSolanaExtension-
|
|
1
|
+
const require_addSolanaWalletStandardExtension = require('./addSolanaWalletStandardExtension-0JyyakfO.cjs.js');
|
|
2
|
+
const require_solanaTransferAmount = require('./solanaTransferAmount-DQusACZn.cjs.js');
|
|
3
|
+
const require_addWaasSolanaExtension = require('./addWaasSolanaExtension-s5RmA285.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
6
|
let _solana_web3_js = require("@solana/web3.js");
|
|
@@ -462,12 +462,7 @@ const isCloneTab = (client) => !getPhantomOriginTab(client).isOriginTab;
|
|
|
462
462
|
const completeAndEmitPhantomRedirectEvent = async ({ args, event }, client) => {
|
|
463
463
|
const core = (0, _dynamic_labs_sdk_client_core.getCore)(client);
|
|
464
464
|
const cloneTab = isCloneTab(client);
|
|
465
|
-
core.logger.debug("[PHANTOM] completeAndEmitPhantomRedirectEvent: start", {
|
|
466
|
-
event,
|
|
467
|
-
isCloneTab: cloneTab
|
|
468
|
-
});
|
|
469
465
|
await core.storage.removeItem(pendingRequestStorageKeySchema);
|
|
470
|
-
core.logger.debug("[PHANTOM] completeAndEmitPhantomRedirectEvent: emitting event locally", { event });
|
|
471
466
|
(0, _dynamic_labs_sdk_client_core.emitEvent)({
|
|
472
467
|
args,
|
|
473
468
|
event
|
|
@@ -513,13 +508,8 @@ const completeAndEmitPhantomRedirectEvent = async ({ args, event }, client) => {
|
|
|
513
508
|
*/
|
|
514
509
|
const completePhantomRedirect = async ({ url }, client = (0, _dynamic_labs_sdk_client_core.getDefaultClient)()) => {
|
|
515
510
|
const core = (0, _dynamic_labs_sdk_client_core.getCore)(client);
|
|
516
|
-
core.logger.debug("[PHANTOM] completePhantomRedirect: start", { search: url.search });
|
|
517
511
|
const params = parsePhantomRedirectParams({ url });
|
|
518
512
|
const pendingRequest = await core.storage.getItem(pendingRequestStorageKeySchema);
|
|
519
|
-
core.logger.debug("[PHANTOM] completePhantomRedirect: pendingRequest", {
|
|
520
|
-
found: !!pendingRequest,
|
|
521
|
-
method: pendingRequest?.method
|
|
522
|
-
});
|
|
523
513
|
if (!pendingRequest) throw new NoPendingPhantomRequestError();
|
|
524
514
|
if (params.errorCode) {
|
|
525
515
|
const error = new PhantomRedirectRejectedError({
|
|
@@ -726,14 +716,6 @@ const listenForPhantomBroadcast = (listeners, client) => {
|
|
|
726
716
|
//#endregion
|
|
727
717
|
//#region src/phantomRedirect/createPhantomRedirectWalletProvider/createPhantomRedirectWalletProvider.ts
|
|
728
718
|
/**
|
|
729
|
-
* Generates a random alphanumeric string of specified length.
|
|
730
|
-
*/
|
|
731
|
-
const randomString = (length) => {
|
|
732
|
-
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
733
|
-
const bytes = crypto.getRandomValues(new Uint8Array(length));
|
|
734
|
-
return Array.from(bytes, (byte) => chars[byte % 62]).join("");
|
|
735
|
-
};
|
|
736
|
-
/**
|
|
737
719
|
* Extracts the dApp URL from a redirect URL.
|
|
738
720
|
*/
|
|
739
721
|
const extractDappUrl = (redirectUrl) => {
|
|
@@ -780,10 +762,6 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
|
|
|
780
762
|
*/
|
|
781
763
|
const setupPhantomListeners = ({ completeEvent, deferredPromise, errorEvent, onComplete, onError }) => {
|
|
782
764
|
getPhantomOriginTab(dynamicClient).isOriginTab = true;
|
|
783
|
-
core.logger.debug("[PHANTOM] setupPhantomListeners: isOriginTab=true, registering listeners", {
|
|
784
|
-
completeEvent,
|
|
785
|
-
errorEvent
|
|
786
|
-
});
|
|
787
765
|
(0, _dynamic_labs_sdk_client.onceEvent)({
|
|
788
766
|
event: completeEvent,
|
|
789
767
|
listener: onComplete
|
|
@@ -802,17 +780,15 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
|
|
|
802
780
|
}).catch(() => {});
|
|
803
781
|
};
|
|
804
782
|
const connect = async () => {
|
|
805
|
-
core.logger.debug("[PHANTOM] connect: start");
|
|
806
783
|
const redirectUrl = baseRedirectUrl;
|
|
807
784
|
const { publicKey: dappPublicKey, secretKey: dappSecretKey } = generateNaClKeyPair();
|
|
808
785
|
await setPendingRequest({
|
|
809
786
|
dappPublicKey,
|
|
810
787
|
dappSecretKey,
|
|
811
788
|
method: "connect",
|
|
812
|
-
requestId: randomString(32),
|
|
789
|
+
requestId: (0, _dynamic_labs_sdk_client_core.randomString)({ length: 32 }),
|
|
813
790
|
timestamp: Date.now()
|
|
814
791
|
});
|
|
815
|
-
core.logger.debug("[PHANTOM] connect: pending request stored, setting up listeners");
|
|
816
792
|
const deferredPromise = (0, _dynamic_labs_sdk_client_core.createDeferredPromise)();
|
|
817
793
|
setupPhantomListeners({
|
|
818
794
|
completeEvent: "phantomRedirectConnectionComplete",
|
|
@@ -838,12 +814,8 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
|
|
|
838
814
|
method: "connect",
|
|
839
815
|
redirectUrl
|
|
840
816
|
});
|
|
841
|
-
core.logger.debug("[PHANTOM] connect: opening deeplink", {
|
|
842
|
-
deepLinkUrl: deepLinkUrl.toString(),
|
|
843
|
-
redirectUrl
|
|
844
|
-
});
|
|
817
|
+
core.logger.debug("[PHANTOM] connect: opening deeplink", { redirectUrl });
|
|
845
818
|
await core.openDeeplink(deepLinkUrl.toString());
|
|
846
|
-
core.logger.debug("[PHANTOM] connect: deeplink opened, awaiting deferred promise");
|
|
847
819
|
return deferredPromise.promise;
|
|
848
820
|
};
|
|
849
821
|
const disconnect = async () => {
|
|
@@ -853,7 +825,7 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
|
|
|
853
825
|
payload: { session: session.sessionToken },
|
|
854
826
|
sharedSecret: session.sharedSecret
|
|
855
827
|
});
|
|
856
|
-
const requestId = randomString(32);
|
|
828
|
+
const requestId = (0, _dynamic_labs_sdk_client_core.randomString)({ length: 32 });
|
|
857
829
|
await setPendingRequest({
|
|
858
830
|
dappPublicKey: session.dappPublicKey,
|
|
859
831
|
dappSecretKey: session.dappSecretKey,
|
|
@@ -903,7 +875,7 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
|
|
|
903
875
|
},
|
|
904
876
|
sharedSecret: session.sharedSecret
|
|
905
877
|
});
|
|
906
|
-
const requestId = randomString(32);
|
|
878
|
+
const requestId = (0, _dynamic_labs_sdk_client_core.randomString)({ length: 32 });
|
|
907
879
|
await setPendingRequest({
|
|
908
880
|
dappPublicKey: session.dappPublicKey,
|
|
909
881
|
dappSecretKey: session.dappSecretKey,
|
|
@@ -957,7 +929,7 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
|
|
|
957
929
|
},
|
|
958
930
|
sharedSecret: session.sharedSecret
|
|
959
931
|
});
|
|
960
|
-
const requestId = randomString(32);
|
|
932
|
+
const requestId = (0, _dynamic_labs_sdk_client_core.randomString)({ length: 32 });
|
|
961
933
|
await setPendingRequest({
|
|
962
934
|
dappPublicKey: session.dappPublicKey,
|
|
963
935
|
dappSecretKey: session.dappSecretKey,
|
|
@@ -1012,7 +984,7 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
|
|
|
1012
984
|
},
|
|
1013
985
|
sharedSecret: session.sharedSecret
|
|
1014
986
|
});
|
|
1015
|
-
const requestId = randomString(32);
|
|
987
|
+
const requestId = (0, _dynamic_labs_sdk_client_core.randomString)({ length: 32 });
|
|
1016
988
|
await setPendingRequest({
|
|
1017
989
|
dappPublicKey: session.dappPublicKey,
|
|
1018
990
|
dappSecretKey: session.dappSecretKey,
|
|
@@ -1093,16 +1065,28 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
|
|
|
1093
1065
|
* redirect data from a Phantom wallet deep link operation, and validates
|
|
1094
1066
|
* that there is a corresponding pending request in storage.
|
|
1095
1067
|
*
|
|
1068
|
+
* Most Phantom callbacks include recognizable query parameters:
|
|
1069
|
+
* - **Connect**: `phantom_encryption_public_key`
|
|
1070
|
+
* - **Sign** (signMessage, signTransaction, etc.): `nonce` + `data`
|
|
1071
|
+
* - **Error** (any method): `errorCode`
|
|
1072
|
+
*
|
|
1073
|
+
* **Disconnect is the exception**: on success, Phantom redirects back to the
|
|
1074
|
+
* bare `redirect_link` with NO query parameters at all. To detect this case,
|
|
1075
|
+
* we fall back to checking whether a pending disconnect request exists in
|
|
1076
|
+
* storage.
|
|
1077
|
+
*
|
|
1096
1078
|
* @param params.url - The URL to check for Phantom redirect parameters
|
|
1097
1079
|
* @param client - The Dynamic client instance
|
|
1098
1080
|
* @returns A promise that resolves to true if the URL is a valid Phantom redirect, false otherwise
|
|
1099
1081
|
*/
|
|
1100
1082
|
const detectPhantomRedirect = async ({ url }, client = (0, _dynamic_labs_sdk_client_core.getDefaultClient)()) => {
|
|
1101
1083
|
const core = (0, _dynamic_labs_sdk_client_core.getCore)(client);
|
|
1102
|
-
|
|
1084
|
+
const hasPhantomParams = url.searchParams.has("phantom_encryption_public_key") || url.searchParams.has("errorCode") || url.searchParams.has("nonce") && url.searchParams.has("data");
|
|
1103
1085
|
await core.initTrack.waitForAll();
|
|
1104
1086
|
const pendingRequest = await core.storage.getItem(pendingRequestStorageKeySchema);
|
|
1105
|
-
|
|
1087
|
+
if (!pendingRequest) return false;
|
|
1088
|
+
if (hasPhantomParams) return true;
|
|
1089
|
+
return pendingRequest.method === "disconnect";
|
|
1106
1090
|
};
|
|
1107
1091
|
|
|
1108
1092
|
//#endregion
|
|
@@ -1178,10 +1162,27 @@ const addPhantomRedirectSolanaExtension = async ({ disableAutoRedirectCompletion
|
|
|
1178
1162
|
baseRedirectUrl: `${url.protocol}//${url.host}${url.pathname}`,
|
|
1179
1163
|
dynamicClient: client
|
|
1180
1164
|
});
|
|
1181
|
-
(0, _dynamic_labs_sdk_client_core.getWalletProviderRegistry)(client)
|
|
1165
|
+
const walletProviderRegistry = (0, _dynamic_labs_sdk_client_core.getWalletProviderRegistry)(client);
|
|
1166
|
+
const isConflictingProvider = (provider) => provider.chain === walletProvider.chain && provider.groupKey === walletProvider.groupKey && provider.key !== walletProvider.key;
|
|
1167
|
+
const existingConflict = walletProviderRegistry.listProviders().find(isConflictingProvider);
|
|
1168
|
+
if (existingConflict) {
|
|
1169
|
+
core.logger.debug("[PHANTOM] addPhantomRedirectSolanaExtension: skipping registration, conflicting provider exists", { conflictingKey: existingConflict.key });
|
|
1170
|
+
return;
|
|
1171
|
+
}
|
|
1172
|
+
walletProviderRegistry.register({
|
|
1182
1173
|
priority: _dynamic_labs_sdk_client_core.WalletProviderPriority.WINDOW_INJECT,
|
|
1183
1174
|
walletProvider
|
|
1184
1175
|
});
|
|
1176
|
+
const removeListener = (0, _dynamic_labs_sdk_client.onEvent)({
|
|
1177
|
+
event: "walletProviderRegistered",
|
|
1178
|
+
listener: ({ walletProvider: newProvider }) => {
|
|
1179
|
+
if (isConflictingProvider(newProvider)) {
|
|
1180
|
+
core.logger.debug("[PHANTOM] addPhantomRedirectSolanaExtension: unregistering, conflicting provider registered", { conflictingKey: newProvider.key });
|
|
1181
|
+
walletProviderRegistry.unregister(walletProvider.key);
|
|
1182
|
+
removeListener();
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
}, client);
|
|
1185
1186
|
};
|
|
1186
1187
|
|
|
1187
1188
|
//#endregion
|