UNPKG

@solana/kit

Version:

Solana Javascript API

135 lines (126 loc) 4.84 kB
import type { Signature } from '@solana/keys'; import type { Rpc, SendTransactionApi } from '@solana/rpc'; import { Commitment, commitmentComparator } from '@solana/rpc-types'; import { TransactionWithLastValidBlockHeight, waitForDurableNonceTransactionConfirmation, waitForRecentTransactionConfirmation, } from '@solana/transaction-confirmation'; import { getBase64EncodedWireTransaction, SendableTransaction, Transaction, TransactionWithDurableNonceLifetime, } from '@solana/transactions'; interface SendAndConfirmDurableNonceTransactionConfig extends SendTransactionBaseConfig, SendTransactionConfigWithoutEncoding { confirmDurableNonceTransaction: ( config: Omit< Parameters<typeof waitForDurableNonceTransactionConfirmation>[0], 'getNonceInvalidationPromise' | 'getRecentSignatureConfirmationPromise' >, ) => Promise<void>; transaction: SendableTransaction & Transaction & TransactionWithDurableNonceLifetime; } interface SendAndConfirmTransactionWithBlockhashLifetimeConfig extends SendTransactionBaseConfig, SendTransactionConfigWithoutEncoding { confirmRecentTransaction: ( config: Omit< Parameters<typeof waitForRecentTransactionConfirmation>[0], 'getBlockHeightExceedencePromise' | 'getRecentSignatureConfirmationPromise' >, ) => Promise<void>; transaction: SendableTransaction & Transaction & TransactionWithLastValidBlockHeight; } interface SendTransactionBaseConfig extends SendTransactionConfigWithoutEncoding { abortSignal?: AbortSignal; commitment: Commitment; rpc: Rpc<SendTransactionApi>; transaction: SendableTransaction & Transaction; } type SendTransactionConfigWithoutEncoding = Omit< NonNullable<Parameters<SendTransactionApi['sendTransaction']>[1]>, 'encoding' >; function getSendTransactionConfigWithAdjustedPreflightCommitment( commitment: Commitment, config?: SendTransactionConfigWithoutEncoding, ): SendTransactionConfigWithoutEncoding | void { if ( // The developer has supplied no value for `preflightCommitment`. !config?.preflightCommitment && // The value of `commitment` is lower than the server default of `preflightCommitment`. commitmentComparator(commitment, 'finalized' /* default value of `preflightCommitment` */) < 0 ) { return { ...config, // In the common case, it is unlikely that you want to simulate a transaction at // `finalized` commitment when your standard of commitment for confirming the // transaction is lower. Cap the simulation commitment level to the level of the // confirmation commitment. preflightCommitment: commitment, }; } // The commitment at which the developer wishes to confirm the transaction is at least as // high as the commitment at which they want to simulate it. Honour the config as-is. return config; } export async function sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ abortSignal, commitment, rpc, transaction, ...sendTransactionConfig }: SendTransactionBaseConfig): Promise<Signature> { const base64EncodedWireTransaction = getBase64EncodedWireTransaction(transaction); return await rpc .sendTransaction(base64EncodedWireTransaction, { ...getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, sendTransactionConfig), encoding: 'base64', }) .send({ abortSignal }); } export async function sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ abortSignal, commitment, confirmDurableNonceTransaction, rpc, transaction, ...sendTransactionConfig }: SendAndConfirmDurableNonceTransactionConfig): Promise<Signature> { const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ ...sendTransactionConfig, abortSignal, commitment, rpc, transaction, }); await confirmDurableNonceTransaction({ abortSignal, commitment, transaction, }); return transactionSignature; } export async function sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({ abortSignal, commitment, confirmRecentTransaction, rpc, transaction, ...sendTransactionConfig }: SendAndConfirmTransactionWithBlockhashLifetimeConfig): Promise<Signature> { const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({ ...sendTransactionConfig, abortSignal, commitment, rpc, transaction, }); await confirmRecentTransaction({ abortSignal, commitment, transaction, }); return transactionSignature; }