@dynamic-labs-sdk/solana 1.2.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/{addSolanaWalletStandardExtension-BWUCDCh0.cjs → addSolanaWalletStandardExtension-CjCWC3H8.cjs} +2 -2
  2. package/dist/{addSolanaWalletStandardExtension-BWUCDCh0.cjs.map → addSolanaWalletStandardExtension-CjCWC3H8.cjs.map} +1 -1
  3. package/dist/{addSolanaWalletStandardExtension-DPOS3w1L.esm.js → addSolanaWalletStandardExtension-DF1E9p6Q.esm.js} +2 -2
  4. package/dist/{addSolanaWalletStandardExtension-DPOS3w1L.esm.js.map → addSolanaWalletStandardExtension-DF1E9p6Q.esm.js.map} +1 -1
  5. package/dist/{addWaasSolanaExtension-hHWvqSo7.cjs → addWaasSolanaExtension-CT_5glLu.cjs} +2 -2
  6. package/dist/{addWaasSolanaExtension-hHWvqSo7.cjs.map → addWaasSolanaExtension-CT_5glLu.cjs.map} +1 -1
  7. package/dist/{addWaasSolanaExtension-CVg_iq7t.esm.js → addWaasSolanaExtension-pcTae1sJ.esm.js} +2 -2
  8. package/dist/{addWaasSolanaExtension-CVg_iq7t.esm.js.map → addWaasSolanaExtension-pcTae1sJ.esm.js.map} +1 -1
  9. package/dist/index.cjs +4 -24
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.esm.js +3 -23
  12. package/dist/index.esm.js.map +1 -1
  13. package/dist/signAndSendTransaction/signAndSendTransaction.d.ts +26 -3
  14. package/dist/signAndSendTransaction/signAndSendTransaction.d.ts.map +1 -1
  15. package/dist/{solanaTransferAmount-Cnjjf6oH.cjs → solanaTransferAmount-EDWQa9x1.cjs} +82 -51
  16. package/dist/solanaTransferAmount-EDWQa9x1.cjs.map +1 -0
  17. package/dist/{solanaTransferAmount-6QqXIUbz.esm.js → solanaTransferAmount-o7WCDn3_.esm.js} +77 -52
  18. package/dist/solanaTransferAmount-o7WCDn3_.esm.js.map +1 -0
  19. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  20. package/dist/utils/solanaExecuteSwapTransaction/solanaExecuteSwapTransaction.d.ts +3 -2
  21. package/dist/utils/solanaExecuteSwapTransaction/solanaExecuteSwapTransaction.d.ts.map +1 -1
  22. package/dist/utils/solanaTransferAmount/solanaTransferAmount.d.ts.map +1 -1
  23. package/dist/waas.cjs +2 -2
  24. package/dist/waas.esm.js +2 -2
  25. package/dist/walletConnect.cjs +1 -1
  26. package/dist/walletConnect.esm.js +1 -1
  27. package/dist/walletStandard.cjs +2 -2
  28. package/dist/walletStandard.esm.js +2 -2
  29. package/package.json +5 -5
  30. package/dist/solanaTransferAmount-6QqXIUbz.esm.js.map +0 -1
  31. package/dist/solanaTransferAmount-Cnjjf6oH.cjs.map +0 -1
@@ -6,7 +6,7 @@ let _solana_spl_token = require("@solana/spl-token");
6
6
 
7
7
  //#region package.json
8
8
  var name = "@dynamic-labs-sdk/solana";
9
- var version = "1.2.1";
9
+ var version = "1.4.0";
10
10
 
11
11
  //#endregion
12
12
  //#region src/utils/fetchSolBalance/fetchSolBalance.ts
@@ -117,16 +117,79 @@ const isSolanaWalletProvider = (provider) => {
117
117
  return provider.chain === "SOL";
118
118
  };
119
119
 
120
+ //#endregion
121
+ //#region src/errors/NotSolanaProviderError/NotSolanaProviderError.ts
122
+ var NotSolanaProviderError = class extends _dynamic_labs_sdk_client.BaseError {
123
+ providerKey;
124
+ constructor(params) {
125
+ super({
126
+ cause: null,
127
+ code: "not_solana_provider_error",
128
+ docsUrl: null,
129
+ name: "NotSolanaProviderError",
130
+ shortMessage: "Provider is not a Solana wallet provider"
131
+ });
132
+ this.providerKey = params.providerKey;
133
+ }
134
+ };
135
+
136
+ //#endregion
137
+ //#region src/isSolanaGasSponsorshipEnabled/isSolanaGasSponsorshipEnabled.ts
138
+ /**
139
+ * Checks if Solana gas sponsorship is enabled for the current project.
140
+ *
141
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
142
+ * @returns True if Solana gas sponsorship is enabled, false otherwise.
143
+ * @not-instrumented
144
+ */
145
+ const isSolanaGasSponsorshipEnabled = (client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => {
146
+ (0, _dynamic_labs_sdk_client_core.assertDefined)(client.projectSettings, "Project settings are not defined");
147
+ return client.projectSettings.sdk.embeddedWallets?.svmGasSponsorshipEnabled ?? false;
148
+ };
149
+
150
+ //#endregion
151
+ //#region src/signAndSendTransaction/signAndSendTransaction.ts
152
+ /**
153
+ * Signs and sends a Solana transaction, honoring the project's Solana gas
154
+ * sponsorship setting.
155
+ *
156
+ * When solana gas sponsorship is enabled in project settings and sponsorship
157
+ * is supported by the wallet provider, the transaction is routed through
158
+ * Dynamic's gas sponsorship API.
159
+ * Otherwise it falls back to the provider's standard `signAndSendTransaction`.
160
+ *
161
+ * @param params.transaction - The transaction to sign and send
162
+ * @param params.walletAccount - The wallet account to sign and send the transaction with
163
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
164
+ * @returns An object containing the signature
165
+ * @not-instrumented
166
+ */
167
+ const signAndSendTransaction = async ({ walletAccount, transaction, sponsorshipMode = "auto", options }, client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => {
168
+ const provider = (0, _dynamic_labs_sdk_client_core.getWalletProviderFromWalletAccount)({ walletAccount }, client);
169
+ if (!isSolanaWalletProvider(provider)) throw new NotSolanaProviderError({ providerKey: provider.key });
170
+ if (sponsorshipMode === "auto" && isSolanaGasSponsorshipEnabled(client) && provider.signAndSendSponsoredTransaction) return provider.signAndSendSponsoredTransaction({
171
+ options,
172
+ transaction,
173
+ walletAccount
174
+ });
175
+ return provider.signAndSendTransaction({
176
+ options,
177
+ transaction,
178
+ walletAccount
179
+ });
180
+ };
181
+
120
182
  //#endregion
121
183
  //#region src/utils/solanaExecuteSwapTransaction/solanaExecuteSwapTransaction.ts
122
184
  /**
123
185
  * Executes a Solana checkout transaction by deserializing the base64-encoded
124
- * transaction and sending it via the wallet provider's signAndSendTransaction.
186
+ * transaction and routing it through `signAndSendTransaction`, which applies
187
+ * the project's gas sponsorship setting when enabled.
125
188
  *
126
189
  * 1. Validates that the wallet account is a Solana wallet account
127
190
  * 2. Extracts and validates the serialized transaction from the signing payload
128
191
  * 3. Deserializes the transaction (tries VersionedTransaction first, falls back to Transaction)
129
- * 4. Signs and sends via the Solana wallet provider
192
+ * 4. Signs and sends via `signAndSendTransaction` (sponsored when project settings opt in)
130
193
  *
131
194
  * @param params.signingPayload - The signing payload containing `serializedTransaction`.
132
195
  * @param params.walletAccount - The wallet account used to sign and send the transaction.
@@ -148,43 +211,13 @@ const solanaExecuteSwapTransaction = async ({ onStepChange, signingPayload, wall
148
211
  transaction = _solana_web3_js.Transaction.from(bytes);
149
212
  }
150
213
  onStepChange?.("transaction");
151
- const { signature } = await walletProvider.signAndSendTransaction({
214
+ const { signature } = await signAndSendTransaction({
152
215
  transaction,
153
216
  walletAccount
154
- });
217
+ }, client);
155
218
  return { transactionHash: signature };
156
219
  };
157
220
 
158
- //#endregion
159
- //#region src/errors/NotSolanaProviderError/NotSolanaProviderError.ts
160
- var NotSolanaProviderError = class extends _dynamic_labs_sdk_client.BaseError {
161
- providerKey;
162
- constructor(params) {
163
- super({
164
- cause: null,
165
- code: "not_solana_provider_error",
166
- docsUrl: null,
167
- name: "NotSolanaProviderError",
168
- shortMessage: "Provider is not a Solana wallet provider"
169
- });
170
- this.providerKey = params.providerKey;
171
- }
172
- };
173
-
174
- //#endregion
175
- //#region src/isSolanaGasSponsorshipEnabled/isSolanaGasSponsorshipEnabled.ts
176
- /**
177
- * Checks if Solana gas sponsorship is enabled for the current project.
178
- *
179
- * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
180
- * @returns True if Solana gas sponsorship is enabled, false otherwise.
181
- * @not-instrumented
182
- */
183
- const isSolanaGasSponsorshipEnabled = (client = (0, _dynamic_labs_sdk_client.getDefaultClient)()) => {
184
- (0, _dynamic_labs_sdk_client_core.assertDefined)(client.projectSettings, "Project settings are not defined");
185
- return client.projectSettings.sdk.embeddedWallets?.svmGasSponsorshipEnabled ?? false;
186
- };
187
-
188
221
  //#endregion
189
222
  //#region src/utils/solanaTransferAmount/solanaTransferAmount.ts
190
223
  const DEFAULT_DECIMALS = 9;
@@ -230,22 +263,14 @@ const solanaTransferAmount = async ({ amount, recipient, token, walletAccount },
230
263
  toPubkey
231
264
  })];
232
265
  const { blockhash } = await connection.getLatestBlockhash("finalized");
233
- const transaction = new _solana_web3_js.VersionedTransaction(new _solana_web3_js.TransactionMessage({
234
- instructions,
235
- payerKey: fromPubkey,
236
- recentBlockhash: blockhash
237
- }).compileToV0Message());
238
- if (isSolanaGasSponsorshipEnabled(client) && provider.signAndSendSponsoredTransaction) {
239
- const { signature: signature$1 } = await provider.signAndSendSponsoredTransaction({
240
- transaction,
241
- walletAccount
242
- });
243
- return { transactionHash: signature$1 };
244
- }
245
- const { signature } = await provider.signAndSendTransaction({
246
- transaction,
266
+ const { signature } = await signAndSendTransaction({
267
+ transaction: new _solana_web3_js.VersionedTransaction(new _solana_web3_js.TransactionMessage({
268
+ instructions,
269
+ payerKey: fromPubkey,
270
+ recentBlockhash: blockhash
271
+ }).compileToV0Message()),
247
272
  walletAccount
248
- });
273
+ }, client);
249
274
  return { transactionHash: signature };
250
275
  };
251
276
 
@@ -298,6 +323,12 @@ Object.defineProperty(exports, 'registerSolanaNetworkProviderBuilder', {
298
323
  return registerSolanaNetworkProviderBuilder;
299
324
  }
300
325
  });
326
+ Object.defineProperty(exports, 'signAndSendTransaction', {
327
+ enumerable: true,
328
+ get: function () {
329
+ return signAndSendTransaction;
330
+ }
331
+ });
301
332
  Object.defineProperty(exports, 'solanaConfirmTransaction', {
302
333
  enumerable: true,
303
334
  get: function () {
@@ -322,4 +353,4 @@ Object.defineProperty(exports, 'version', {
322
353
  return version;
323
354
  }
324
355
  });
325
- //# sourceMappingURL=solanaTransferAmount-Cnjjf6oH.cjs.map
356
+ //# sourceMappingURL=solanaTransferAmount-EDWQa9x1.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solanaTransferAmount-EDWQa9x1.cjs","names":["Connection","PublicKey","Connection","InvalidParamError","BaseError","InvalidParamError","transaction: Transaction | VersionedTransaction","VersionedTransaction","Transaction","InvalidParamError","PublicKey","instructions: TransactionInstruction[]","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","SystemProgram","VersionedTransaction","TransactionMessage"],"sources":["../package.json","../src/utils/fetchSolBalance/fetchSolBalance.ts","../src/utils/createSolanaNetworkProvider/createSolanaNetworkProvider.ts","../src/registerSolanaNetworkProviderBuilder/registerSolanaNetworkProviderBuilder.ts","../src/getSolanaConnection/getSolanaConnection.ts","../src/utils/isVersionedTransaction/isVersionedTransaction.ts","../src/isSolanaWalletAccount/isSolanaWalletAccount.ts","../src/utils/solanaConfirmTransaction/solanaConfirmTransaction.ts","../src/isSolanaWalletProvider/isSolanaWalletProvider.ts","../src/errors/NotSolanaProviderError/NotSolanaProviderError.ts","../src/isSolanaGasSponsorshipEnabled/isSolanaGasSponsorshipEnabled.ts","../src/signAndSendTransaction/signAndSendTransaction.ts","../src/utils/solanaExecuteSwapTransaction/solanaExecuteSwapTransaction.ts","../src/utils/solanaTransferAmount/solanaTransferAmount.ts"],"sourcesContent":["","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport { Connection, PublicKey } from '@solana/web3.js';\n\n/** @not-instrumented */\nexport const fetchSolBalance = async ({\n address,\n networkData,\n}: {\n address: string;\n networkData: NetworkData;\n}): Promise<string | null> => {\n // Establish a connection to the Solana network using the provided RPC URL.\n const connection = new Connection(networkData.rpcUrls.http[0]);\n\n // Convert the string address into a PublicKey object.\n const publicKey = new PublicKey(address);\n\n // Fetch the balance of the public key. The balance is in lamports.\n const balanceInLamports = await connection.getBalance(publicKey);\n\n // The getBalance method returns the balance in lamports.\n // 1 SOL = 1,000,000,000 lamports.\n const balanceInSol = balanceInLamports / 1_000_000_000;\n\n // Return the balance in SOL as a string\n return balanceInSol.toString();\n};\n","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport { createBaseNetworkProvider } from '@dynamic-labs-sdk/client/core';\n\nimport type { SolanaNetworkProvider } from '../../SolanaNetworkProvider.types';\nimport { fetchSolBalance } from '../fetchSolBalance';\n\n/** @not-instrumented */\nexport const createSolanaNetworkProvider = (\n networkData: NetworkData\n): SolanaNetworkProvider => ({\n ...createBaseNetworkProvider('SOL', networkData),\n cluster: networkData.cluster,\n genesisHash: networkData.genesisHash,\n getBalance: async ({ address }) => ({\n balance: await fetchSolBalance({\n address,\n networkData,\n }),\n }),\n});\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getNetworkProviderBuilderRegistry } from '@dynamic-labs-sdk/client/core';\n\nimport { createSolanaNetworkProvider } from '../utils/createSolanaNetworkProvider';\n\n/** @not-instrumented */\nexport const registerSolanaNetworkProviderBuilder = (\n client: DynamicClient\n): void => {\n const networkProviderBuilderRegistry =\n getNetworkProviderBuilderRegistry(client);\n\n /**\n * If the Solana network provider builder is already registered, return.\n */\n if (networkProviderBuilderRegistry.get().get('SOL')) {\n return;\n }\n\n networkProviderBuilderRegistry.register({\n builder: createSolanaNetworkProvider,\n chain: 'SOL',\n });\n};\n","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport type { Commitment, ConnectionConfig } from '@solana/web3.js';\nimport { Connection } from '@solana/web3.js';\n\ntype GetSolanaConnectionOptions = {\n commitmentOrConfig?: Commitment | ConnectionConfig;\n networkData: NetworkData;\n};\n\n/**\n * Returns a new Solana connection for the given network provider.\n *\n * @example\n * ```ts\n * import { getActiveNetworkData } from '@dynamic-labs-sdk/client';\n * import { isSolanaNetworkProvider, getSolanaConnection } from '@dynamic-labs-sdk/solana';\n *\n * const { networkData } = getActiveNetworkData({ walletAccount });\n *\n * if(!networkData) {\n * throw new Error('No network data found');\n * }\n *\n * const connection = getSolanaConnection({\n * networkData,\n * });\n * ```\n * @not-instrumented\n */\nexport const getSolanaConnection = ({\n networkData,\n commitmentOrConfig,\n}: GetSolanaConnectionOptions) => {\n return new Connection(networkData.rpcUrls.http[0], commitmentOrConfig);\n};\n","import type { Transaction, VersionedTransaction } from '@solana/web3.js';\n\n/** @not-instrumented */\nexport const isVersionedTransaction = (\n transaction: VersionedTransaction | Transaction\n): transaction is VersionedTransaction => !('instructions' in transaction);\n","import type { WalletAccount } from '@dynamic-labs-sdk/client';\n\nimport type { SolanaWalletAccount } from '../SolanaWalletAccount.types';\n\n/**\n * Type guard function to check if a wallet account is a Solana wallet account.\n *\n * @param walletAccount - The wallet account to check.\n * @returns True if the wallet account is a Solana wallet account, false otherwise.\n * @not-instrumented\n */\nexport const isSolanaWalletAccount = (\n walletAccount: WalletAccount\n): walletAccount is SolanaWalletAccount => walletAccount.chain === 'SOL';\n","import {\n type DynamicClient,\n InvalidParamError,\n getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport type { ConfirmTransactionParams } from '@dynamic-labs-sdk/client/core';\nimport { assertDefined } from '@dynamic-labs-sdk/client/core';\n\nimport { getSolanaConnection } from '../../getSolanaConnection';\nimport { isSolanaWalletAccount } from '../../isSolanaWalletAccount';\n\n/**\n * Waits for a Solana transaction to be confirmed on-chain.\n *\n * @param params.transactionHash - The transaction signature to wait for.\n * @param params.walletAccount - The Solana wallet account used to resolve the active network.\n * @param client - The Dynamic client instance.\n * @not-instrumented\n */\nexport const solanaConfirmTransaction = async (\n { transactionHash, walletAccount }: ConfirmTransactionParams,\n client: DynamicClient\n): Promise<void> => {\n if (!isSolanaWalletAccount(walletAccount)) {\n throw new InvalidParamError(\n 'Wallet account is not a Solana wallet account'\n );\n }\n\n const { networkData } = await getActiveNetworkData({ walletAccount }, client);\n\n assertDefined(\n networkData,\n `No network data found for wallet account ${walletAccount.address}`\n );\n\n const connection = getSolanaConnection({ networkData });\n\n const { blockhash, lastValidBlockHeight } =\n await connection.getLatestBlockhash();\n\n await connection.confirmTransaction({\n blockhash,\n lastValidBlockHeight,\n signature: transactionHash,\n });\n};\n","import type { WalletProvider } from '@dynamic-labs-sdk/client/core';\n\nimport type { SolanaWalletProvider } from '../SolanaWalletProvider.types';\n\n/** @not-instrumented */\nexport const isSolanaWalletProvider = (\n provider: WalletProvider\n): provider is SolanaWalletProvider => {\n return provider.chain === 'SOL';\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class NotSolanaProviderError extends BaseError {\n public readonly providerKey: string;\n\n constructor(params: { providerKey: string }) {\n super({\n cause: null,\n code: 'not_solana_provider_error',\n docsUrl: null,\n name: 'NotSolanaProviderError',\n shortMessage: 'Provider is not a Solana wallet provider',\n });\n\n this.providerKey = params.providerKey;\n }\n}\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { assertDefined } from '@dynamic-labs-sdk/client/core';\n\n/**\n * Checks if Solana gas sponsorship is enabled for the current project.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns True if Solana gas sponsorship is enabled, false otherwise.\n * @not-instrumented\n */\nexport const isSolanaGasSponsorshipEnabled = (\n client = getDefaultClient()\n): boolean => {\n assertDefined(client.projectSettings, 'Project settings are not defined');\n\n return (\n client.projectSettings.sdk.embeddedWallets?.svmGasSponsorshipEnabled ??\n false\n );\n};\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { getWalletProviderFromWalletAccount } from '@dynamic-labs-sdk/client/core';\nimport type {\n SendOptions,\n Transaction,\n VersionedTransaction,\n} from '@solana/web3.js';\n\nimport type { SolanaWalletAccount } from '../SolanaWalletAccount.types';\nimport { NotSolanaProviderError } from '../errors/NotSolanaProviderError';\nimport { isSolanaGasSponsorshipEnabled } from '../isSolanaGasSponsorshipEnabled';\nimport { isSolanaWalletProvider } from '../isSolanaWalletProvider';\n\ntype SignAndSendTransactionParams = {\n options?: SendOptions;\n /**\n * Controls whether Dynamic's gas sponsorship API is used to pay for this\n * transaction.\n *\n * - `'auto'` (default): the transaction is sponsored when Solana gas\n * sponsorship is enabled in project settings AND the walletAccount is a\n * Dynamic embedded wallet. Otherwise the user pays gas.\n * - `'off'`: the transaction is never sponsored, regardless of project\n * settings or provider capabilities. The user pays gas.\n *\n * To require sponsorship (and throw if unsupported), use\n * `signAndSendSponsoredTransaction` instead.\n *\n * @default 'auto'\n */\n sponsorshipMode?: 'auto' | 'off';\n transaction: Transaction | VersionedTransaction;\n walletAccount: SolanaWalletAccount;\n};\n\n/**\n * Signs and sends a Solana transaction, honoring the project's Solana gas\n * sponsorship setting.\n *\n * When solana gas sponsorship is enabled in project settings and sponsorship\n * is supported by the wallet provider, the transaction is routed through\n * Dynamic's gas sponsorship API.\n * Otherwise it falls back to the provider's standard `signAndSendTransaction`.\n *\n * @param params.transaction - The transaction to sign and send\n * @param params.walletAccount - The wallet account to sign and send the transaction with\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns An object containing the signature\n * @not-instrumented\n */\nexport const signAndSendTransaction = async (\n {\n walletAccount,\n transaction,\n sponsorshipMode = 'auto',\n options,\n }: SignAndSendTransactionParams,\n client = getDefaultClient()\n): Promise<{ signature: string }> => {\n const provider = getWalletProviderFromWalletAccount(\n {\n walletAccount,\n },\n client\n );\n\n if (!isSolanaWalletProvider(provider)) {\n throw new NotSolanaProviderError({ providerKey: provider.key });\n }\n\n if (\n sponsorshipMode === 'auto' &&\n isSolanaGasSponsorshipEnabled(client) &&\n provider.signAndSendSponsoredTransaction\n ) {\n return provider.signAndSendSponsoredTransaction({\n options,\n transaction,\n walletAccount,\n });\n }\n\n return provider.signAndSendTransaction({\n options,\n transaction,\n walletAccount,\n });\n};\n","import {\n type DynamicClient,\n InvalidParamError,\n} from '@dynamic-labs-sdk/client';\nimport type {\n ExecuteSwapTransactionParams,\n ExecuteSwapTransactionResult,\n} from '@dynamic-labs-sdk/client/core';\nimport {\n getBuffer,\n getWalletProviderFromWalletAccount,\n} from '@dynamic-labs-sdk/client/core';\nimport { Transaction, VersionedTransaction } from '@solana/web3.js';\n\nimport { isSolanaWalletAccount } from '../../isSolanaWalletAccount';\nimport { isSolanaWalletProvider } from '../../isSolanaWalletProvider';\nimport { signAndSendTransaction } from '../../signAndSendTransaction';\n\n/**\n * Executes a Solana checkout transaction by deserializing the base64-encoded\n * transaction and routing it through `signAndSendTransaction`, which applies\n * the project's gas sponsorship setting when enabled.\n *\n * 1. Validates that the wallet account is a Solana wallet account\n * 2. Extracts and validates the serialized transaction from the signing payload\n * 3. Deserializes the transaction (tries VersionedTransaction first, falls back to Transaction)\n * 4. Signs and sends via `signAndSendTransaction` (sponsored when project settings opt in)\n *\n * @param params.signingPayload - The signing payload containing `serializedTransaction`.\n * @param params.walletAccount - The wallet account used to sign and send the transaction.\n * @param params.onStepChange - Optional callback invoked with `'transaction'` when the send step begins.\n * @param client - The Dynamic client instance.\n * @returns The transaction hash (signature).\n * @not-instrumented\n */\nexport const solanaExecuteSwapTransaction = async (\n { onStepChange, signingPayload, walletAccount }: ExecuteSwapTransactionParams,\n client: DynamicClient\n): Promise<ExecuteSwapTransactionResult> => {\n const walletProvider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (\n !isSolanaWalletAccount(walletAccount) ||\n !isSolanaWalletProvider(walletProvider)\n ) {\n throw new InvalidParamError(\n 'Wallet account is not a Solana wallet account'\n );\n }\n\n const serializedTransactionData = signingPayload.serializedTransaction;\n\n if (!serializedTransactionData) {\n throw new InvalidParamError(\n 'Signing payload is missing serialized transaction data'\n );\n }\n\n const bytes = new Uint8Array(\n getBuffer().from(serializedTransactionData, 'base64')\n );\n\n let transaction: Transaction | VersionedTransaction;\n\n // Try VersionedTransaction first, fall back to legacy Transaction\n try {\n transaction = VersionedTransaction.deserialize(bytes);\n } catch {\n transaction = Transaction.from(bytes);\n }\n\n onStepChange?.('transaction');\n\n const { signature } = await signAndSendTransaction(\n { transaction, walletAccount },\n client\n );\n\n return { transactionHash: signature };\n};\n","import {\n type DynamicClient,\n InvalidParamError,\n getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport type { TransferAmountParams } from '@dynamic-labs-sdk/client/core';\nimport {\n assertDefined,\n getWalletProviderFromWalletAccount,\n parseAmountToSmallestUnit,\n} from '@dynamic-labs-sdk/client/core';\nimport {\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n createTransferCheckedInstruction,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\nimport type { TransactionInstruction } from '@solana/web3.js';\nimport {\n PublicKey,\n SystemProgram,\n TransactionMessage,\n VersionedTransaction,\n} from '@solana/web3.js';\n\nimport { NotSolanaProviderError } from '../../errors/NotSolanaProviderError';\nimport { getSolanaConnection } from '../../getSolanaConnection';\nimport { isSolanaWalletAccount } from '../../isSolanaWalletAccount';\nimport { isSolanaWalletProvider } from '../../isSolanaWalletProvider';\nimport { signAndSendTransaction } from '../../signAndSendTransaction';\nconst DEFAULT_DECIMALS = 9;\n\n/**\n * Transfers native SOL or SPL tokens from one wallet to another.\n *\n * For native SOL, builds a `SystemProgram.transfer` instruction.\n * For SPL tokens, derives associated token accounts, creates the recipient\n * ATA if needed, and builds a `transferChecked` instruction. Supports both\n * standard SPL tokens and Token-2022 tokens by detecting the mint's program.\n * @not-instrumented\n */\nexport const solanaTransferAmount = async (\n { amount, recipient, token, walletAccount }: TransferAmountParams,\n client: DynamicClient\n): Promise<{ transactionHash: string }> => {\n if (!isSolanaWalletAccount(walletAccount)) {\n throw new InvalidParamError(\n 'Wallet account is not a Solana wallet account'\n );\n }\n\n const provider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (!isSolanaWalletProvider(provider)) {\n throw new NotSolanaProviderError({ providerKey: provider.key });\n }\n\n const { networkData } = await getActiveNetworkData({ walletAccount }, client);\n assertDefined(networkData, 'Network data is required');\n\n const connection = getSolanaConnection({ networkData });\n\n const fromPubkey = new PublicKey(walletAccount.address);\n const toPubkey = new PublicKey(recipient);\n\n let instructions: TransactionInstruction[];\n\n if (token) {\n const decimals = token.decimals ?? DEFAULT_DECIMALS;\n const mintPubkey = new PublicKey(token.address);\n\n // Detect Token-2022 vs standard SPL by checking mint account owner\n const mintAccountInfo = await connection.getAccountInfo(mintPubkey);\n const tokenProgramId = mintAccountInfo?.owner.equals(TOKEN_2022_PROGRAM_ID)\n ? TOKEN_2022_PROGRAM_ID\n : TOKEN_PROGRAM_ID;\n\n const senderAta = await getAssociatedTokenAddress(\n mintPubkey,\n fromPubkey,\n false,\n tokenProgramId\n );\n\n const recipientAta = await getAssociatedTokenAddress(\n mintPubkey,\n toPubkey,\n false,\n tokenProgramId\n );\n\n const recipientAccountInfo = await connection.getAccountInfo(recipientAta);\n\n const rawAmount = parseAmountToSmallestUnit({ amount, decimals });\n\n instructions = [];\n\n if (!recipientAccountInfo) {\n instructions.push(\n createAssociatedTokenAccountInstruction(\n fromPubkey,\n recipientAta,\n toPubkey,\n mintPubkey,\n tokenProgramId\n )\n );\n }\n\n instructions.push(\n createTransferCheckedInstruction(\n senderAta,\n mintPubkey,\n recipientAta,\n fromPubkey,\n rawAmount,\n decimals,\n [],\n tokenProgramId\n )\n );\n } else {\n instructions = [\n SystemProgram.transfer({\n fromPubkey,\n lamports: parseAmountToSmallestUnit({ amount, decimals: DEFAULT_DECIMALS }),\n toPubkey,\n }),\n ];\n }\n\n const { blockhash } = await connection.getLatestBlockhash('finalized');\n\n const message = new TransactionMessage({\n instructions,\n payerKey: fromPubkey,\n recentBlockhash: blockhash,\n }).compileToV0Message();\n\n const transaction = new VersionedTransaction(message);\n\n const { signature } = await signAndSendTransaction(\n { transaction, walletAccount },\n client\n );\n\n return { transactionHash: signature };\n};\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID, createAssociatedTokenAccountIn
5
5
 
6
6
  //#region package.json
7
7
  var name = "@dynamic-labs-sdk/solana";
8
- var version = "1.2.1";
8
+ var version = "1.4.0";
9
9
 
10
10
  //#endregion
11
11
  //#region src/utils/fetchSolBalance/fetchSolBalance.ts
@@ -116,16 +116,79 @@ const isSolanaWalletProvider = (provider) => {
116
116
  return provider.chain === "SOL";
117
117
  };
118
118
 
119
+ //#endregion
120
+ //#region src/errors/NotSolanaProviderError/NotSolanaProviderError.ts
121
+ var NotSolanaProviderError = class extends BaseError {
122
+ providerKey;
123
+ constructor(params) {
124
+ super({
125
+ cause: null,
126
+ code: "not_solana_provider_error",
127
+ docsUrl: null,
128
+ name: "NotSolanaProviderError",
129
+ shortMessage: "Provider is not a Solana wallet provider"
130
+ });
131
+ this.providerKey = params.providerKey;
132
+ }
133
+ };
134
+
135
+ //#endregion
136
+ //#region src/isSolanaGasSponsorshipEnabled/isSolanaGasSponsorshipEnabled.ts
137
+ /**
138
+ * Checks if Solana gas sponsorship is enabled for the current project.
139
+ *
140
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
141
+ * @returns True if Solana gas sponsorship is enabled, false otherwise.
142
+ * @not-instrumented
143
+ */
144
+ const isSolanaGasSponsorshipEnabled = (client = getDefaultClient$1()) => {
145
+ assertDefined(client.projectSettings, "Project settings are not defined");
146
+ return client.projectSettings.sdk.embeddedWallets?.svmGasSponsorshipEnabled ?? false;
147
+ };
148
+
149
+ //#endregion
150
+ //#region src/signAndSendTransaction/signAndSendTransaction.ts
151
+ /**
152
+ * Signs and sends a Solana transaction, honoring the project's Solana gas
153
+ * sponsorship setting.
154
+ *
155
+ * When solana gas sponsorship is enabled in project settings and sponsorship
156
+ * is supported by the wallet provider, the transaction is routed through
157
+ * Dynamic's gas sponsorship API.
158
+ * Otherwise it falls back to the provider's standard `signAndSendTransaction`.
159
+ *
160
+ * @param params.transaction - The transaction to sign and send
161
+ * @param params.walletAccount - The wallet account to sign and send the transaction with
162
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
163
+ * @returns An object containing the signature
164
+ * @not-instrumented
165
+ */
166
+ const signAndSendTransaction = async ({ walletAccount, transaction, sponsorshipMode = "auto", options }, client = getDefaultClient$1()) => {
167
+ const provider = getWalletProviderFromWalletAccount({ walletAccount }, client);
168
+ if (!isSolanaWalletProvider(provider)) throw new NotSolanaProviderError({ providerKey: provider.key });
169
+ if (sponsorshipMode === "auto" && isSolanaGasSponsorshipEnabled(client) && provider.signAndSendSponsoredTransaction) return provider.signAndSendSponsoredTransaction({
170
+ options,
171
+ transaction,
172
+ walletAccount
173
+ });
174
+ return provider.signAndSendTransaction({
175
+ options,
176
+ transaction,
177
+ walletAccount
178
+ });
179
+ };
180
+
119
181
  //#endregion
120
182
  //#region src/utils/solanaExecuteSwapTransaction/solanaExecuteSwapTransaction.ts
121
183
  /**
122
184
  * Executes a Solana checkout transaction by deserializing the base64-encoded
123
- * transaction and sending it via the wallet provider's signAndSendTransaction.
185
+ * transaction and routing it through `signAndSendTransaction`, which applies
186
+ * the project's gas sponsorship setting when enabled.
124
187
  *
125
188
  * 1. Validates that the wallet account is a Solana wallet account
126
189
  * 2. Extracts and validates the serialized transaction from the signing payload
127
190
  * 3. Deserializes the transaction (tries VersionedTransaction first, falls back to Transaction)
128
- * 4. Signs and sends via the Solana wallet provider
191
+ * 4. Signs and sends via `signAndSendTransaction` (sponsored when project settings opt in)
129
192
  *
130
193
  * @param params.signingPayload - The signing payload containing `serializedTransaction`.
131
194
  * @param params.walletAccount - The wallet account used to sign and send the transaction.
@@ -147,43 +210,13 @@ const solanaExecuteSwapTransaction = async ({ onStepChange, signingPayload, wall
147
210
  transaction = Transaction.from(bytes);
148
211
  }
149
212
  onStepChange?.("transaction");
150
- const { signature } = await walletProvider.signAndSendTransaction({
213
+ const { signature } = await signAndSendTransaction({
151
214
  transaction,
152
215
  walletAccount
153
- });
216
+ }, client);
154
217
  return { transactionHash: signature };
155
218
  };
156
219
 
157
- //#endregion
158
- //#region src/errors/NotSolanaProviderError/NotSolanaProviderError.ts
159
- var NotSolanaProviderError = class extends BaseError {
160
- providerKey;
161
- constructor(params) {
162
- super({
163
- cause: null,
164
- code: "not_solana_provider_error",
165
- docsUrl: null,
166
- name: "NotSolanaProviderError",
167
- shortMessage: "Provider is not a Solana wallet provider"
168
- });
169
- this.providerKey = params.providerKey;
170
- }
171
- };
172
-
173
- //#endregion
174
- //#region src/isSolanaGasSponsorshipEnabled/isSolanaGasSponsorshipEnabled.ts
175
- /**
176
- * Checks if Solana gas sponsorship is enabled for the current project.
177
- *
178
- * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
179
- * @returns True if Solana gas sponsorship is enabled, false otherwise.
180
- * @not-instrumented
181
- */
182
- const isSolanaGasSponsorshipEnabled = (client = getDefaultClient$1()) => {
183
- assertDefined(client.projectSettings, "Project settings are not defined");
184
- return client.projectSettings.sdk.embeddedWallets?.svmGasSponsorshipEnabled ?? false;
185
- };
186
-
187
220
  //#endregion
188
221
  //#region src/utils/solanaTransferAmount/solanaTransferAmount.ts
189
222
  const DEFAULT_DECIMALS = 9;
@@ -229,25 +262,17 @@ const solanaTransferAmount = async ({ amount, recipient, token, walletAccount },
229
262
  toPubkey
230
263
  })];
231
264
  const { blockhash } = await connection.getLatestBlockhash("finalized");
232
- const transaction = new VersionedTransaction(new TransactionMessage({
233
- instructions,
234
- payerKey: fromPubkey,
235
- recentBlockhash: blockhash
236
- }).compileToV0Message());
237
- if (isSolanaGasSponsorshipEnabled(client) && provider.signAndSendSponsoredTransaction) {
238
- const { signature: signature$1 } = await provider.signAndSendSponsoredTransaction({
239
- transaction,
240
- walletAccount
241
- });
242
- return { transactionHash: signature$1 };
243
- }
244
- const { signature } = await provider.signAndSendTransaction({
245
- transaction,
265
+ const { signature } = await signAndSendTransaction({
266
+ transaction: new VersionedTransaction(new TransactionMessage({
267
+ instructions,
268
+ payerKey: fromPubkey,
269
+ recentBlockhash: blockhash
270
+ }).compileToV0Message()),
246
271
  walletAccount
247
- });
272
+ }, client);
248
273
  return { transactionHash: signature };
249
274
  };
250
275
 
251
276
  //#endregion
252
- export { isSolanaWalletProvider as a, isVersionedTransaction as c, name as d, version as f, solanaExecuteSwapTransaction as i, getSolanaConnection as l, isSolanaGasSponsorshipEnabled as n, solanaConfirmTransaction as o, NotSolanaProviderError as r, isSolanaWalletAccount as s, solanaTransferAmount as t, registerSolanaNetworkProviderBuilder as u };
253
- //# sourceMappingURL=solanaTransferAmount-6QqXIUbz.esm.js.map
277
+ export { NotSolanaProviderError as a, isSolanaWalletAccount as c, registerSolanaNetworkProviderBuilder as d, name as f, isSolanaGasSponsorshipEnabled as i, isVersionedTransaction as l, solanaExecuteSwapTransaction as n, isSolanaWalletProvider as o, version as p, signAndSendTransaction as r, solanaConfirmTransaction as s, solanaTransferAmount as t, getSolanaConnection as u };
278
+ //# sourceMappingURL=solanaTransferAmount-o7WCDn3_.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solanaTransferAmount-o7WCDn3_.esm.js","names":["getDefaultClient","getDefaultClient","transaction: Transaction | VersionedTransaction","instructions: TransactionInstruction[]"],"sources":["../package.json","../src/utils/fetchSolBalance/fetchSolBalance.ts","../src/utils/createSolanaNetworkProvider/createSolanaNetworkProvider.ts","../src/registerSolanaNetworkProviderBuilder/registerSolanaNetworkProviderBuilder.ts","../src/getSolanaConnection/getSolanaConnection.ts","../src/utils/isVersionedTransaction/isVersionedTransaction.ts","../src/isSolanaWalletAccount/isSolanaWalletAccount.ts","../src/utils/solanaConfirmTransaction/solanaConfirmTransaction.ts","../src/isSolanaWalletProvider/isSolanaWalletProvider.ts","../src/errors/NotSolanaProviderError/NotSolanaProviderError.ts","../src/isSolanaGasSponsorshipEnabled/isSolanaGasSponsorshipEnabled.ts","../src/signAndSendTransaction/signAndSendTransaction.ts","../src/utils/solanaExecuteSwapTransaction/solanaExecuteSwapTransaction.ts","../src/utils/solanaTransferAmount/solanaTransferAmount.ts"],"sourcesContent":["","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport { Connection, PublicKey } from '@solana/web3.js';\n\n/** @not-instrumented */\nexport const fetchSolBalance = async ({\n address,\n networkData,\n}: {\n address: string;\n networkData: NetworkData;\n}): Promise<string | null> => {\n // Establish a connection to the Solana network using the provided RPC URL.\n const connection = new Connection(networkData.rpcUrls.http[0]);\n\n // Convert the string address into a PublicKey object.\n const publicKey = new PublicKey(address);\n\n // Fetch the balance of the public key. The balance is in lamports.\n const balanceInLamports = await connection.getBalance(publicKey);\n\n // The getBalance method returns the balance in lamports.\n // 1 SOL = 1,000,000,000 lamports.\n const balanceInSol = balanceInLamports / 1_000_000_000;\n\n // Return the balance in SOL as a string\n return balanceInSol.toString();\n};\n","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport { createBaseNetworkProvider } from '@dynamic-labs-sdk/client/core';\n\nimport type { SolanaNetworkProvider } from '../../SolanaNetworkProvider.types';\nimport { fetchSolBalance } from '../fetchSolBalance';\n\n/** @not-instrumented */\nexport const createSolanaNetworkProvider = (\n networkData: NetworkData\n): SolanaNetworkProvider => ({\n ...createBaseNetworkProvider('SOL', networkData),\n cluster: networkData.cluster,\n genesisHash: networkData.genesisHash,\n getBalance: async ({ address }) => ({\n balance: await fetchSolBalance({\n address,\n networkData,\n }),\n }),\n});\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getNetworkProviderBuilderRegistry } from '@dynamic-labs-sdk/client/core';\n\nimport { createSolanaNetworkProvider } from '../utils/createSolanaNetworkProvider';\n\n/** @not-instrumented */\nexport const registerSolanaNetworkProviderBuilder = (\n client: DynamicClient\n): void => {\n const networkProviderBuilderRegistry =\n getNetworkProviderBuilderRegistry(client);\n\n /**\n * If the Solana network provider builder is already registered, return.\n */\n if (networkProviderBuilderRegistry.get().get('SOL')) {\n return;\n }\n\n networkProviderBuilderRegistry.register({\n builder: createSolanaNetworkProvider,\n chain: 'SOL',\n });\n};\n","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport type { Commitment, ConnectionConfig } from '@solana/web3.js';\nimport { Connection } from '@solana/web3.js';\n\ntype GetSolanaConnectionOptions = {\n commitmentOrConfig?: Commitment | ConnectionConfig;\n networkData: NetworkData;\n};\n\n/**\n * Returns a new Solana connection for the given network provider.\n *\n * @example\n * ```ts\n * import { getActiveNetworkData } from '@dynamic-labs-sdk/client';\n * import { isSolanaNetworkProvider, getSolanaConnection } from '@dynamic-labs-sdk/solana';\n *\n * const { networkData } = getActiveNetworkData({ walletAccount });\n *\n * if(!networkData) {\n * throw new Error('No network data found');\n * }\n *\n * const connection = getSolanaConnection({\n * networkData,\n * });\n * ```\n * @not-instrumented\n */\nexport const getSolanaConnection = ({\n networkData,\n commitmentOrConfig,\n}: GetSolanaConnectionOptions) => {\n return new Connection(networkData.rpcUrls.http[0], commitmentOrConfig);\n};\n","import type { Transaction, VersionedTransaction } from '@solana/web3.js';\n\n/** @not-instrumented */\nexport const isVersionedTransaction = (\n transaction: VersionedTransaction | Transaction\n): transaction is VersionedTransaction => !('instructions' in transaction);\n","import type { WalletAccount } from '@dynamic-labs-sdk/client';\n\nimport type { SolanaWalletAccount } from '../SolanaWalletAccount.types';\n\n/**\n * Type guard function to check if a wallet account is a Solana wallet account.\n *\n * @param walletAccount - The wallet account to check.\n * @returns True if the wallet account is a Solana wallet account, false otherwise.\n * @not-instrumented\n */\nexport const isSolanaWalletAccount = (\n walletAccount: WalletAccount\n): walletAccount is SolanaWalletAccount => walletAccount.chain === 'SOL';\n","import {\n type DynamicClient,\n InvalidParamError,\n getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport type { ConfirmTransactionParams } from '@dynamic-labs-sdk/client/core';\nimport { assertDefined } from '@dynamic-labs-sdk/client/core';\n\nimport { getSolanaConnection } from '../../getSolanaConnection';\nimport { isSolanaWalletAccount } from '../../isSolanaWalletAccount';\n\n/**\n * Waits for a Solana transaction to be confirmed on-chain.\n *\n * @param params.transactionHash - The transaction signature to wait for.\n * @param params.walletAccount - The Solana wallet account used to resolve the active network.\n * @param client - The Dynamic client instance.\n * @not-instrumented\n */\nexport const solanaConfirmTransaction = async (\n { transactionHash, walletAccount }: ConfirmTransactionParams,\n client: DynamicClient\n): Promise<void> => {\n if (!isSolanaWalletAccount(walletAccount)) {\n throw new InvalidParamError(\n 'Wallet account is not a Solana wallet account'\n );\n }\n\n const { networkData } = await getActiveNetworkData({ walletAccount }, client);\n\n assertDefined(\n networkData,\n `No network data found for wallet account ${walletAccount.address}`\n );\n\n const connection = getSolanaConnection({ networkData });\n\n const { blockhash, lastValidBlockHeight } =\n await connection.getLatestBlockhash();\n\n await connection.confirmTransaction({\n blockhash,\n lastValidBlockHeight,\n signature: transactionHash,\n });\n};\n","import type { WalletProvider } from '@dynamic-labs-sdk/client/core';\n\nimport type { SolanaWalletProvider } from '../SolanaWalletProvider.types';\n\n/** @not-instrumented */\nexport const isSolanaWalletProvider = (\n provider: WalletProvider\n): provider is SolanaWalletProvider => {\n return provider.chain === 'SOL';\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class NotSolanaProviderError extends BaseError {\n public readonly providerKey: string;\n\n constructor(params: { providerKey: string }) {\n super({\n cause: null,\n code: 'not_solana_provider_error',\n docsUrl: null,\n name: 'NotSolanaProviderError',\n shortMessage: 'Provider is not a Solana wallet provider',\n });\n\n this.providerKey = params.providerKey;\n }\n}\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { assertDefined } from '@dynamic-labs-sdk/client/core';\n\n/**\n * Checks if Solana gas sponsorship is enabled for the current project.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns True if Solana gas sponsorship is enabled, false otherwise.\n * @not-instrumented\n */\nexport const isSolanaGasSponsorshipEnabled = (\n client = getDefaultClient()\n): boolean => {\n assertDefined(client.projectSettings, 'Project settings are not defined');\n\n return (\n client.projectSettings.sdk.embeddedWallets?.svmGasSponsorshipEnabled ??\n false\n );\n};\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { getWalletProviderFromWalletAccount } from '@dynamic-labs-sdk/client/core';\nimport type {\n SendOptions,\n Transaction,\n VersionedTransaction,\n} from '@solana/web3.js';\n\nimport type { SolanaWalletAccount } from '../SolanaWalletAccount.types';\nimport { NotSolanaProviderError } from '../errors/NotSolanaProviderError';\nimport { isSolanaGasSponsorshipEnabled } from '../isSolanaGasSponsorshipEnabled';\nimport { isSolanaWalletProvider } from '../isSolanaWalletProvider';\n\ntype SignAndSendTransactionParams = {\n options?: SendOptions;\n /**\n * Controls whether Dynamic's gas sponsorship API is used to pay for this\n * transaction.\n *\n * - `'auto'` (default): the transaction is sponsored when Solana gas\n * sponsorship is enabled in project settings AND the walletAccount is a\n * Dynamic embedded wallet. Otherwise the user pays gas.\n * - `'off'`: the transaction is never sponsored, regardless of project\n * settings or provider capabilities. The user pays gas.\n *\n * To require sponsorship (and throw if unsupported), use\n * `signAndSendSponsoredTransaction` instead.\n *\n * @default 'auto'\n */\n sponsorshipMode?: 'auto' | 'off';\n transaction: Transaction | VersionedTransaction;\n walletAccount: SolanaWalletAccount;\n};\n\n/**\n * Signs and sends a Solana transaction, honoring the project's Solana gas\n * sponsorship setting.\n *\n * When solana gas sponsorship is enabled in project settings and sponsorship\n * is supported by the wallet provider, the transaction is routed through\n * Dynamic's gas sponsorship API.\n * Otherwise it falls back to the provider's standard `signAndSendTransaction`.\n *\n * @param params.transaction - The transaction to sign and send\n * @param params.walletAccount - The wallet account to sign and send the transaction with\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns An object containing the signature\n * @not-instrumented\n */\nexport const signAndSendTransaction = async (\n {\n walletAccount,\n transaction,\n sponsorshipMode = 'auto',\n options,\n }: SignAndSendTransactionParams,\n client = getDefaultClient()\n): Promise<{ signature: string }> => {\n const provider = getWalletProviderFromWalletAccount(\n {\n walletAccount,\n },\n client\n );\n\n if (!isSolanaWalletProvider(provider)) {\n throw new NotSolanaProviderError({ providerKey: provider.key });\n }\n\n if (\n sponsorshipMode === 'auto' &&\n isSolanaGasSponsorshipEnabled(client) &&\n provider.signAndSendSponsoredTransaction\n ) {\n return provider.signAndSendSponsoredTransaction({\n options,\n transaction,\n walletAccount,\n });\n }\n\n return provider.signAndSendTransaction({\n options,\n transaction,\n walletAccount,\n });\n};\n","import {\n type DynamicClient,\n InvalidParamError,\n} from '@dynamic-labs-sdk/client';\nimport type {\n ExecuteSwapTransactionParams,\n ExecuteSwapTransactionResult,\n} from '@dynamic-labs-sdk/client/core';\nimport {\n getBuffer,\n getWalletProviderFromWalletAccount,\n} from '@dynamic-labs-sdk/client/core';\nimport { Transaction, VersionedTransaction } from '@solana/web3.js';\n\nimport { isSolanaWalletAccount } from '../../isSolanaWalletAccount';\nimport { isSolanaWalletProvider } from '../../isSolanaWalletProvider';\nimport { signAndSendTransaction } from '../../signAndSendTransaction';\n\n/**\n * Executes a Solana checkout transaction by deserializing the base64-encoded\n * transaction and routing it through `signAndSendTransaction`, which applies\n * the project's gas sponsorship setting when enabled.\n *\n * 1. Validates that the wallet account is a Solana wallet account\n * 2. Extracts and validates the serialized transaction from the signing payload\n * 3. Deserializes the transaction (tries VersionedTransaction first, falls back to Transaction)\n * 4. Signs and sends via `signAndSendTransaction` (sponsored when project settings opt in)\n *\n * @param params.signingPayload - The signing payload containing `serializedTransaction`.\n * @param params.walletAccount - The wallet account used to sign and send the transaction.\n * @param params.onStepChange - Optional callback invoked with `'transaction'` when the send step begins.\n * @param client - The Dynamic client instance.\n * @returns The transaction hash (signature).\n * @not-instrumented\n */\nexport const solanaExecuteSwapTransaction = async (\n { onStepChange, signingPayload, walletAccount }: ExecuteSwapTransactionParams,\n client: DynamicClient\n): Promise<ExecuteSwapTransactionResult> => {\n const walletProvider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (\n !isSolanaWalletAccount(walletAccount) ||\n !isSolanaWalletProvider(walletProvider)\n ) {\n throw new InvalidParamError(\n 'Wallet account is not a Solana wallet account'\n );\n }\n\n const serializedTransactionData = signingPayload.serializedTransaction;\n\n if (!serializedTransactionData) {\n throw new InvalidParamError(\n 'Signing payload is missing serialized transaction data'\n );\n }\n\n const bytes = new Uint8Array(\n getBuffer().from(serializedTransactionData, 'base64')\n );\n\n let transaction: Transaction | VersionedTransaction;\n\n // Try VersionedTransaction first, fall back to legacy Transaction\n try {\n transaction = VersionedTransaction.deserialize(bytes);\n } catch {\n transaction = Transaction.from(bytes);\n }\n\n onStepChange?.('transaction');\n\n const { signature } = await signAndSendTransaction(\n { transaction, walletAccount },\n client\n );\n\n return { transactionHash: signature };\n};\n","import {\n type DynamicClient,\n InvalidParamError,\n getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport type { TransferAmountParams } from '@dynamic-labs-sdk/client/core';\nimport {\n assertDefined,\n getWalletProviderFromWalletAccount,\n parseAmountToSmallestUnit,\n} from '@dynamic-labs-sdk/client/core';\nimport {\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n createTransferCheckedInstruction,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\nimport type { TransactionInstruction } from '@solana/web3.js';\nimport {\n PublicKey,\n SystemProgram,\n TransactionMessage,\n VersionedTransaction,\n} from '@solana/web3.js';\n\nimport { NotSolanaProviderError } from '../../errors/NotSolanaProviderError';\nimport { getSolanaConnection } from '../../getSolanaConnection';\nimport { isSolanaWalletAccount } from '../../isSolanaWalletAccount';\nimport { isSolanaWalletProvider } from '../../isSolanaWalletProvider';\nimport { signAndSendTransaction } from '../../signAndSendTransaction';\nconst DEFAULT_DECIMALS = 9;\n\n/**\n * Transfers native SOL or SPL tokens from one wallet to another.\n *\n * For native SOL, builds a `SystemProgram.transfer` instruction.\n * For SPL tokens, derives associated token accounts, creates the recipient\n * ATA if needed, and builds a `transferChecked` instruction. Supports both\n * standard SPL tokens and Token-2022 tokens by detecting the mint's program.\n * @not-instrumented\n */\nexport const solanaTransferAmount = async (\n { amount, recipient, token, walletAccount }: TransferAmountParams,\n client: DynamicClient\n): Promise<{ transactionHash: string }> => {\n if (!isSolanaWalletAccount(walletAccount)) {\n throw new InvalidParamError(\n 'Wallet account is not a Solana wallet account'\n );\n }\n\n const provider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (!isSolanaWalletProvider(provider)) {\n throw new NotSolanaProviderError({ providerKey: provider.key });\n }\n\n const { networkData } = await getActiveNetworkData({ walletAccount }, client);\n assertDefined(networkData, 'Network data is required');\n\n const connection = getSolanaConnection({ networkData });\n\n const fromPubkey = new PublicKey(walletAccount.address);\n const toPubkey = new PublicKey(recipient);\n\n let instructions: TransactionInstruction[];\n\n if (token) {\n const decimals = token.decimals ?? DEFAULT_DECIMALS;\n const mintPubkey = new PublicKey(token.address);\n\n // Detect Token-2022 vs standard SPL by checking mint account owner\n const mintAccountInfo = await connection.getAccountInfo(mintPubkey);\n const tokenProgramId = mintAccountInfo?.owner.equals(TOKEN_2022_PROGRAM_ID)\n ? TOKEN_2022_PROGRAM_ID\n : TOKEN_PROGRAM_ID;\n\n const senderAta = await getAssociatedTokenAddress(\n mintPubkey,\n fromPubkey,\n false,\n tokenProgramId\n );\n\n const recipientAta = await getAssociatedTokenAddress(\n mintPubkey,\n toPubkey,\n false,\n tokenProgramId\n );\n\n const recipientAccountInfo = await connection.getAccountInfo(recipientAta);\n\n const rawAmount = parseAmountToSmallestUnit({ amount, decimals });\n\n instructions = [];\n\n if (!recipientAccountInfo) {\n instructions.push(\n createAssociatedTokenAccountInstruction(\n fromPubkey,\n recipientAta,\n toPubkey,\n mintPubkey,\n tokenProgramId\n )\n );\n }\n\n instructions.push(\n createTransferCheckedInstruction(\n senderAta,\n mintPubkey,\n recipientAta,\n fromPubkey,\n rawAmount,\n decimals,\n [],\n tokenProgramId\n )\n );\n } else {\n instructions = [\n SystemProgram.transfer({\n fromPubkey,\n lamports: parseAmountToSmallestUnit({ amount, decimals: DEFAULT_DECIMALS }),\n toPubkey,\n }),\n ];\n }\n\n const { blockhash } = await connection.getLatestBlockhash('finalized');\n\n const message = new TransactionMessage({\n instructions,\n payerKey: fromPubkey,\n recentBlockhash: blockhash,\n }).compileToV0Message();\n\n const transaction = new VersionedTransaction(message);\n\n const { signature } = await signAndSendTransaction(\n { transaction, walletAccount },\n client\n );\n\n return { transactionHash: signature };\n};\n"],"mappings":"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"}