@solana/kit 6.8.0 → 6.9.0-canary-20260416164237

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/create-async-generator-with-initial-value-and-slot-tracking.ts","../src/create-reactive-store-with-initial-value-and-slot-tracking.ts","../src/airdrop-internal.ts","../src/airdrop.ts","../src/compute-unit-limit-estimation.ts","../src/fetch-lookup-tables.ts","../src/decompile-transaction-message-fetching-lookup-tables.ts","../src/get-minimum-balance-for-rent-exemption.ts","../src/send-transaction-internal.ts","../src/send-and-confirm-durable-nonce-transaction.ts","../src/send-and-confirm-transaction.ts","../src/send-transaction-without-confirming.ts"],"names":["createRecentSignatureConfirmationPromiseFactory","waitForRecentTransactionConfirmationUntilTimeout","getTimeoutPromise","isTransactionMessageWithDurableNonceLifetime","pipe","setTransactionMessageComputeUnitLimit","compileTransaction","getBase64EncodedWireTransaction","SolanaError","SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT","SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT","getSolanaErrorFromTransactionError","isSolanaError","getTransactionMessageComputeUnitLimit","fetchJsonParsedAccounts","assertAccountsDecoded","assertAccountsExist","decompileTransactionMessage","commitmentComparator","createNonceInvalidationPromiseFactory","SOLANA_ERROR__INVALID_NONCE","getSignatureFromTransaction","waitForDurableNonceTransactionConfirmation","createBlockHeightExceedencePromiseFactory","waitForRecentTransactionConfirmation"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import type { PendingRpcRequest } from '@solana/rpc';\nimport type { PendingRpcSubscriptionsRequest } from '@solana/rpc-subscriptions';\nimport type { SolanaRpcResponse } from '@solana/rpc-types';\n\ntype CreateAsyncGeneratorWithInitialValueAndSlotTrackingConfig<TRpcValue, TSubscriptionValue, TItem> = Readonly<{\n /**\n * Triggering this abort signal will cancel the pending RPC request and subscription, and\n * cause the async generator to return (complete without error).\n */\n abortSignal: AbortSignal;\n /**\n * A pending RPC request whose response will be yielded as the generator's first value\n * (unless a subscription notification with a newer slot arrives first).\n * The response must be a {@link SolanaRpcResponse} so that its slot can be compared with\n * subscription notifications.\n */\n rpcRequest: PendingRpcRequest<SolanaRpcResponse<TRpcValue>>;\n /**\n * A pending RPC subscription request whose notifications will be yielded as they arrive.\n * Each notification must be a {@link SolanaRpcResponse} so that its slot can be compared\n * with the initial RPC response and other notifications.\n */\n rpcSubscriptionRequest: PendingRpcSubscriptionsRequest<SolanaRpcResponse<TSubscriptionValue>>;\n /**\n * Maps the value from a subscription notification to the item type yielded by the generator.\n */\n rpcSubscriptionValueMapper: (value: TSubscriptionValue) => TItem;\n /**\n * Maps the value from the RPC response to the item type yielded by the generator.\n */\n rpcValueMapper: (value: TRpcValue) => TItem;\n}>;\n\n/**\n * Creates an async generator that combines an initial RPC fetch with an ongoing subscription,\n * yielding values as they arrive from either source.\n *\n * The generator uses slot-based comparison to ensure that only the most recent values are yielded.\n * Any value at a slot older than a previously yielded value is silently dropped.\n * This prevents stale data from appearing when the RPC response and subscription notifications\n * arrive out of order.\n *\n * Things to note:\n *\n * - The generator yields {@link SolanaRpcResponse} values from both the RPC response and\n * subscription notifications, each containing the slot context and the mapped value.\n * - Out-of-order values (by slot) are silently dropped — they are never yielded.\n * - On error from either source, the generator throws the error.\n * - Triggering the caller's abort signal causes the generator to return (complete without error).\n * - The generator completes when the subscription ends, an error occurs, or the abort signal fires.\n *\n * @param config\n *\n * @example\n * ```ts\n * import {\n * address,\n * createAsyncGeneratorWithInitialValueAndSlotTracking,\n * createSolanaRpc,\n * createSolanaRpcSubscriptions,\n * } from '@solana/kit';\n *\n * const rpc = createSolanaRpc('http://127.0.0.1:8899');\n * const rpcSubscriptions = createSolanaRpcSubscriptions('ws://127.0.0.1:8900');\n * const myAddress = address('FnHyam9w4NZoWR6mKN1CuGBritdsEWZQa4Z4oawLZGxa');\n *\n * const abortController = new AbortController();\n * for await (const balance of createAsyncGeneratorWithInitialValueAndSlotTracking({\n * abortSignal: abortController.signal,\n * rpcRequest: rpc.getBalance(myAddress, { commitment: 'confirmed' }),\n * rpcValueMapper: lamports => lamports,\n * rpcSubscriptionRequest: rpcSubscriptions.accountNotifications(myAddress),\n * rpcSubscriptionValueMapper: ({ lamports }) => lamports,\n * })) {\n * console.log(`Balance at slot ${balance.context.slot}:`, balance.value);\n * }\n * ```\n */\nexport async function* createAsyncGeneratorWithInitialValueAndSlotTracking<TRpcValue, TSubscriptionValue, TItem>({\n abortSignal,\n rpcRequest,\n rpcValueMapper,\n rpcSubscriptionRequest,\n rpcSubscriptionValueMapper,\n}: CreateAsyncGeneratorWithInitialValueAndSlotTrackingConfig<TRpcValue, TSubscriptionValue, TItem>): AsyncGenerator<\n SolanaRpcResponse<TItem>\n> {\n if (abortSignal.aborted) return;\n\n let lastUpdateSlot = -1n;\n\n // Shared queue for merging values from the RPC response and subscription notifications.\n const queue: SolanaRpcResponse<TItem>[] = [];\n let waitingResolve: ((value: IteratorResult<SolanaRpcResponse<TItem>>) => void) | null = null;\n let waitingReject: ((reason: unknown) => void) | null = null;\n let rpcDone = false;\n let subscriptionDone = false;\n let done = false;\n let pendingError: unknown;\n\n function markSourcesDone() {\n done = true;\n if (waitingResolve) {\n const resolve = waitingResolve;\n waitingResolve = null;\n waitingReject = null;\n resolve({ done: true, value: undefined });\n }\n }\n\n const abortController = new AbortController();\n const signal = abortController.signal;\n\n function onAbort() {\n done = true;\n abortController.abort(abortSignal.reason);\n if (waitingResolve) {\n const resolve = waitingResolve;\n waitingResolve = null;\n waitingReject = null;\n resolve({ done: true, value: undefined });\n }\n }\n abortSignal.addEventListener('abort', onAbort);\n\n function enqueue(item: SolanaRpcResponse<TItem>) {\n if (done || signal.aborted) return;\n if (waitingResolve) {\n // generator is waiting for a value, so resolve immediately\n const resolve = waitingResolve;\n waitingResolve = null;\n waitingReject = null;\n resolve({ done: false, value: item });\n } else {\n // No pending generator pull, so enqueue the item for future delivery\n queue.push(item);\n }\n }\n\n function handleError(err: unknown) {\n if (signal.aborted) return;\n done = true;\n pendingError = err;\n abortController.abort(err);\n if (waitingReject) {\n // generator is waiting for a value, so reject immediately\n const reject = waitingReject;\n waitingResolve = null;\n waitingReject = null;\n reject(err);\n }\n }\n\n // Start both sources concurrently.\n rpcRequest\n .send({ abortSignal: signal })\n .then(({ context: { slot }, value }) => {\n if (signal.aborted) return;\n if (slot < lastUpdateSlot) return;\n lastUpdateSlot = slot;\n enqueue({ context: { slot }, value: rpcValueMapper(value) });\n })\n .then(() => {\n rpcDone = true;\n if (subscriptionDone) markSourcesDone();\n })\n .catch(handleError);\n\n rpcSubscriptionRequest\n .subscribe({ abortSignal: signal })\n .then(async notifications => {\n for await (const {\n context: { slot },\n value,\n } of notifications) {\n if (signal.aborted) return;\n if (slot < lastUpdateSlot) continue;\n lastUpdateSlot = slot;\n enqueue({ context: { slot }, value: rpcSubscriptionValueMapper(value) });\n }\n // Subscription completed normally.\n subscriptionDone = true;\n if (rpcDone) markSourcesDone();\n })\n .catch(handleError);\n\n try {\n while (true) {\n if (pendingError) throw pendingError;\n if (queue.length > 0) {\n yield queue.shift()!;\n } else if (done) {\n return;\n } else {\n // if no value queued or error, wait for the next value or error\n const result: IteratorResult<SolanaRpcResponse<TItem>> = await new Promise((resolve, reject) => {\n waitingResolve = resolve;\n waitingReject = reject;\n });\n if (result.done) return;\n yield result.value;\n }\n }\n } finally {\n abortSignal.removeEventListener('abort', onAbort);\n if (!signal.aborted) {\n abortController.abort();\n }\n }\n}\n","import type { PendingRpcRequest } from '@solana/rpc';\nimport type { PendingRpcSubscriptionsRequest } from '@solana/rpc-subscriptions';\nimport type { SolanaRpcResponse } from '@solana/rpc-types';\nimport type { ReactiveStore } from '@solana/subscribable';\n\ntype CreateReactiveStoreWithInitialValueAndSlotTrackingConfig<TRpcValue, TSubscriptionValue, TItem> = Readonly<{\n /**\n * Triggering this abort signal will cancel the pending RPC request and subscription, and\n * disconnect the store from further updates.\n */\n abortSignal: AbortSignal;\n /**\n * A pending RPC request whose response will be used to set the store's initial state.\n * The response must be a {@link SolanaRpcResponse} so that its slot can be compared with\n * subscription notifications.\n */\n rpcRequest: PendingRpcRequest<SolanaRpcResponse<TRpcValue>>;\n /**\n * A pending RPC subscription request whose notifications will be used to keep the store\n * up to date. Each notification must be a {@link SolanaRpcResponse} so that its slot can be\n * compared with the initial RPC response and other notifications.\n */\n rpcSubscriptionRequest: PendingRpcSubscriptionsRequest<SolanaRpcResponse<TSubscriptionValue>>;\n /**\n * Maps the value from a subscription notification to the item type stored in the reactive store.\n */\n rpcSubscriptionValueMapper: (value: TSubscriptionValue) => TItem;\n /**\n * Maps the value from the RPC response to the item type stored in the reactive store.\n */\n rpcValueMapper: (value: TRpcValue) => TItem;\n}>;\n\n/**\n * Creates a {@link ReactiveStore} that combines an initial RPC fetch with an ongoing subscription\n * to keep its state up to date.\n *\n * The store uses slot-based comparison to ensure that only the most recent value is kept,\n * regardless of whether it came from the initial RPC response or a subscription notification.\n * This prevents stale data from overwriting newer data when the RPC response and subscription\n * notifications arrive out of order.\n *\n * Things to note:\n *\n * - `getState()` returns `undefined` until the first response or notification arrives. Once\n * data arrives, it returns a {@link SolanaRpcResponse} containing the value and the slot\n * context at which it was observed.\n * - On error from either source, `getState()` continues to return the last known value and\n * `getError()` returns the error. Only the first error is captured.\n * - When an error occurs, the abort signal is triggered, cancelling both the RPC request and\n * the subscription.\n * - Triggering the caller's abort signal disconnects the store from both sources.\n *\n * @param config\n *\n * @example\n * ```ts\n * import {\n * address,\n * createReactiveStoreWithInitialValueAndSlotTracking,\n * createSolanaRpc,\n * createSolanaRpcSubscriptions,\n * } from '@solana/kit';\n *\n * const rpc = createSolanaRpc('http://127.0.0.1:8899');\n * const rpcSubscriptions = createSolanaRpcSubscriptions('ws://127.0.0.1:8900');\n * const myAddress = address('FnHyam9w4NZoWR6mKN1CuGBritdsEWZQa4Z4oawLZGxa');\n *\n * const balanceStore = createReactiveStoreWithInitialValueAndSlotTracking({\n * abortSignal: AbortSignal.timeout(60_000),\n * rpcRequest: rpc.getBalance(myAddress, { commitment: 'confirmed' }),\n * rpcValueMapper: lamports => lamports,\n * rpcSubscriptionRequest: rpcSubscriptions.accountNotifications(myAddress),\n * rpcSubscriptionValueMapper: ({ lamports }) => lamports,\n * });\n *\n * const unsubscribe = balanceStore.subscribe(() => {\n * const error = balanceStore.getError();\n * if (error) console.error('Error:', error);\n * else {\n * const state = balanceStore.getState();\n * if (state) console.log(`Balance at slot ${state.context.slot}:`, state.value);\n * }\n * });\n * ```\n *\n * @see {@link ReactiveStore}\n */\nexport function createReactiveStoreWithInitialValueAndSlotTracking<TRpcValue, TSubscriptionValue, TItem>({\n abortSignal,\n rpcRequest,\n rpcValueMapper,\n rpcSubscriptionRequest,\n rpcSubscriptionValueMapper,\n}: CreateReactiveStoreWithInitialValueAndSlotTrackingConfig<TRpcValue, TSubscriptionValue, TItem>): ReactiveStore<\n SolanaRpcResponse<TItem>\n> {\n let currentState: SolanaRpcResponse<TItem> | undefined;\n let currentError: unknown;\n let lastUpdateSlot = -1n;\n const subscribers = new Set<() => void>();\n\n const abortController = new AbortController();\n abortSignal.addEventListener('abort', () => abortController.abort(abortSignal.reason));\n const signal = abortController.signal;\n\n function notifySubscribers() {\n subscribers.forEach(cb => cb());\n }\n\n function handleError(err: unknown) {\n // Ignore if the signal has already been aborted\n if (signal.aborted) return;\n // Only capture the first error\n if (currentError !== undefined) return;\n currentError = err;\n abortController.abort(err);\n notifySubscribers();\n }\n\n rpcRequest\n .send({ abortSignal: signal })\n .then(({ context: { slot }, value }) => {\n if (signal.aborted) return;\n if (slot < lastUpdateSlot) return;\n lastUpdateSlot = slot;\n currentState = { context: { slot }, value: rpcValueMapper(value) };\n notifySubscribers();\n })\n .catch(handleError);\n\n rpcSubscriptionRequest\n .subscribe({ abortSignal: signal })\n .then(async notifications => {\n for await (const {\n context: { slot },\n value,\n } of notifications) {\n if (signal.aborted) return;\n if (slot < lastUpdateSlot) continue;\n lastUpdateSlot = slot;\n currentState = {\n context: { slot },\n value: rpcSubscriptionValueMapper(value),\n };\n notifySubscribers();\n }\n })\n .catch(handleError);\n\n return {\n getError(): unknown {\n return currentError;\n },\n getState(): SolanaRpcResponse<TItem> | undefined {\n return currentState;\n },\n subscribe(callback: () => void): () => void {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n },\n };\n}\n","import type { Address } from '@solana/addresses';\nimport type { Signature } from '@solana/keys';\nimport type { RequestAirdropApi, Rpc } from '@solana/rpc';\nimport type { Commitment, Lamports } from '@solana/rpc-types';\nimport { waitForRecentTransactionConfirmationUntilTimeout } from '@solana/transaction-confirmation';\n\ntype RequestAndConfirmAirdropConfig = Readonly<{\n abortSignal?: AbortSignal;\n commitment: Commitment;\n confirmSignatureOnlyTransaction: (\n config: Omit<\n Parameters<typeof waitForRecentTransactionConfirmationUntilTimeout>[0],\n 'getRecentSignatureConfirmationPromise' | 'getTimeoutPromise'\n >,\n ) => Promise<void>;\n lamports: Lamports;\n recipientAddress: Address;\n rpc: Rpc<RequestAirdropApi>;\n}>;\n\nexport async function requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n confirmSignatureOnlyTransaction,\n lamports,\n recipientAddress,\n rpc,\n}: RequestAndConfirmAirdropConfig): Promise<Signature> {\n const airdropTransactionSignature = await rpc\n .requestAirdrop(recipientAddress, lamports, { commitment })\n .send({ abortSignal });\n await confirmSignatureOnlyTransaction({\n abortSignal,\n commitment,\n signature: airdropTransactionSignature,\n });\n return airdropTransactionSignature;\n}\n","import type { Signature } from '@solana/keys';\nimport type { GetSignatureStatusesApi, RequestAirdropApi, Rpc } from '@solana/rpc';\nimport type { RpcSubscriptions, SignatureNotificationsApi } from '@solana/rpc-subscriptions';\nimport {\n createRecentSignatureConfirmationPromiseFactory,\n getTimeoutPromise,\n waitForRecentTransactionConfirmationUntilTimeout,\n} from '@solana/transaction-confirmation';\n\nimport { requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT } from './airdrop-internal';\n\ntype AirdropFunction = (\n config: Omit<\n Parameters<typeof requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT>[0],\n 'confirmSignatureOnlyTransaction' | 'rpc'\n >,\n) => Promise<Signature>;\n\ntype AirdropFactoryConfig<TCluster> = {\n /** An object that supports the {@link GetSignatureStatusesApi} and the {@link RequestAirdropApi} of the Solana RPC API */\n rpc: Rpc<GetSignatureStatusesApi & RequestAirdropApi> & { '~cluster'?: TCluster };\n /** An object that supports the {@link SignatureNotificationsApi} of the Solana RPC Subscriptions API */\n rpcSubscriptions: RpcSubscriptions<SignatureNotificationsApi> & { '~cluster'?: TCluster };\n};\n\n/**\n * Returns a function that you can call to airdrop a certain amount of {@link Lamports} to a Solana\n * address.\n *\n * > [!NOTE] This only works on test clusters.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { address, airdropFactory, createSolanaRpc, createSolanaRpcSubscriptions, devnet, lamports } from '@solana/kit';\n *\n * const rpc = createSolanaRpc(devnet('http://127.0.0.1:8899'));\n * const rpcSubscriptions = createSolanaRpcSubscriptions(devnet('ws://127.0.0.1:8900'));\n *\n * const airdrop = airdropFactory({ rpc, rpcSubscriptions });\n *\n * await airdrop({\n * commitment: 'confirmed',\n * recipientAddress: address('FnHyam9w4NZoWR6mKN1CuGBritdsEWZQa4Z4oawLZGxa'),\n * lamports: lamports(10_000_000n),\n * });\n * ```\n */\nexport function airdropFactory({ rpc, rpcSubscriptions }: AirdropFactoryConfig<'devnet'>): AirdropFunction;\nexport function airdropFactory({ rpc, rpcSubscriptions }: AirdropFactoryConfig<'mainnet'>): AirdropFunction;\nexport function airdropFactory({ rpc, rpcSubscriptions }: AirdropFactoryConfig<'testnet'>): AirdropFunction;\nexport function airdropFactory<TCluster extends 'devnet' | 'mainnet' | 'testnet' | void = void>({\n rpc,\n rpcSubscriptions,\n}: AirdropFactoryConfig<TCluster>): AirdropFunction {\n const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters<typeof createRecentSignatureConfirmationPromiseFactory>[0]);\n async function confirmSignatureOnlyTransaction(\n config: Omit<\n Parameters<typeof waitForRecentTransactionConfirmationUntilTimeout>[0],\n 'getRecentSignatureConfirmationPromise' | 'getTimeoutPromise'\n >,\n ) {\n await waitForRecentTransactionConfirmationUntilTimeout({\n ...config,\n getRecentSignatureConfirmationPromise,\n getTimeoutPromise,\n });\n }\n return async function airdrop(config) {\n return await requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n confirmSignatureOnlyTransaction,\n rpc,\n });\n };\n}\n","import {\n getSolanaErrorFromTransactionError,\n isSolanaError,\n type RpcSimulateTransactionResult,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT,\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT,\n SolanaError,\n} from '@solana/errors';\nimport { pipe } from '@solana/functional';\nimport type { Rpc, SimulateTransactionApi } from '@solana/rpc';\nimport type { Commitment, Slot } from '@solana/rpc-types';\nimport {\n getTransactionMessageComputeUnitLimit,\n isTransactionMessageWithDurableNonceLifetime,\n setTransactionMessageComputeUnitLimit,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n} from '@solana/transaction-messages';\nimport { compileTransaction, getBase64EncodedWireTransaction } from '@solana/transactions';\n\nconst PROVISORY_COMPUTE_UNIT_LIMIT = 0;\nconst MAX_COMPUTE_UNIT_LIMIT = 1_400_000;\n\ntype EstimateComputeUnitLimitFactoryConfig = Readonly<{\n rpc: Rpc<SimulateTransactionApi>;\n}>;\n\ntype EstimateComputeUnitLimitConfig = Readonly<{\n abortSignal?: AbortSignal;\n commitment?: Commitment;\n minContextSlot?: Slot;\n}>;\n\ntype EstimateComputeUnitLimitFunction = (\n transactionMessage: TransactionMessage & TransactionMessageWithFeePayer,\n config?: EstimateComputeUnitLimitConfig,\n) => Promise<number>;\n\n/**\n * Returns a function that estimates the compute units consumed by a transaction message by\n * simulating it.\n *\n * The estimator sets the compute unit limit to the maximum (1,400,000) before simulating, so the\n * simulation does not fail due to compute unit exhaustion. For blockhash-lifetime transactions, the\n * RPC is asked to replace the blockhash during simulation, so any blockhash value will work. For\n * durable nonce transactions, the actual nonce value is used.\n *\n * @param factoryConfig - An object containing the RPC instance to use for simulation.\n * @return A function that accepts a transaction message and returns the estimated compute units.\n *\n * @example\n * ```ts\n * import { estimateComputeUnitLimitFactory } from '@solana/kit';\n *\n * const estimateComputeUnitLimit = estimateComputeUnitLimitFactory({ rpc });\n * const estimatedUnits = await estimateComputeUnitLimit(transactionMessage);\n * ```\n */\nexport function estimateComputeUnitLimitFactory({\n rpc,\n}: EstimateComputeUnitLimitFactoryConfig): EstimateComputeUnitLimitFunction {\n return async function estimateComputeUnitLimit(transactionMessage, config) {\n const { abortSignal, ...simulateConfig } = config ?? {};\n const replaceRecentBlockhash = !isTransactionMessageWithDurableNonceLifetime(transactionMessage);\n\n const transaction = pipe(\n transactionMessage,\n m => setTransactionMessageComputeUnitLimit(MAX_COMPUTE_UNIT_LIMIT, m),\n compileTransaction,\n );\n const wireTransactionBytes = getBase64EncodedWireTransaction(transaction);\n\n try {\n const response = await rpc\n .simulateTransaction(wireTransactionBytes, {\n ...simulateConfig,\n encoding: 'base64',\n replaceRecentBlockhash,\n sigVerify: false,\n })\n .send({ abortSignal });\n const { err: transactionError, ...simulationResult } = response.value as RpcSimulateTransactionResult;\n\n if (simulationResult.unitsConsumed == null) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT);\n }\n\n if (transactionError) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT, {\n ...simulationResult,\n cause: getSolanaErrorFromTransactionError(transactionError),\n });\n }\n\n // Downcast from bigint to number, capping at u32 max.\n return simulationResult.unitsConsumed > 4_294_967_295n\n ? 4_294_967_295\n : Number(simulationResult.unitsConsumed);\n } catch (e) {\n if (isSolanaError(e, SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT)) {\n throw e;\n }\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT, {\n cause: e,\n });\n }\n };\n}\n\n/**\n * Returns a function that estimates the compute unit limit for a transaction message and sets it on\n * the message. If the message already has an explicit compute unit limit set (one that is not the\n * provisory value of 0, and not the maximum of 1,400,000), the message is returned unchanged.\n *\n * This is designed to work with {@link fillTransactionMessageProvisoryComputeUnitLimit}: first add a provisory limit\n * during transaction construction, then later estimate and replace it before sending.\n *\n * @param estimateComputeUnitLimit - The estimator function, typically created by\n * {@link estimateComputeUnitLimitFactory}. You can also pass a custom wrapper that adds a buffer\n * (e.g. multiply the estimate by 1.1).\n * @return A function that accepts a transaction message and returns it with the compute unit limit\n * set to the estimated value.\n *\n * @example\n * ```ts\n * import { estimateAndSetComputeUnitLimitFactory, estimateComputeUnitLimitFactory } from '@solana/kit';\n *\n * const estimator = estimateComputeUnitLimitFactory({ rpc });\n * const estimateAndSet = estimateAndSetComputeUnitLimitFactory(estimator);\n * const updatedMessage = await estimateAndSet(transactionMessage);\n * ```\n */\nexport function estimateAndSetComputeUnitLimitFactory(\n estimateComputeUnitLimit: EstimateComputeUnitLimitFunction,\n): <TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer>(\n transactionMessage: TTransactionMessage,\n config?: EstimateComputeUnitLimitConfig,\n) => Promise<TTransactionMessage> {\n return async function estimateAndSetComputeUnitLimit(transactionMessage, config) {\n const existingLimit = getTransactionMessageComputeUnitLimit(transactionMessage);\n\n // If a non-provisory, non-max CU limit is already set, leave it as-is.\n if (existingLimit && existingLimit !== MAX_COMPUTE_UNIT_LIMIT) {\n return transactionMessage;\n }\n\n const estimatedUnits = await estimateComputeUnitLimit(transactionMessage, config);\n return setTransactionMessageComputeUnitLimit(estimatedUnits, transactionMessage);\n };\n}\n\n/**\n * Sets the compute unit limit to a provisory value of 0 if no compute unit limit is currently set\n * on the transaction message. If a limit is already set (any value, including 0), the message is\n * returned unchanged.\n *\n * This is useful during transaction construction to reserve space for a compute unit limit that\n * will later be replaced with an actual estimate via\n * {@link estimateAndSetComputeUnitLimitFactory}.\n *\n * @param transactionMessage - The transaction message to add a provisory limit to.\n * @return The transaction message with a provisory compute unit limit set, or unchanged if one was\n * already present.\n *\n * @example\n * ```ts\n * import { fillTransactionMessageProvisoryComputeUnitLimit } from '@solana/kit';\n *\n * const messageWithProvisoryLimit = fillTransactionMessageProvisoryComputeUnitLimit(transactionMessage);\n * ```\n */\nexport function fillTransactionMessageProvisoryComputeUnitLimit<TTransactionMessage extends TransactionMessage>(\n transactionMessage: TTransactionMessage,\n): TTransactionMessage {\n if (getTransactionMessageComputeUnitLimit(transactionMessage) !== undefined) {\n return transactionMessage;\n }\n return setTransactionMessageComputeUnitLimit(PROVISORY_COMPUTE_UNIT_LIMIT, transactionMessage);\n}\n","import {\n assertAccountsDecoded,\n assertAccountsExist,\n type FetchAccountsConfig,\n fetchJsonParsedAccounts,\n} from '@solana/accounts';\nimport type { Address } from '@solana/addresses';\nimport type { GetMultipleAccountsApi, Rpc } from '@solana/rpc';\nimport { type AddressesByLookupTableAddress } from '@solana/transaction-messages';\n\ntype FetchedAddressLookup = {\n addresses: Address[];\n};\n\n/**\n * Given a list of addresses belonging to address lookup tables, returns a map of lookup table\n * addresses to an ordered array of the addresses they contain.\n *\n * @param rpc An object that supports the {@link GetMultipleAccountsApi} of the Solana RPC API\n * @param config\n */\nexport async function fetchAddressesForLookupTables(\n lookupTableAddresses: Address[],\n rpc: Rpc<GetMultipleAccountsApi>,\n config?: FetchAccountsConfig,\n): Promise<AddressesByLookupTableAddress> {\n if (lookupTableAddresses.length === 0) {\n return {};\n }\n\n const fetchedLookupTables = await fetchJsonParsedAccounts<FetchedAddressLookup[]>(\n rpc,\n lookupTableAddresses,\n config,\n );\n\n assertAccountsDecoded(fetchedLookupTables);\n assertAccountsExist(fetchedLookupTables);\n\n return fetchedLookupTables.reduce<AddressesByLookupTableAddress>((acc, lookup) => {\n return {\n ...acc,\n [lookup.address]: lookup.data.addresses,\n };\n }, {});\n}\n","import { type FetchAccountsConfig } from '@solana/accounts';\nimport type { GetMultipleAccountsApi, Rpc } from '@solana/rpc';\nimport {\n CompiledTransactionMessage,\n CompiledTransactionMessageWithLifetime,\n decompileTransactionMessage,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n TransactionMessageWithLifetime,\n} from '@solana/transaction-messages';\n\nimport { fetchAddressesForLookupTables } from './fetch-lookup-tables';\n\ntype DecompileTransactionMessageFetchingLookupTablesConfig = FetchAccountsConfig & {\n lastValidBlockHeight?: bigint;\n};\n\n/**\n * Returns a {@link TransactionMessage} from a {@link CompiledTransactionMessage}. If any of the\n * accounts in the compiled message require an address lookup table to find their address, this\n * function will use the supplied RPC instance to fetch the contents of the address lookup table\n * from the network.\n *\n * @param rpc An object that supports the {@link GetMultipleAccountsApi} of the Solana RPC API\n * @param config\n */\nexport async function decompileTransactionMessageFetchingLookupTables(\n compiledTransactionMessage: CompiledTransactionMessage & CompiledTransactionMessageWithLifetime,\n rpc: Rpc<GetMultipleAccountsApi>,\n config?: DecompileTransactionMessageFetchingLookupTablesConfig,\n): Promise<TransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithLifetime> {\n const lookupTables =\n 'addressTableLookups' in compiledTransactionMessage &&\n compiledTransactionMessage.addressTableLookups !== undefined &&\n compiledTransactionMessage.addressTableLookups.length > 0\n ? compiledTransactionMessage.addressTableLookups\n : [];\n const lookupTableAddresses = lookupTables.map(l => l.lookupTableAddress);\n\n const { lastValidBlockHeight, ...fetchAccountsConfig } = config ?? {};\n const addressesByLookupTableAddress =\n lookupTableAddresses.length > 0\n ? await fetchAddressesForLookupTables(lookupTableAddresses, rpc, fetchAccountsConfig)\n : {};\n\n return decompileTransactionMessage(compiledTransactionMessage, {\n addressesByLookupTableAddress,\n lastValidBlockHeight,\n });\n}\n","import type { Lamports } from '@solana/rpc-types';\n\n/**\n * Calculates the minimum {@link Lamports | lamports} required to make an account rent exempt for a\n * given data size, without performing an RPC call.\n *\n * Values are sourced from the on-chain rent parameters in the Solana runtime:\n * https://github.com/anza-xyz/solana-sdk/blob/c07f692e41d757057c8700211a9300cdcd6d33b1/rent/src/lib.rs#L93-L97\n *\n * Note that this logic may change, or be incorrect depending on the cluster you are connected to.\n * You can always use the RPC method `getMinimumBalanceForRentExemption` to get the current value.\n *\n * @deprecated The minimum balance for an account is being actively reduced\n * (see {@link https://github.com/solana-foundation/solana-improvement-documents/pull/437 | SIMD-0437})\n * and is expected to become dynamic in future Solana upgrades\n * (see {@link https://github.com/solana-foundation/solana-improvement-documents/pull/194 | SIMD-0194}\n * and {@link https://github.com/solana-foundation/solana-improvement-documents/pull/389 | SIMD-0389}),\n * meaning a hardcoded local computation will no longer return accurate results. Use the\n * {@link GetMinimumBalanceForRentExemptionApi.getMinimumBalanceForRentExemption | getMinimumBalanceForRentExemption}\n * RPC method or a `ClientWithGetMinimumBalance` plugin instead. This function will be removed in v7.\n *\n * @param space The number of bytes of account data.\n */\nexport function getMinimumBalanceForRentExemption(space: bigint): Lamports {\n const RENT = {\n ACCOUNT_STORAGE_OVERHEAD: 128n,\n DEFAULT_EXEMPTION_THRESHOLD: 2n,\n DEFAULT_LAMPORTS_PER_BYTE_YEAR: 3_480n,\n } as const;\n const requiredLamports =\n (RENT.ACCOUNT_STORAGE_OVERHEAD + space) *\n RENT.DEFAULT_LAMPORTS_PER_BYTE_YEAR *\n RENT.DEFAULT_EXEMPTION_THRESHOLD;\n return requiredLamports as Lamports;\n}\n","import type { Signature } from '@solana/keys';\nimport type { Rpc, SendTransactionApi } from '@solana/rpc';\nimport { Commitment, commitmentComparator } from '@solana/rpc-types';\nimport {\n TransactionWithLastValidBlockHeight,\n waitForDurableNonceTransactionConfirmation,\n waitForRecentTransactionConfirmation,\n} from '@solana/transaction-confirmation';\nimport {\n getBase64EncodedWireTransaction,\n SendableTransaction,\n Transaction,\n TransactionWithDurableNonceLifetime,\n} from '@solana/transactions';\n\ninterface SendAndConfirmDurableNonceTransactionConfig\n extends SendTransactionBaseConfig, SendTransactionConfigWithoutEncoding {\n confirmDurableNonceTransaction: (\n config: Omit<\n Parameters<typeof waitForDurableNonceTransactionConfirmation>[0],\n 'getNonceInvalidationPromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) => Promise<void>;\n transaction: SendableTransaction & Transaction & TransactionWithDurableNonceLifetime;\n}\n\ninterface SendAndConfirmTransactionWithBlockhashLifetimeConfig\n extends SendTransactionBaseConfig, SendTransactionConfigWithoutEncoding {\n confirmRecentTransaction: (\n config: Omit<\n Parameters<typeof waitForRecentTransactionConfirmation>[0],\n 'getBlockHeightExceedencePromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) => Promise<void>;\n transaction: SendableTransaction & Transaction & TransactionWithLastValidBlockHeight;\n}\n\ninterface SendTransactionBaseConfig extends SendTransactionConfigWithoutEncoding {\n abortSignal?: AbortSignal;\n commitment: Commitment;\n rpc: Rpc<SendTransactionApi>;\n transaction: SendableTransaction & Transaction;\n}\n\ntype SendTransactionConfigWithoutEncoding = Omit<\n NonNullable<Parameters<SendTransactionApi['sendTransaction']>[1]>,\n 'encoding'\n>;\n\nfunction getSendTransactionConfigWithAdjustedPreflightCommitment(\n commitment: Commitment,\n config?: SendTransactionConfigWithoutEncoding,\n): SendTransactionConfigWithoutEncoding | void {\n if (\n // The developer has supplied no value for `preflightCommitment`.\n !config?.preflightCommitment &&\n // The value of `commitment` is lower than the server default of `preflightCommitment`.\n commitmentComparator(commitment, 'finalized' /* default value of `preflightCommitment` */) < 0\n ) {\n return {\n ...config,\n // In the common case, it is unlikely that you want to simulate a transaction at\n // `finalized` commitment when your standard of commitment for confirming the\n // transaction is lower. Cap the simulation commitment level to the level of the\n // confirmation commitment.\n preflightCommitment: commitment,\n };\n }\n // The commitment at which the developer wishes to confirm the transaction is at least as\n // high as the commitment at which they want to simulate it. Honour the config as-is.\n return config;\n}\n\nexport async function sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n rpc,\n transaction,\n ...sendTransactionConfig\n}: SendTransactionBaseConfig): Promise<Signature> {\n const base64EncodedWireTransaction = getBase64EncodedWireTransaction(transaction);\n return await rpc\n .sendTransaction(base64EncodedWireTransaction, {\n ...getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, sendTransactionConfig),\n encoding: 'base64',\n })\n .send({ abortSignal });\n}\n\nexport async function sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n confirmDurableNonceTransaction,\n rpc,\n transaction,\n ...sendTransactionConfig\n}: SendAndConfirmDurableNonceTransactionConfig): Promise<Signature> {\n const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...sendTransactionConfig,\n abortSignal,\n commitment,\n rpc,\n transaction,\n });\n await confirmDurableNonceTransaction({\n abortSignal,\n commitment,\n transaction,\n });\n return transactionSignature;\n}\n\nexport async function sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n confirmRecentTransaction,\n rpc,\n transaction,\n ...sendTransactionConfig\n}: SendAndConfirmTransactionWithBlockhashLifetimeConfig): Promise<Signature> {\n const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...sendTransactionConfig,\n abortSignal,\n commitment,\n rpc,\n transaction,\n });\n await confirmRecentTransaction({\n abortSignal,\n commitment,\n transaction,\n });\n return transactionSignature;\n}\n","import { getSolanaErrorFromTransactionError, isSolanaError, SOLANA_ERROR__INVALID_NONCE } from '@solana/errors';\nimport { Signature } from '@solana/keys';\nimport type { GetAccountInfoApi, GetSignatureStatusesApi, Rpc, SendTransactionApi } from '@solana/rpc';\nimport type { AccountNotificationsApi, RpcSubscriptions, SignatureNotificationsApi } from '@solana/rpc-subscriptions';\nimport { commitmentComparator } from '@solana/rpc-types';\nimport {\n createNonceInvalidationPromiseFactory,\n createRecentSignatureConfirmationPromiseFactory,\n waitForDurableNonceTransactionConfirmation,\n} from '@solana/transaction-confirmation';\nimport {\n getSignatureFromTransaction,\n SendableTransaction,\n Transaction,\n TransactionWithDurableNonceLifetime,\n} from '@solana/transactions';\n\nimport { sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT } from './send-transaction-internal';\n\ntype SendAndConfirmDurableNonceTransactionFunction = (\n transaction: SendableTransaction & Transaction & TransactionWithDurableNonceLifetime,\n config: Omit<\n Parameters<typeof sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT>[0],\n 'confirmDurableNonceTransaction' | 'rpc' | 'transaction'\n >,\n) => Promise<void>;\n\ntype SendAndConfirmDurableNonceTransactionFactoryConfig<TCluster> = {\n /** An object that supports the {@link GetSignatureStatusesApi} and the {@link SendTransactionApi} of the Solana RPC API */\n rpc: Rpc<GetAccountInfoApi & GetSignatureStatusesApi & SendTransactionApi> & { '~cluster'?: TCluster };\n /** An object that supports the {@link AccountNotificationsApi} and the {@link SignatureNotificationsApi} of the Solana RPC Subscriptions API */\n rpcSubscriptions: RpcSubscriptions<AccountNotificationsApi & SignatureNotificationsApi> & { '~cluster'?: TCluster };\n};\n\n/**\n * Returns a function that you can call to send a nonce-based transaction to the network and to wait\n * until it has been confirmed.\n *\n * @param config\n *\n * @example\n * ```ts\n * import {\n * isSolanaError,\n * sendAndConfirmDurableNonceTransactionFactory,\n * SOLANA_ERROR__INVALID_NONCE,\n * SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND,\n * } from '@solana/kit';\n *\n * const sendAndConfirmNonceTransaction = sendAndConfirmDurableNonceTransactionFactory({ rpc, rpcSubscriptions });\n *\n * try {\n * await sendAndConfirmNonceTransaction(transaction, { commitment: 'confirmed' });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND)) {\n * console.error(\n * 'The lifetime specified by this transaction refers to a nonce account ' +\n * `\\`${e.context.nonceAccountAddress}\\` that does not exist`,\n * );\n * } else if (isSolanaError(e, SOLANA_ERROR__INVALID_NONCE)) {\n * console.error('This transaction depends on a nonce that is no longer valid');\n * } else {\n * throw e;\n * }\n * }\n * ```\n */\nexport function sendAndConfirmDurableNonceTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig<'devnet'>): SendAndConfirmDurableNonceTransactionFunction;\nexport function sendAndConfirmDurableNonceTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig<'testnet'>): SendAndConfirmDurableNonceTransactionFunction;\nexport function sendAndConfirmDurableNonceTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig<'mainnet'>): SendAndConfirmDurableNonceTransactionFunction;\nexport function sendAndConfirmDurableNonceTransactionFactory<\n TCluster extends 'devnet' | 'mainnet' | 'testnet' | void = void,\n>({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig<TCluster>): SendAndConfirmDurableNonceTransactionFunction {\n const getNonceInvalidationPromise = createNonceInvalidationPromiseFactory({ rpc, rpcSubscriptions } as Parameters<\n typeof createNonceInvalidationPromiseFactory\n >[0]);\n const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters<typeof createRecentSignatureConfirmationPromiseFactory>[0]);\n\n /**\n * Creates a wrapped version of getNonceInvalidationPromise that handles the race condition\n * where the nonce account update notification arrives before the signature confirmation.\n *\n * When the nonce changes, we check if our transaction actually landed on-chain.\n * If it did, we don't throw - letting the signature confirmation promise continue.\n */\n function createNonceInvalidationPromiseHandlingRaceCondition(\n signature: Signature,\n ): typeof getNonceInvalidationPromise {\n return async function wrappedGetNonceInvalidationPromise(config) {\n try {\n return await getNonceInvalidationPromise(config);\n } catch (e) {\n // If nonce became invalid, check if our transaction actually landed\n if (isSolanaError(e, SOLANA_ERROR__INVALID_NONCE)) {\n let status;\n try {\n const { value: statuses } = await rpc\n .getSignatureStatuses([signature])\n .send({ abortSignal: config.abortSignal });\n status = statuses[0];\n } catch {\n // RPC failed - propagate the original nonce error\n throw e;\n }\n\n if (status === null || status === undefined) {\n // Transaction doesn't exist - nonce was truly invalid\n throw e;\n }\n\n // Check if status meets required commitment\n if (\n status.confirmationStatus !== null &&\n commitmentComparator(status.confirmationStatus, config.commitment) >= 0\n ) {\n // Transaction failed on-chain, throw the error from the transaction\n if (status.err !== null) {\n throw getSolanaErrorFromTransactionError(status.err);\n }\n // Transaction succeeded, resolve the promise successfully\n return;\n }\n\n // Commitment not met yet - return a never-resolving promise\n // This lets the signature confirmation promise continue\n return await new Promise(() => {});\n }\n throw e;\n }\n };\n }\n\n async function confirmDurableNonceTransaction(\n config: Omit<\n Parameters<typeof waitForDurableNonceTransactionConfirmation>[0],\n 'getNonceInvalidationPromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) {\n const wrappedGetNonceInvalidationPromise = createNonceInvalidationPromiseHandlingRaceCondition(\n getSignatureFromTransaction(config.transaction),\n );\n\n await waitForDurableNonceTransactionConfirmation({\n ...config,\n getNonceInvalidationPromise: wrappedGetNonceInvalidationPromise,\n getRecentSignatureConfirmationPromise,\n });\n }\n return async function sendAndConfirmDurableNonceTransaction(transaction, config) {\n await sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n confirmDurableNonceTransaction,\n rpc,\n transaction,\n });\n };\n}\n","import type { GetEpochInfoApi, GetSignatureStatusesApi, Rpc, SendTransactionApi } from '@solana/rpc';\nimport type { RpcSubscriptions, SignatureNotificationsApi, SlotNotificationsApi } from '@solana/rpc-subscriptions';\nimport {\n createBlockHeightExceedencePromiseFactory,\n createRecentSignatureConfirmationPromiseFactory,\n TransactionWithLastValidBlockHeight,\n waitForRecentTransactionConfirmation,\n} from '@solana/transaction-confirmation';\nimport { SendableTransaction, Transaction } from '@solana/transactions';\n\nimport { sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT } from './send-transaction-internal';\n\ntype SendAndConfirmTransactionWithBlockhashLifetimeFunction = (\n transaction: SendableTransaction & Transaction & TransactionWithLastValidBlockHeight,\n config: Omit<\n Parameters<typeof sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT>[0],\n 'confirmRecentTransaction' | 'rpc' | 'transaction'\n >,\n) => Promise<void>;\n\ntype SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<TCluster> = {\n /** An object that supports the {@link GetSignatureStatusesApi} and the {@link SendTransactionApi} of the Solana RPC API */\n rpc: Rpc<GetEpochInfoApi & GetSignatureStatusesApi & SendTransactionApi> & { '~cluster'?: TCluster };\n /** An object that supports the {@link SignatureNotificationsApi} and the {@link SlotNotificationsApi} of the Solana RPC Subscriptions API */\n rpcSubscriptions: RpcSubscriptions<SignatureNotificationsApi & SlotNotificationsApi> & { '~cluster'?: TCluster };\n};\n\n/**\n * Returns a function that you can call to send a blockhash-based transaction to the network and to\n * wait until it has been confirmed.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { isSolanaError, sendAndConfirmTransactionFactory, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED } from '@solana/kit';\n *\n * const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });\n *\n * try {\n * await sendAndConfirmTransaction(transaction, { commitment: 'confirmed' });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n * console.error('This transaction depends on a blockhash that has expired');\n * } else {\n * throw e;\n * }\n * }\n * ```\n */\nexport function sendAndConfirmTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<'devnet'>): SendAndConfirmTransactionWithBlockhashLifetimeFunction;\nexport function sendAndConfirmTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<'testnet'>): SendAndConfirmTransactionWithBlockhashLifetimeFunction;\nexport function sendAndConfirmTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<'mainnet'>): SendAndConfirmTransactionWithBlockhashLifetimeFunction;\nexport function sendAndConfirmTransactionFactory<TCluster extends 'devnet' | 'mainnet' | 'testnet' | void = void>({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<TCluster>): SendAndConfirmTransactionWithBlockhashLifetimeFunction {\n const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters<typeof createBlockHeightExceedencePromiseFactory>[0]);\n const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters<typeof createRecentSignatureConfirmationPromiseFactory>[0]);\n async function confirmRecentTransaction(\n config: Omit<\n Parameters<typeof waitForRecentTransactionConfirmation>[0],\n 'getBlockHeightExceedencePromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) {\n await waitForRecentTransactionConfirmation({\n ...config,\n getBlockHeightExceedencePromise,\n getRecentSignatureConfirmationPromise,\n });\n }\n return async function sendAndConfirmTransaction(transaction, config) {\n await sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n confirmRecentTransaction,\n rpc,\n transaction,\n });\n };\n}\n","import type { Rpc, SendTransactionApi } from '@solana/rpc';\nimport { SendableTransaction, Transaction } from '@solana/transactions';\n\nimport { sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT } from './send-transaction-internal';\n\ntype SendTransactionWithoutConfirmingFunction = (\n transaction: SendableTransaction & Transaction,\n config: Omit<Parameters<typeof sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT>[0], 'rpc' | 'transaction'>,\n) => Promise<void>;\n\ninterface SendTransactionWithoutConfirmingFactoryConfig {\n /** An object that supports the {@link SendTransactionApi} of the Solana RPC API */\n rpc: Rpc<SendTransactionApi>;\n}\n\n/**\n * Returns a function that you can call to send a transaction with any kind of lifetime to the\n * network without waiting for it to be confirmed.\n *\n * @param config\n *\n * @example\n * ```ts\n * import {\n * sendTransactionWithoutConfirmingFactory,\n * SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,\n * } from '@solana/kit';\n *\n * const sendTransaction = sendTransactionWithoutConfirmingFactory({ rpc });\n *\n * try {\n * await sendTransaction(transaction, { commitment: 'confirmed' });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE)) {\n * console.error('The transaction failed in simulation', e.cause);\n * } else {\n * throw e;\n * }\n * }\n * ```\n */\nexport function sendTransactionWithoutConfirmingFactory({\n rpc,\n}: SendTransactionWithoutConfirmingFactoryConfig): SendTransactionWithoutConfirmingFunction {\n return async function sendTransactionWithoutConfirming(transaction, config) {\n await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n rpc,\n transaction,\n });\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/create-async-generator-with-initial-value-and-slot-tracking.ts","../src/create-reactive-store-with-initial-value-and-slot-tracking.ts","../src/airdrop-internal.ts","../src/airdrop.ts","../src/compute-unit-limit-estimation.ts","../src/fetch-lookup-tables.ts","../src/decompile-transaction-message-fetching-lookup-tables.ts","../src/get-minimum-balance-for-rent-exemption.ts","../src/send-transaction-internal.ts","../src/send-and-confirm-durable-nonce-transaction.ts","../src/send-and-confirm-transaction.ts","../src/send-transaction-without-confirming.ts"],"names":["createRecentSignatureConfirmationPromiseFactory","waitForRecentTransactionConfirmationUntilTimeout","getTimeoutPromise","isTransactionMessageWithDurableNonceLifetime","pipe","setTransactionMessageComputeUnitLimit","compileTransaction","getBase64EncodedWireTransaction","SolanaError","SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT","SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT","getSolanaErrorFromTransactionError","isSolanaError","getTransactionMessageComputeUnitLimit","fetchJsonParsedAccounts","assertAccountsDecoded","assertAccountsExist","decompileTransactionMessage","commitmentComparator","createNonceInvalidationPromiseFactory","SOLANA_ERROR__INVALID_NONCE","getSignatureFromTransaction","waitForDurableNonceTransactionConfirmation","createBlockHeightExceedencePromiseFactory","waitForRecentTransactionConfirmation"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import type { PendingRpcRequest } from '@solana/rpc';\nimport type { PendingRpcSubscriptionsRequest } from '@solana/rpc-subscriptions';\nimport type { SolanaRpcResponse } from '@solana/rpc-types';\n\ntype CreateAsyncGeneratorWithInitialValueAndSlotTrackingConfig<TRpcValue, TSubscriptionValue, TItem> = Readonly<{\n /**\n * Triggering this abort signal will cancel the pending RPC request and subscription, and\n * cause the async generator to return (complete without error).\n */\n abortSignal: AbortSignal;\n /**\n * A pending RPC request whose response will be yielded as the generator's first value\n * (unless a subscription notification with a newer slot arrives first).\n * The response must be a {@link SolanaRpcResponse} so that its slot can be compared with\n * subscription notifications.\n */\n rpcRequest: PendingRpcRequest<SolanaRpcResponse<TRpcValue>>;\n /**\n * A pending RPC subscription request whose notifications will be yielded as they arrive.\n * Each notification must be a {@link SolanaRpcResponse} so that its slot can be compared\n * with the initial RPC response and other notifications.\n */\n rpcSubscriptionRequest: PendingRpcSubscriptionsRequest<SolanaRpcResponse<TSubscriptionValue>>;\n /**\n * Maps the value from a subscription notification to the item type yielded by the generator.\n */\n rpcSubscriptionValueMapper: (value: TSubscriptionValue) => TItem;\n /**\n * Maps the value from the RPC response to the item type yielded by the generator.\n */\n rpcValueMapper: (value: TRpcValue) => TItem;\n}>;\n\n/**\n * Creates an async generator that combines an initial RPC fetch with an ongoing subscription,\n * yielding values as they arrive from either source.\n *\n * The generator uses slot-based comparison to ensure that only the most recent values are yielded.\n * Any value at a slot older than a previously yielded value is silently dropped.\n * This prevents stale data from appearing when the RPC response and subscription notifications\n * arrive out of order.\n *\n * Things to note:\n *\n * - The generator yields {@link SolanaRpcResponse} values from both the RPC response and\n * subscription notifications, each containing the slot context and the mapped value.\n * - Out-of-order values (by slot) are silently dropped — they are never yielded.\n * - On error from either source, the generator throws the error.\n * - Triggering the caller's abort signal causes the generator to return (complete without error).\n * - The generator completes when the subscription ends, an error occurs, or the abort signal fires.\n *\n * @param config\n *\n * @example\n * ```ts\n * import {\n * address,\n * createAsyncGeneratorWithInitialValueAndSlotTracking,\n * createSolanaRpc,\n * createSolanaRpcSubscriptions,\n * } from '@solana/kit';\n *\n * const rpc = createSolanaRpc('http://127.0.0.1:8899');\n * const rpcSubscriptions = createSolanaRpcSubscriptions('ws://127.0.0.1:8900');\n * const myAddress = address('FnHyam9w4NZoWR6mKN1CuGBritdsEWZQa4Z4oawLZGxa');\n *\n * const abortController = new AbortController();\n * for await (const balance of createAsyncGeneratorWithInitialValueAndSlotTracking({\n * abortSignal: abortController.signal,\n * rpcRequest: rpc.getBalance(myAddress, { commitment: 'confirmed' }),\n * rpcValueMapper: lamports => lamports,\n * rpcSubscriptionRequest: rpcSubscriptions.accountNotifications(myAddress),\n * rpcSubscriptionValueMapper: ({ lamports }) => lamports,\n * })) {\n * console.log(`Balance at slot ${balance.context.slot}:`, balance.value);\n * }\n * ```\n */\nexport async function* createAsyncGeneratorWithInitialValueAndSlotTracking<TRpcValue, TSubscriptionValue, TItem>({\n abortSignal,\n rpcRequest,\n rpcValueMapper,\n rpcSubscriptionRequest,\n rpcSubscriptionValueMapper,\n}: CreateAsyncGeneratorWithInitialValueAndSlotTrackingConfig<TRpcValue, TSubscriptionValue, TItem>): AsyncGenerator<\n SolanaRpcResponse<TItem>\n> {\n if (abortSignal.aborted) return;\n\n let lastUpdateSlot = -1n;\n\n // Shared queue for merging values from the RPC response and subscription notifications.\n const queue: SolanaRpcResponse<TItem>[] = [];\n let waitingResolve: ((value: IteratorResult<SolanaRpcResponse<TItem>>) => void) | null = null;\n let waitingReject: ((reason: unknown) => void) | null = null;\n let rpcDone = false;\n let subscriptionDone = false;\n let done = false;\n let pendingError: unknown;\n\n function markSourcesDone() {\n done = true;\n if (waitingResolve) {\n const resolve = waitingResolve;\n waitingResolve = null;\n waitingReject = null;\n resolve({ done: true, value: undefined });\n }\n }\n\n const abortController = new AbortController();\n const signal = abortController.signal;\n\n function onAbort() {\n done = true;\n abortController.abort(abortSignal.reason);\n if (waitingResolve) {\n const resolve = waitingResolve;\n waitingResolve = null;\n waitingReject = null;\n resolve({ done: true, value: undefined });\n }\n }\n abortSignal.addEventListener('abort', onAbort);\n\n function enqueue(item: SolanaRpcResponse<TItem>) {\n if (done || signal.aborted) return;\n if (waitingResolve) {\n // generator is waiting for a value, so resolve immediately\n const resolve = waitingResolve;\n waitingResolve = null;\n waitingReject = null;\n resolve({ done: false, value: item });\n } else {\n // No pending generator pull, so enqueue the item for future delivery\n queue.push(item);\n }\n }\n\n function handleError(err: unknown) {\n if (signal.aborted) return;\n done = true;\n pendingError = err;\n abortController.abort(err);\n if (waitingReject) {\n // generator is waiting for a value, so reject immediately\n const reject = waitingReject;\n waitingResolve = null;\n waitingReject = null;\n reject(err);\n }\n }\n\n // Start both sources concurrently.\n rpcRequest\n .send({ abortSignal: signal })\n .then(({ context: { slot }, value }) => {\n if (signal.aborted) return;\n if (slot < lastUpdateSlot) return;\n lastUpdateSlot = slot;\n enqueue({ context: { slot }, value: rpcValueMapper(value) });\n })\n .then(() => {\n rpcDone = true;\n if (subscriptionDone) markSourcesDone();\n })\n .catch(handleError);\n\n rpcSubscriptionRequest\n .subscribe({ abortSignal: signal })\n .then(async notifications => {\n for await (const {\n context: { slot },\n value,\n } of notifications) {\n if (signal.aborted) return;\n if (slot < lastUpdateSlot) continue;\n lastUpdateSlot = slot;\n enqueue({ context: { slot }, value: rpcSubscriptionValueMapper(value) });\n }\n // Subscription completed normally.\n subscriptionDone = true;\n if (rpcDone) markSourcesDone();\n })\n .catch(handleError);\n\n try {\n while (true) {\n if (pendingError) throw pendingError;\n if (queue.length > 0) {\n yield queue.shift()!;\n } else if (done) {\n return;\n } else {\n // if no value queued or error, wait for the next value or error\n const result: IteratorResult<SolanaRpcResponse<TItem>> = await new Promise((resolve, reject) => {\n waitingResolve = resolve;\n waitingReject = reject;\n });\n if (result.done) return;\n yield result.value;\n }\n }\n } finally {\n abortSignal.removeEventListener('abort', onAbort);\n if (!signal.aborted) {\n abortController.abort();\n }\n }\n}\n","import type { PendingRpcRequest } from '@solana/rpc';\nimport type { PendingRpcSubscriptionsRequest } from '@solana/rpc-subscriptions';\nimport type { SolanaRpcResponse } from '@solana/rpc-types';\nimport type { ReactiveStore } from '@solana/subscribable';\n\ntype CreateReactiveStoreWithInitialValueAndSlotTrackingConfig<TRpcValue, TSubscriptionValue, TItem> = Readonly<{\n /**\n * Triggering this abort signal will cancel the pending RPC request and subscription, and\n * disconnect the store from further updates.\n */\n abortSignal: AbortSignal;\n /**\n * A pending RPC request whose response will be used to set the store's initial state.\n * The response must be a {@link SolanaRpcResponse} so that its slot can be compared with\n * subscription notifications.\n */\n rpcRequest: PendingRpcRequest<SolanaRpcResponse<TRpcValue>>;\n /**\n * A pending RPC subscription request whose notifications will be used to keep the store\n * up to date. Each notification must be a {@link SolanaRpcResponse} so that its slot can be\n * compared with the initial RPC response and other notifications.\n */\n rpcSubscriptionRequest: PendingRpcSubscriptionsRequest<SolanaRpcResponse<TSubscriptionValue>>;\n /**\n * Maps the value from a subscription notification to the item type stored in the reactive store.\n */\n rpcSubscriptionValueMapper: (value: TSubscriptionValue) => TItem;\n /**\n * Maps the value from the RPC response to the item type stored in the reactive store.\n */\n rpcValueMapper: (value: TRpcValue) => TItem;\n}>;\n\n/**\n * Creates a {@link ReactiveStore} that combines an initial RPC fetch with an ongoing subscription\n * to keep its state up to date.\n *\n * The store uses slot-based comparison to ensure that only the most recent value is kept,\n * regardless of whether it came from the initial RPC response or a subscription notification.\n * This prevents stale data from overwriting newer data when the RPC response and subscription\n * notifications arrive out of order.\n *\n * Things to note:\n *\n * - `getState()` returns `undefined` until the first response or notification arrives. Once\n * data arrives, it returns a {@link SolanaRpcResponse} containing the value and the slot\n * context at which it was observed.\n * - On error from either source, `getState()` continues to return the last known value and\n * `getError()` returns the error. Only the first error is captured.\n * - When an error occurs, the abort signal is triggered, cancelling both the RPC request and\n * the subscription.\n * - Triggering the caller's abort signal disconnects the store from both sources.\n *\n * @param config\n *\n * @example\n * ```ts\n * import {\n * address,\n * createReactiveStoreWithInitialValueAndSlotTracking,\n * createSolanaRpc,\n * createSolanaRpcSubscriptions,\n * } from '@solana/kit';\n *\n * const rpc = createSolanaRpc('http://127.0.0.1:8899');\n * const rpcSubscriptions = createSolanaRpcSubscriptions('ws://127.0.0.1:8900');\n * const myAddress = address('FnHyam9w4NZoWR6mKN1CuGBritdsEWZQa4Z4oawLZGxa');\n *\n * const balanceStore = createReactiveStoreWithInitialValueAndSlotTracking({\n * abortSignal: AbortSignal.timeout(60_000),\n * rpcRequest: rpc.getBalance(myAddress, { commitment: 'confirmed' }),\n * rpcValueMapper: lamports => lamports,\n * rpcSubscriptionRequest: rpcSubscriptions.accountNotifications(myAddress),\n * rpcSubscriptionValueMapper: ({ lamports }) => lamports,\n * });\n *\n * const unsubscribe = balanceStore.subscribe(() => {\n * const error = balanceStore.getError();\n * if (error) console.error('Error:', error);\n * else {\n * const state = balanceStore.getState();\n * if (state) console.log(`Balance at slot ${state.context.slot}:`, state.value);\n * }\n * });\n * ```\n *\n * @see {@link ReactiveStore}\n */\nexport function createReactiveStoreWithInitialValueAndSlotTracking<TRpcValue, TSubscriptionValue, TItem>({\n abortSignal,\n rpcRequest,\n rpcValueMapper,\n rpcSubscriptionRequest,\n rpcSubscriptionValueMapper,\n}: CreateReactiveStoreWithInitialValueAndSlotTrackingConfig<TRpcValue, TSubscriptionValue, TItem>): ReactiveStore<\n SolanaRpcResponse<TItem>\n> {\n let currentState: SolanaRpcResponse<TItem> | undefined;\n let currentError: unknown;\n let lastUpdateSlot = -1n;\n const subscribers = new Set<() => void>();\n\n const abortController = new AbortController();\n abortSignal.addEventListener('abort', () => abortController.abort(abortSignal.reason));\n const signal = abortController.signal;\n\n function notifySubscribers() {\n subscribers.forEach(cb => cb());\n }\n\n function handleError(err: unknown) {\n // Ignore if the signal has already been aborted\n if (signal.aborted) return;\n // Only capture the first error\n if (currentError !== undefined) return;\n currentError = err;\n abortController.abort(err);\n notifySubscribers();\n }\n\n rpcRequest\n .send({ abortSignal: signal })\n .then(({ context: { slot }, value }) => {\n if (signal.aborted) return;\n if (slot < lastUpdateSlot) return;\n lastUpdateSlot = slot;\n currentState = { context: { slot }, value: rpcValueMapper(value) };\n notifySubscribers();\n })\n .catch(handleError);\n\n rpcSubscriptionRequest\n .subscribe({ abortSignal: signal })\n .then(async notifications => {\n for await (const {\n context: { slot },\n value,\n } of notifications) {\n if (signal.aborted) return;\n if (slot < lastUpdateSlot) continue;\n lastUpdateSlot = slot;\n currentState = {\n context: { slot },\n value: rpcSubscriptionValueMapper(value),\n };\n notifySubscribers();\n }\n })\n .catch(handleError);\n\n return {\n getError(): unknown {\n return currentError;\n },\n getState(): SolanaRpcResponse<TItem> | undefined {\n return currentState;\n },\n subscribe(callback: () => void): () => void {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n },\n };\n}\n","import type { Address } from '@solana/addresses';\nimport type { Signature } from '@solana/keys';\nimport type { RequestAirdropApi, Rpc } from '@solana/rpc';\nimport type { Commitment, Lamports } from '@solana/rpc-types';\nimport { waitForRecentTransactionConfirmationUntilTimeout } from '@solana/transaction-confirmation';\n\ntype RequestAndConfirmAirdropConfig = Readonly<{\n abortSignal?: AbortSignal;\n commitment: Commitment;\n confirmSignatureOnlyTransaction: (\n config: Omit<\n Parameters<typeof waitForRecentTransactionConfirmationUntilTimeout>[0],\n 'getRecentSignatureConfirmationPromise' | 'getTimeoutPromise'\n >,\n ) => Promise<void>;\n lamports: Lamports;\n recipientAddress: Address;\n rpc: Rpc<RequestAirdropApi>;\n}>;\n\nexport async function requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n confirmSignatureOnlyTransaction,\n lamports,\n recipientAddress,\n rpc,\n}: RequestAndConfirmAirdropConfig): Promise<Signature> {\n const airdropTransactionSignature = await rpc\n .requestAirdrop(recipientAddress, lamports, { commitment })\n .send({ abortSignal });\n await confirmSignatureOnlyTransaction({\n abortSignal,\n commitment,\n signature: airdropTransactionSignature,\n });\n return airdropTransactionSignature;\n}\n","import type { Signature } from '@solana/keys';\nimport type { GetSignatureStatusesApi, RequestAirdropApi, Rpc } from '@solana/rpc';\nimport type { RpcSubscriptions, SignatureNotificationsApi } from '@solana/rpc-subscriptions';\nimport {\n createRecentSignatureConfirmationPromiseFactory,\n getTimeoutPromise,\n waitForRecentTransactionConfirmationUntilTimeout,\n} from '@solana/transaction-confirmation';\n\nimport { requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT } from './airdrop-internal';\n\ntype AirdropFunction = (\n config: Omit<\n Parameters<typeof requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT>[0],\n 'confirmSignatureOnlyTransaction' | 'rpc'\n >,\n) => Promise<Signature>;\n\ntype AirdropFactoryConfig<TCluster> = {\n /** An object that supports the {@link GetSignatureStatusesApi} and the {@link RequestAirdropApi} of the Solana RPC API */\n rpc: Rpc<GetSignatureStatusesApi & RequestAirdropApi> & { '~cluster'?: TCluster };\n /** An object that supports the {@link SignatureNotificationsApi} of the Solana RPC Subscriptions API */\n rpcSubscriptions: RpcSubscriptions<SignatureNotificationsApi> & { '~cluster'?: TCluster };\n};\n\n/**\n * Returns a function that you can call to airdrop a certain amount of {@link Lamports} to a Solana\n * address.\n *\n * > [!NOTE] This only works on test clusters.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { address, airdropFactory, createSolanaRpc, createSolanaRpcSubscriptions, devnet, lamports } from '@solana/kit';\n *\n * const rpc = createSolanaRpc(devnet('http://127.0.0.1:8899'));\n * const rpcSubscriptions = createSolanaRpcSubscriptions(devnet('ws://127.0.0.1:8900'));\n *\n * const airdrop = airdropFactory({ rpc, rpcSubscriptions });\n *\n * await airdrop({\n * commitment: 'confirmed',\n * recipientAddress: address('FnHyam9w4NZoWR6mKN1CuGBritdsEWZQa4Z4oawLZGxa'),\n * lamports: lamports(10_000_000n),\n * });\n * ```\n */\nexport function airdropFactory({ rpc, rpcSubscriptions }: AirdropFactoryConfig<'devnet'>): AirdropFunction;\nexport function airdropFactory({ rpc, rpcSubscriptions }: AirdropFactoryConfig<'mainnet'>): AirdropFunction;\nexport function airdropFactory({ rpc, rpcSubscriptions }: AirdropFactoryConfig<'testnet'>): AirdropFunction;\nexport function airdropFactory<TCluster extends 'devnet' | 'mainnet' | 'testnet' | void = void>({\n rpc,\n rpcSubscriptions,\n}: AirdropFactoryConfig<TCluster>): AirdropFunction {\n const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters<typeof createRecentSignatureConfirmationPromiseFactory>[0]);\n async function confirmSignatureOnlyTransaction(\n config: Omit<\n Parameters<typeof waitForRecentTransactionConfirmationUntilTimeout>[0],\n 'getRecentSignatureConfirmationPromise' | 'getTimeoutPromise'\n >,\n ) {\n await waitForRecentTransactionConfirmationUntilTimeout({\n ...config,\n getRecentSignatureConfirmationPromise,\n getTimeoutPromise,\n });\n }\n return async function airdrop(config) {\n return await requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n confirmSignatureOnlyTransaction,\n rpc,\n });\n };\n}\n","import {\n getSolanaErrorFromTransactionError,\n isSolanaError,\n type RpcSimulateTransactionResult,\n SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT,\n SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT,\n SolanaError,\n} from '@solana/errors';\nimport { pipe } from '@solana/functional';\nimport type { Rpc, SimulateTransactionApi } from '@solana/rpc';\nimport type { Commitment, Slot } from '@solana/rpc-types';\nimport {\n getTransactionMessageComputeUnitLimit,\n isTransactionMessageWithDurableNonceLifetime,\n setTransactionMessageComputeUnitLimit,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n} from '@solana/transaction-messages';\nimport { compileTransaction, getBase64EncodedWireTransaction } from '@solana/transactions';\n\nconst PROVISORY_COMPUTE_UNIT_LIMIT = 0;\nconst MAX_COMPUTE_UNIT_LIMIT = 1_400_000;\n\ntype EstimateComputeUnitLimitFactoryConfig = Readonly<{\n rpc: Rpc<SimulateTransactionApi>;\n}>;\n\ntype EstimateComputeUnitLimitConfig = Readonly<{\n abortSignal?: AbortSignal;\n commitment?: Commitment;\n minContextSlot?: Slot;\n}>;\n\ntype EstimateComputeUnitLimitFunction = (\n transactionMessage: TransactionMessage & TransactionMessageWithFeePayer,\n config?: EstimateComputeUnitLimitConfig,\n) => Promise<number>;\n\n/**\n * Returns a function that estimates the compute units consumed by a transaction message by\n * simulating it.\n *\n * The estimator sets the compute unit limit to the maximum (1,400,000) before simulating, so the\n * simulation does not fail due to compute unit exhaustion. For blockhash-lifetime transactions, the\n * RPC is asked to replace the blockhash during simulation, so any blockhash value will work. For\n * durable nonce transactions, the actual nonce value is used.\n *\n * @param factoryConfig - An object containing the RPC instance to use for simulation.\n * @return A function that accepts a transaction message and returns the estimated compute units.\n *\n * @example\n * ```ts\n * import { estimateComputeUnitLimitFactory } from '@solana/kit';\n *\n * const estimateComputeUnitLimit = estimateComputeUnitLimitFactory({ rpc });\n * const estimatedUnits = await estimateComputeUnitLimit(transactionMessage);\n * ```\n */\nexport function estimateComputeUnitLimitFactory({\n rpc,\n}: EstimateComputeUnitLimitFactoryConfig): EstimateComputeUnitLimitFunction {\n return async function estimateComputeUnitLimit(transactionMessage, config) {\n const { abortSignal, ...simulateConfig } = config ?? {};\n const replaceRecentBlockhash = !isTransactionMessageWithDurableNonceLifetime(transactionMessage);\n\n const transaction = pipe(\n transactionMessage,\n m => setTransactionMessageComputeUnitLimit(MAX_COMPUTE_UNIT_LIMIT, m),\n compileTransaction,\n );\n const wireTransactionBytes = getBase64EncodedWireTransaction(transaction);\n\n try {\n const response = await rpc\n .simulateTransaction(wireTransactionBytes, {\n ...simulateConfig,\n encoding: 'base64',\n replaceRecentBlockhash,\n sigVerify: false,\n })\n .send({ abortSignal });\n // The API response type varies based on config (eg. `replacementBlockhash` is only\n // present when `replaceRecentBlockhash` is true), but `RpcSimulateTransactionResult`\n // is a flat superset. Cast through `unknown` to bridge the structural gap.\n const { err: transactionError, ...simulationResult } =\n response.value as unknown as RpcSimulateTransactionResult;\n\n if (simulationResult.unitsConsumed == null) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT);\n }\n\n if (transactionError) {\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT, {\n ...simulationResult,\n cause: getSolanaErrorFromTransactionError(transactionError),\n });\n }\n\n // Downcast from bigint to number, capping at u32 max.\n return simulationResult.unitsConsumed > 4_294_967_295n\n ? 4_294_967_295\n : Number(simulationResult.unitsConsumed);\n } catch (e) {\n if (isSolanaError(e, SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT)) {\n throw e;\n }\n throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT, {\n cause: e,\n });\n }\n };\n}\n\n/**\n * Returns a function that estimates the compute unit limit for a transaction message and sets it on\n * the message. If the message already has an explicit compute unit limit set (one that is not the\n * provisory value of 0, and not the maximum of 1,400,000), the message is returned unchanged.\n *\n * This is designed to work with {@link fillTransactionMessageProvisoryComputeUnitLimit}: first add a provisory limit\n * during transaction construction, then later estimate and replace it before sending.\n *\n * @param estimateComputeUnitLimit - The estimator function, typically created by\n * {@link estimateComputeUnitLimitFactory}. You can also pass a custom wrapper that adds a buffer\n * (e.g. multiply the estimate by 1.1).\n * @return A function that accepts a transaction message and returns it with the compute unit limit\n * set to the estimated value.\n *\n * @example\n * ```ts\n * import { estimateAndSetComputeUnitLimitFactory, estimateComputeUnitLimitFactory } from '@solana/kit';\n *\n * const estimator = estimateComputeUnitLimitFactory({ rpc });\n * const estimateAndSet = estimateAndSetComputeUnitLimitFactory(estimator);\n * const updatedMessage = await estimateAndSet(transactionMessage);\n * ```\n */\nexport function estimateAndSetComputeUnitLimitFactory(\n estimateComputeUnitLimit: EstimateComputeUnitLimitFunction,\n): <TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer>(\n transactionMessage: TTransactionMessage,\n config?: EstimateComputeUnitLimitConfig,\n) => Promise<TTransactionMessage> {\n return async function estimateAndSetComputeUnitLimit(transactionMessage, config) {\n const existingLimit = getTransactionMessageComputeUnitLimit(transactionMessage);\n\n // If a non-provisory, non-max CU limit is already set, leave it as-is.\n if (existingLimit && existingLimit !== MAX_COMPUTE_UNIT_LIMIT) {\n return transactionMessage;\n }\n\n const estimatedUnits = await estimateComputeUnitLimit(transactionMessage, config);\n return setTransactionMessageComputeUnitLimit(estimatedUnits, transactionMessage);\n };\n}\n\n/**\n * Sets the compute unit limit to a provisory value of 0 if no compute unit limit is currently set\n * on the transaction message. If a limit is already set (any value, including 0), the message is\n * returned unchanged.\n *\n * This is useful during transaction construction to reserve space for a compute unit limit that\n * will later be replaced with an actual estimate via\n * {@link estimateAndSetComputeUnitLimitFactory}.\n *\n * @param transactionMessage - The transaction message to add a provisory limit to.\n * @return The transaction message with a provisory compute unit limit set, or unchanged if one was\n * already present.\n *\n * @example\n * ```ts\n * import { fillTransactionMessageProvisoryComputeUnitLimit } from '@solana/kit';\n *\n * const messageWithProvisoryLimit = fillTransactionMessageProvisoryComputeUnitLimit(transactionMessage);\n * ```\n */\nexport function fillTransactionMessageProvisoryComputeUnitLimit<TTransactionMessage extends TransactionMessage>(\n transactionMessage: TTransactionMessage,\n): TTransactionMessage {\n if (getTransactionMessageComputeUnitLimit(transactionMessage) !== undefined) {\n return transactionMessage;\n }\n return setTransactionMessageComputeUnitLimit(PROVISORY_COMPUTE_UNIT_LIMIT, transactionMessage);\n}\n","import {\n assertAccountsDecoded,\n assertAccountsExist,\n type FetchAccountsConfig,\n fetchJsonParsedAccounts,\n} from '@solana/accounts';\nimport type { Address } from '@solana/addresses';\nimport type { GetMultipleAccountsApi, Rpc } from '@solana/rpc';\nimport { type AddressesByLookupTableAddress } from '@solana/transaction-messages';\n\ntype FetchedAddressLookup = {\n addresses: Address[];\n};\n\n/**\n * Given a list of addresses belonging to address lookup tables, returns a map of lookup table\n * addresses to an ordered array of the addresses they contain.\n *\n * @param rpc An object that supports the {@link GetMultipleAccountsApi} of the Solana RPC API\n * @param config\n */\nexport async function fetchAddressesForLookupTables(\n lookupTableAddresses: Address[],\n rpc: Rpc<GetMultipleAccountsApi>,\n config?: FetchAccountsConfig,\n): Promise<AddressesByLookupTableAddress> {\n if (lookupTableAddresses.length === 0) {\n return {};\n }\n\n const fetchedLookupTables = await fetchJsonParsedAccounts<FetchedAddressLookup[]>(\n rpc,\n lookupTableAddresses,\n config,\n );\n\n assertAccountsDecoded(fetchedLookupTables);\n assertAccountsExist(fetchedLookupTables);\n\n return fetchedLookupTables.reduce<AddressesByLookupTableAddress>((acc, lookup) => {\n return {\n ...acc,\n [lookup.address]: lookup.data.addresses,\n };\n }, {});\n}\n","import { type FetchAccountsConfig } from '@solana/accounts';\nimport type { GetMultipleAccountsApi, Rpc } from '@solana/rpc';\nimport {\n CompiledTransactionMessage,\n CompiledTransactionMessageWithLifetime,\n decompileTransactionMessage,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n TransactionMessageWithLifetime,\n} from '@solana/transaction-messages';\n\nimport { fetchAddressesForLookupTables } from './fetch-lookup-tables';\n\ntype DecompileTransactionMessageFetchingLookupTablesConfig = FetchAccountsConfig & {\n lastValidBlockHeight?: bigint;\n};\n\n/**\n * Returns a {@link TransactionMessage} from a {@link CompiledTransactionMessage}. If any of the\n * accounts in the compiled message require an address lookup table to find their address, this\n * function will use the supplied RPC instance to fetch the contents of the address lookup table\n * from the network.\n *\n * @param rpc An object that supports the {@link GetMultipleAccountsApi} of the Solana RPC API\n * @param config\n */\nexport async function decompileTransactionMessageFetchingLookupTables(\n compiledTransactionMessage: CompiledTransactionMessage & CompiledTransactionMessageWithLifetime,\n rpc: Rpc<GetMultipleAccountsApi>,\n config?: DecompileTransactionMessageFetchingLookupTablesConfig,\n): Promise<TransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithLifetime> {\n const lookupTables =\n 'addressTableLookups' in compiledTransactionMessage &&\n compiledTransactionMessage.addressTableLookups !== undefined &&\n compiledTransactionMessage.addressTableLookups.length > 0\n ? compiledTransactionMessage.addressTableLookups\n : [];\n const lookupTableAddresses = lookupTables.map(l => l.lookupTableAddress);\n\n const { lastValidBlockHeight, ...fetchAccountsConfig } = config ?? {};\n const addressesByLookupTableAddress =\n lookupTableAddresses.length > 0\n ? await fetchAddressesForLookupTables(lookupTableAddresses, rpc, fetchAccountsConfig)\n : {};\n\n return decompileTransactionMessage(compiledTransactionMessage, {\n addressesByLookupTableAddress,\n lastValidBlockHeight,\n });\n}\n","import type { Lamports } from '@solana/rpc-types';\n\n/**\n * Calculates the minimum {@link Lamports | lamports} required to make an account rent exempt for a\n * given data size, without performing an RPC call.\n *\n * Values are sourced from the on-chain rent parameters in the Solana runtime:\n * https://github.com/anza-xyz/solana-sdk/blob/c07f692e41d757057c8700211a9300cdcd6d33b1/rent/src/lib.rs#L93-L97\n *\n * Note that this logic may change, or be incorrect depending on the cluster you are connected to.\n * You can always use the RPC method `getMinimumBalanceForRentExemption` to get the current value.\n *\n * @deprecated The minimum balance for an account is being actively reduced\n * (see {@link https://github.com/solana-foundation/solana-improvement-documents/pull/437 | SIMD-0437})\n * and is expected to become dynamic in future Solana upgrades\n * (see {@link https://github.com/solana-foundation/solana-improvement-documents/pull/194 | SIMD-0194}\n * and {@link https://github.com/solana-foundation/solana-improvement-documents/pull/389 | SIMD-0389}),\n * meaning a hardcoded local computation will no longer return accurate results. Use the\n * {@link GetMinimumBalanceForRentExemptionApi.getMinimumBalanceForRentExemption | getMinimumBalanceForRentExemption}\n * RPC method or a `ClientWithGetMinimumBalance` plugin instead. This function will be removed in v7.\n *\n * @param space The number of bytes of account data.\n */\nexport function getMinimumBalanceForRentExemption(space: bigint): Lamports {\n const RENT = {\n ACCOUNT_STORAGE_OVERHEAD: 128n,\n DEFAULT_EXEMPTION_THRESHOLD: 2n,\n DEFAULT_LAMPORTS_PER_BYTE_YEAR: 3_480n,\n } as const;\n const requiredLamports =\n (RENT.ACCOUNT_STORAGE_OVERHEAD + space) *\n RENT.DEFAULT_LAMPORTS_PER_BYTE_YEAR *\n RENT.DEFAULT_EXEMPTION_THRESHOLD;\n return requiredLamports as Lamports;\n}\n","import type { Signature } from '@solana/keys';\nimport type { Rpc, SendTransactionApi } from '@solana/rpc';\nimport { Commitment, commitmentComparator } from '@solana/rpc-types';\nimport {\n TransactionWithLastValidBlockHeight,\n waitForDurableNonceTransactionConfirmation,\n waitForRecentTransactionConfirmation,\n} from '@solana/transaction-confirmation';\nimport {\n getBase64EncodedWireTransaction,\n SendableTransaction,\n Transaction,\n TransactionWithDurableNonceLifetime,\n} from '@solana/transactions';\n\ninterface SendAndConfirmDurableNonceTransactionConfig\n extends SendTransactionBaseConfig, SendTransactionConfigWithoutEncoding {\n confirmDurableNonceTransaction: (\n config: Omit<\n Parameters<typeof waitForDurableNonceTransactionConfirmation>[0],\n 'getNonceInvalidationPromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) => Promise<void>;\n transaction: SendableTransaction & Transaction & TransactionWithDurableNonceLifetime;\n}\n\ninterface SendAndConfirmTransactionWithBlockhashLifetimeConfig\n extends SendTransactionBaseConfig, SendTransactionConfigWithoutEncoding {\n confirmRecentTransaction: (\n config: Omit<\n Parameters<typeof waitForRecentTransactionConfirmation>[0],\n 'getBlockHeightExceedencePromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) => Promise<void>;\n transaction: SendableTransaction & Transaction & TransactionWithLastValidBlockHeight;\n}\n\ninterface SendTransactionBaseConfig extends SendTransactionConfigWithoutEncoding {\n abortSignal?: AbortSignal;\n commitment: Commitment;\n rpc: Rpc<SendTransactionApi>;\n transaction: SendableTransaction & Transaction;\n}\n\ntype SendTransactionConfigWithoutEncoding = Omit<\n NonNullable<Parameters<SendTransactionApi['sendTransaction']>[1]>,\n 'encoding'\n>;\n\nfunction getSendTransactionConfigWithAdjustedPreflightCommitment(\n commitment: Commitment,\n config?: SendTransactionConfigWithoutEncoding,\n): SendTransactionConfigWithoutEncoding | void {\n if (\n // The developer has supplied no value for `preflightCommitment`.\n !config?.preflightCommitment &&\n // The value of `commitment` is lower than the server default of `preflightCommitment`.\n commitmentComparator(commitment, 'finalized' /* default value of `preflightCommitment` */) < 0\n ) {\n return {\n ...config,\n // In the common case, it is unlikely that you want to simulate a transaction at\n // `finalized` commitment when your standard of commitment for confirming the\n // transaction is lower. Cap the simulation commitment level to the level of the\n // confirmation commitment.\n preflightCommitment: commitment,\n };\n }\n // The commitment at which the developer wishes to confirm the transaction is at least as\n // high as the commitment at which they want to simulate it. Honour the config as-is.\n return config;\n}\n\nexport async function sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n rpc,\n transaction,\n ...sendTransactionConfig\n}: SendTransactionBaseConfig): Promise<Signature> {\n const base64EncodedWireTransaction = getBase64EncodedWireTransaction(transaction);\n return await rpc\n .sendTransaction(base64EncodedWireTransaction, {\n ...getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, sendTransactionConfig),\n encoding: 'base64',\n })\n .send({ abortSignal });\n}\n\nexport async function sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n confirmDurableNonceTransaction,\n rpc,\n transaction,\n ...sendTransactionConfig\n}: SendAndConfirmDurableNonceTransactionConfig): Promise<Signature> {\n const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...sendTransactionConfig,\n abortSignal,\n commitment,\n rpc,\n transaction,\n });\n await confirmDurableNonceTransaction({\n abortSignal,\n commitment,\n transaction,\n });\n return transactionSignature;\n}\n\nexport async function sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({\n abortSignal,\n commitment,\n confirmRecentTransaction,\n rpc,\n transaction,\n ...sendTransactionConfig\n}: SendAndConfirmTransactionWithBlockhashLifetimeConfig): Promise<Signature> {\n const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...sendTransactionConfig,\n abortSignal,\n commitment,\n rpc,\n transaction,\n });\n await confirmRecentTransaction({\n abortSignal,\n commitment,\n transaction,\n });\n return transactionSignature;\n}\n","import { getSolanaErrorFromTransactionError, isSolanaError, SOLANA_ERROR__INVALID_NONCE } from '@solana/errors';\nimport { Signature } from '@solana/keys';\nimport type { GetAccountInfoApi, GetSignatureStatusesApi, Rpc, SendTransactionApi } from '@solana/rpc';\nimport type { AccountNotificationsApi, RpcSubscriptions, SignatureNotificationsApi } from '@solana/rpc-subscriptions';\nimport { commitmentComparator } from '@solana/rpc-types';\nimport {\n createNonceInvalidationPromiseFactory,\n createRecentSignatureConfirmationPromiseFactory,\n waitForDurableNonceTransactionConfirmation,\n} from '@solana/transaction-confirmation';\nimport {\n getSignatureFromTransaction,\n SendableTransaction,\n Transaction,\n TransactionWithDurableNonceLifetime,\n} from '@solana/transactions';\n\nimport { sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT } from './send-transaction-internal';\n\ntype SendAndConfirmDurableNonceTransactionFunction = (\n transaction: SendableTransaction & Transaction & TransactionWithDurableNonceLifetime,\n config: Omit<\n Parameters<typeof sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT>[0],\n 'confirmDurableNonceTransaction' | 'rpc' | 'transaction'\n >,\n) => Promise<void>;\n\ntype SendAndConfirmDurableNonceTransactionFactoryConfig<TCluster> = {\n /** An object that supports the {@link GetSignatureStatusesApi} and the {@link SendTransactionApi} of the Solana RPC API */\n rpc: Rpc<GetAccountInfoApi & GetSignatureStatusesApi & SendTransactionApi> & { '~cluster'?: TCluster };\n /** An object that supports the {@link AccountNotificationsApi} and the {@link SignatureNotificationsApi} of the Solana RPC Subscriptions API */\n rpcSubscriptions: RpcSubscriptions<AccountNotificationsApi & SignatureNotificationsApi> & { '~cluster'?: TCluster };\n};\n\n/**\n * Returns a function that you can call to send a nonce-based transaction to the network and to wait\n * until it has been confirmed.\n *\n * @param config\n *\n * @example\n * ```ts\n * import {\n * isSolanaError,\n * sendAndConfirmDurableNonceTransactionFactory,\n * SOLANA_ERROR__INVALID_NONCE,\n * SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND,\n * } from '@solana/kit';\n *\n * const sendAndConfirmNonceTransaction = sendAndConfirmDurableNonceTransactionFactory({ rpc, rpcSubscriptions });\n *\n * try {\n * await sendAndConfirmNonceTransaction(transaction, { commitment: 'confirmed' });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND)) {\n * console.error(\n * 'The lifetime specified by this transaction refers to a nonce account ' +\n * `\\`${e.context.nonceAccountAddress}\\` that does not exist`,\n * );\n * } else if (isSolanaError(e, SOLANA_ERROR__INVALID_NONCE)) {\n * console.error('This transaction depends on a nonce that is no longer valid');\n * } else {\n * throw e;\n * }\n * }\n * ```\n */\nexport function sendAndConfirmDurableNonceTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig<'devnet'>): SendAndConfirmDurableNonceTransactionFunction;\nexport function sendAndConfirmDurableNonceTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig<'testnet'>): SendAndConfirmDurableNonceTransactionFunction;\nexport function sendAndConfirmDurableNonceTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig<'mainnet'>): SendAndConfirmDurableNonceTransactionFunction;\nexport function sendAndConfirmDurableNonceTransactionFactory<\n TCluster extends 'devnet' | 'mainnet' | 'testnet' | void = void,\n>({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmDurableNonceTransactionFactoryConfig<TCluster>): SendAndConfirmDurableNonceTransactionFunction {\n const getNonceInvalidationPromise = createNonceInvalidationPromiseFactory({ rpc, rpcSubscriptions } as Parameters<\n typeof createNonceInvalidationPromiseFactory\n >[0]);\n const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters<typeof createRecentSignatureConfirmationPromiseFactory>[0]);\n\n /**\n * Creates a wrapped version of getNonceInvalidationPromise that handles the race condition\n * where the nonce account update notification arrives before the signature confirmation.\n *\n * When the nonce changes, we check if our transaction actually landed on-chain.\n * If it did, we don't throw - letting the signature confirmation promise continue.\n */\n function createNonceInvalidationPromiseHandlingRaceCondition(\n signature: Signature,\n ): typeof getNonceInvalidationPromise {\n return async function wrappedGetNonceInvalidationPromise(config) {\n try {\n return await getNonceInvalidationPromise(config);\n } catch (e) {\n // If nonce became invalid, check if our transaction actually landed\n if (isSolanaError(e, SOLANA_ERROR__INVALID_NONCE)) {\n let status;\n try {\n const { value: statuses } = await rpc\n .getSignatureStatuses([signature])\n .send({ abortSignal: config.abortSignal });\n status = statuses[0];\n } catch {\n // RPC failed - propagate the original nonce error\n throw e;\n }\n\n if (status === null || status === undefined) {\n // Transaction doesn't exist - nonce was truly invalid\n throw e;\n }\n\n // Check if status meets required commitment\n if (\n status.confirmationStatus !== null &&\n commitmentComparator(status.confirmationStatus, config.commitment) >= 0\n ) {\n // Transaction failed on-chain, throw the error from the transaction\n if (status.err !== null) {\n throw getSolanaErrorFromTransactionError(status.err);\n }\n // Transaction succeeded, resolve the promise successfully\n return;\n }\n\n // Commitment not met yet - return a never-resolving promise\n // This lets the signature confirmation promise continue\n return await new Promise(() => {});\n }\n throw e;\n }\n };\n }\n\n async function confirmDurableNonceTransaction(\n config: Omit<\n Parameters<typeof waitForDurableNonceTransactionConfirmation>[0],\n 'getNonceInvalidationPromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) {\n const wrappedGetNonceInvalidationPromise = createNonceInvalidationPromiseHandlingRaceCondition(\n getSignatureFromTransaction(config.transaction),\n );\n\n await waitForDurableNonceTransactionConfirmation({\n ...config,\n getNonceInvalidationPromise: wrappedGetNonceInvalidationPromise,\n getRecentSignatureConfirmationPromise,\n });\n }\n return async function sendAndConfirmDurableNonceTransaction(transaction, config) {\n await sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n confirmDurableNonceTransaction,\n rpc,\n transaction,\n });\n };\n}\n","import type { GetEpochInfoApi, GetSignatureStatusesApi, Rpc, SendTransactionApi } from '@solana/rpc';\nimport type { RpcSubscriptions, SignatureNotificationsApi, SlotNotificationsApi } from '@solana/rpc-subscriptions';\nimport {\n createBlockHeightExceedencePromiseFactory,\n createRecentSignatureConfirmationPromiseFactory,\n TransactionWithLastValidBlockHeight,\n waitForRecentTransactionConfirmation,\n} from '@solana/transaction-confirmation';\nimport { SendableTransaction, Transaction } from '@solana/transactions';\n\nimport { sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT } from './send-transaction-internal';\n\ntype SendAndConfirmTransactionWithBlockhashLifetimeFunction = (\n transaction: SendableTransaction & Transaction & TransactionWithLastValidBlockHeight,\n config: Omit<\n Parameters<typeof sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT>[0],\n 'confirmRecentTransaction' | 'rpc' | 'transaction'\n >,\n) => Promise<void>;\n\ntype SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<TCluster> = {\n /** An object that supports the {@link GetSignatureStatusesApi} and the {@link SendTransactionApi} of the Solana RPC API */\n rpc: Rpc<GetEpochInfoApi & GetSignatureStatusesApi & SendTransactionApi> & { '~cluster'?: TCluster };\n /** An object that supports the {@link SignatureNotificationsApi} and the {@link SlotNotificationsApi} of the Solana RPC Subscriptions API */\n rpcSubscriptions: RpcSubscriptions<SignatureNotificationsApi & SlotNotificationsApi> & { '~cluster'?: TCluster };\n};\n\n/**\n * Returns a function that you can call to send a blockhash-based transaction to the network and to\n * wait until it has been confirmed.\n *\n * @param config\n *\n * @example\n * ```ts\n * import { isSolanaError, sendAndConfirmTransactionFactory, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED } from '@solana/kit';\n *\n * const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });\n *\n * try {\n * await sendAndConfirmTransaction(transaction, { commitment: 'confirmed' });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n * console.error('This transaction depends on a blockhash that has expired');\n * } else {\n * throw e;\n * }\n * }\n * ```\n */\nexport function sendAndConfirmTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<'devnet'>): SendAndConfirmTransactionWithBlockhashLifetimeFunction;\nexport function sendAndConfirmTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<'testnet'>): SendAndConfirmTransactionWithBlockhashLifetimeFunction;\nexport function sendAndConfirmTransactionFactory({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<'mainnet'>): SendAndConfirmTransactionWithBlockhashLifetimeFunction;\nexport function sendAndConfirmTransactionFactory<TCluster extends 'devnet' | 'mainnet' | 'testnet' | void = void>({\n rpc,\n rpcSubscriptions,\n}: SendAndConfirmTransactionWithBlockhashLifetimeFactoryConfig<TCluster>): SendAndConfirmTransactionWithBlockhashLifetimeFunction {\n const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters<typeof createBlockHeightExceedencePromiseFactory>[0]);\n const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({\n rpc,\n rpcSubscriptions,\n } as Parameters<typeof createRecentSignatureConfirmationPromiseFactory>[0]);\n async function confirmRecentTransaction(\n config: Omit<\n Parameters<typeof waitForRecentTransactionConfirmation>[0],\n 'getBlockHeightExceedencePromise' | 'getRecentSignatureConfirmationPromise'\n >,\n ) {\n await waitForRecentTransactionConfirmation({\n ...config,\n getBlockHeightExceedencePromise,\n getRecentSignatureConfirmationPromise,\n });\n }\n return async function sendAndConfirmTransaction(transaction, config) {\n await sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n confirmRecentTransaction,\n rpc,\n transaction,\n });\n };\n}\n","import type { Rpc, SendTransactionApi } from '@solana/rpc';\nimport { SendableTransaction, Transaction } from '@solana/transactions';\n\nimport { sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT } from './send-transaction-internal';\n\ntype SendTransactionWithoutConfirmingFunction = (\n transaction: SendableTransaction & Transaction,\n config: Omit<Parameters<typeof sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT>[0], 'rpc' | 'transaction'>,\n) => Promise<void>;\n\ninterface SendTransactionWithoutConfirmingFactoryConfig {\n /** An object that supports the {@link SendTransactionApi} of the Solana RPC API */\n rpc: Rpc<SendTransactionApi>;\n}\n\n/**\n * Returns a function that you can call to send a transaction with any kind of lifetime to the\n * network without waiting for it to be confirmed.\n *\n * @param config\n *\n * @example\n * ```ts\n * import {\n * sendTransactionWithoutConfirmingFactory,\n * SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,\n * } from '@solana/kit';\n *\n * const sendTransaction = sendTransactionWithoutConfirmingFactory({ rpc });\n *\n * try {\n * await sendTransaction(transaction, { commitment: 'confirmed' });\n * } catch (e) {\n * if (isSolanaError(e, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE)) {\n * console.error('The transaction failed in simulation', e.cause);\n * } else {\n * throw e;\n * }\n * }\n * ```\n */\nexport function sendTransactionWithoutConfirmingFactory({\n rpc,\n}: SendTransactionWithoutConfirmingFactoryConfig): SendTransactionWithoutConfirmingFunction {\n return async function sendTransactionWithoutConfirming(transaction, config) {\n await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({\n ...config,\n rpc,\n transaction,\n });\n };\n}\n"]}