{"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/resource-limit-estimation.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":["MAX_COMPUTE_UNIT_LIMIT","isTransactionMessageWithDurableNonceLifetime","pipe","setTransactionMessageComputeUnitLimit","compileTransaction","getBase64EncodedWireTransaction","SolanaError","SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT","getSolanaErrorFromTransactionError","isSolanaError","getTransactionMessageComputeUnitLimit","createRecentSignatureConfirmationPromiseFactory","commitmentComparator"],"mappings":"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","file":"index.node.mjs","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 { SolanaRpcResponse } from '@solana/rpc-types';\nimport type {\n    ReactiveActionSource,\n    ReactiveState,\n    ReactiveStreamSource,\n    ReactiveStreamStore,\n} from '@solana/subscribable';\n\n/**\n * Configuration for {@link createReactiveStoreWithInitialValueAndSlotTracking}. Pairs a one-shot\n * initial-value source with an ongoing stream source so the resulting store can hydrate from the\n * initial response and keep up to date with notifications, slot-deduplicating the two sources.\n *\n * @typeParam TInitialValue - The value type produced by `initialValueSource` (inside the {@link SolanaRpcResponse} envelope).\n * @typeParam TStreamValue - The value type emitted by `streamSource` (inside the {@link SolanaRpcResponse} envelope).\n * @typeParam TItem - The unified item type the store holds, produced by the two value mappers.\n *\n * @see {@link createReactiveStoreWithInitialValueAndSlotTracking}\n */\nexport type CreateReactiveStoreWithInitialValueAndSlotTrackingConfig<TInitialValue, TStreamValue, TItem> = Readonly<{\n    /**\n     * Maps the value from the initial-value source's response to the item type stored in the\n     * reactive store.\n     */\n    initialValueMapper: (value: TInitialValue) => TItem;\n    /**\n     * A reactive action source whose dispatched value will be used to set the store's initial\n     * state. The value must be a {@link SolanaRpcResponse} so that its slot can be compared with\n     * stream notifications. Satisfied by `PendingRpcRequest`.\n     */\n    initialValueSource: ReactiveActionSource<SolanaRpcResponse<TInitialValue>>;\n    /**\n     * A reactive stream source whose notifications will be used to keep the store up to date. Each\n     * notification must be a {@link SolanaRpcResponse} so that its slot can be compared with the\n     * initial value and with other notifications. Satisfied by `PendingRpcSubscriptionsRequest`.\n     */\n    streamSource: ReactiveStreamSource<SolanaRpcResponse<TStreamValue>>;\n    /**\n     * Maps the value from a stream notification to the item type stored in the reactive store.\n     */\n    streamValueMapper: (value: TStreamValue) => TItem;\n}>;\n\nconst IDLE_STATE: ReactiveState<never> = Object.freeze({\n    data: undefined,\n    error: undefined,\n    status: 'idle',\n});\n\n/**\n * Creates a {@link ReactiveStreamStore} that combines an initial one-shot fetch with an ongoing\n * stream 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 value source or a stream notification. This\n * prevents stale data from overwriting newer data when the two sources arrive out of order.\n *\n * The two sources are consumed via their {@link ReactiveActionSource.reactiveStore | `reactiveStore()`}\n * methods rather than by calling `send()` / `subscribe()` directly, so any object satisfying the\n * {@link ReactiveActionSource} / {@link ReactiveStreamSource} duck-types works — including\n * `PendingRpcRequest` / `PendingRpcSubscriptionsRequest` and plugin-authored wrappers.\n *\n * Things to note:\n *\n * - The returned store starts in `status: 'idle'`. Call\n *   {@link ReactiveStreamStore.connect | `connect()`} to dispatch the initial-value source and open\n *   the stream.\n * - The store transitions through `loading` until the first value or notification arrives,\n *   then to `loaded` with a {@link SolanaRpcResponse} containing the value and the slot context\n *   at which it was observed.\n * - On error from either source, the store transitions to `status: 'error'` preserving the last\n *   known value. Only the first error per connection window is captured.\n * - A subsequent `connect()` aborts the current connection, transitions back to\n *   `status: 'loading'` (preserving the last known `data` and `error` for stale-while-revalidate),\n *   and re-builds both inner stores with a fresh inner abort signal.\n * - {@link ReactiveStreamStore.reset | `reset()`} aborts the current connection and returns the\n *   store to `idle`, clearing `data` and `error`.\n * - Attach a caller-provided cancellation source via\n *   {@link ReactiveStreamStore.withSignal | `withSignal()`} — `store.withSignal(signal).connect()`\n *   composes the signal with the per-connection controller. Aborting the caller's signal\n *   transitions the store to `error` with that abort reason.\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 *     initialValueSource: rpc.getBalance(myAddress, { commitment: 'confirmed' }),\n *     initialValueMapper: lamports => lamports,\n *     streamSource: rpcSubscriptions.accountNotifications(myAddress),\n *     streamValueMapper: ({ lamports }) => lamports,\n * });\n *\n * const unsubscribe = balanceStore.subscribe(() => {\n *     const state = balanceStore.getState();\n *     if (state.status === 'error') {\n *         console.error('Error:', state.error);\n *         balanceStore.connect();\n *     } else if (state.status === 'loaded') {\n *         console.log(`Balance at slot ${state.data.context.slot}:`, state.data.value);\n *     }\n * });\n * balanceStore.withSignal(AbortSignal.timeout(60_000)).connect();\n * ```\n *\n * @see {@link ReactiveStreamStore}\n */\nexport function createReactiveStoreWithInitialValueAndSlotTracking<TInitialValue, TStreamValue, TItem>({\n    initialValueMapper,\n    initialValueSource,\n    streamSource,\n    streamValueMapper,\n}: CreateReactiveStoreWithInitialValueAndSlotTrackingConfig<TInitialValue, TStreamValue, TItem>): ReactiveStreamStore<\n    SolanaRpcResponse<TItem>\n> {\n    let currentState: ReactiveState<SolanaRpcResponse<TItem>> = IDLE_STATE;\n    let lastUpdateSlot = -1n;\n    let currentInnerController: AbortController | undefined;\n    const subscribers = new Set<() => void>();\n\n    function notify() {\n        subscribers.forEach(cb => cb());\n    }\n\n    function setState(next: ReactiveState<SolanaRpcResponse<TItem>>) {\n        if (\n            currentState.status === next.status &&\n            currentState.data === next.data &&\n            currentState.error === next.error\n        ) {\n            return;\n        }\n        currentState = next;\n        notify();\n    }\n\n    function performConnect(callerSignal: AbortSignal | undefined) {\n        // Abort any currently active connection before starting a fresh one.\n        currentInnerController?.abort();\n        // If the caller's signal is already aborted, surface as error and bail.\n        if (callerSignal?.aborted) {\n            setState({ data: currentState.data, error: callerSignal.reason, status: 'error' });\n            return;\n        }\n        // Transition to `loading`, preserving the last known `data` and `error` for SWR. If\n        // already `loading` with the same data/error, `setState` no-ops — no spurious notify.\n        setState({ data: currentState.data, error: currentState.error, status: 'loading' });\n\n        const innerController = new AbortController();\n        currentInnerController = innerController;\n        const innerSignal = innerController.signal;\n        const signal = callerSignal ? AbortSignal.any([innerSignal, callerSignal]) : innerSignal;\n        // Caller's signal aborting (not just supersede via the inner controller) transitions the\n        // store to error with the caller's abort reason. Scoped to the inner signal so the\n        // listener is removed on reconnect / reset.\n        if (callerSignal) {\n            callerSignal.addEventListener(\n                'abort',\n                () => {\n                    if (innerSignal.aborted) return;\n                    setState({ data: currentState.data, error: callerSignal.reason, status: 'error' });\n                    innerController.abort(callerSignal.reason);\n                },\n                { signal: innerSignal },\n            );\n        }\n\n        function handleError(err: unknown) {\n            if (signal.aborted) return;\n            if (currentState.status === 'error') return;\n            setState({ data: currentState.data, error: err, status: 'error' });\n            innerController.abort(err);\n        }\n\n        // `lastUpdateSlot` persists across reconnects so the surfaced value never regresses.\n        function handleSlottedValue({ context: { slot }, value }: SolanaRpcResponse<TItem>) {\n            if (signal.aborted) return;\n            if (slot < lastUpdateSlot) {\n                // Stale slot: keep the newer `data` we already hold, but still set `loaded`.\n                if (currentState.data !== undefined) {\n                    setState({ data: currentState.data, error: undefined, status: 'loaded' });\n                }\n                return;\n            }\n            lastUpdateSlot = slot;\n            setState({ data: { context: { slot }, value }, error: undefined, status: 'loaded' });\n        }\n\n        // Build fresh inner stores for this connection window and forward their state into the\n        // unified store. Drive both with the composed signal so they tear down when this connection\n        // window does.\n        const actionStore = initialValueSource.reactiveStore();\n        const streamStore = streamSource.reactiveStore();\n\n        const unsubscribeAction = actionStore.subscribe(() => {\n            const state = actionStore.getState();\n            if (state.status === 'success') {\n                const { context, value } = state.data;\n                handleSlottedValue({ context, value: initialValueMapper(value) });\n            } else if (state.status === 'error') {\n                handleError(state.error);\n            }\n        });\n        const unsubscribeStream = streamStore.subscribe(() => {\n            const state = streamStore.getState();\n            if (state.status === 'loaded') {\n                const { context, value } = state.data;\n                handleSlottedValue({ context, value: streamValueMapper(value) });\n            } else if (state.status === 'error') {\n                handleError(state.error);\n            }\n        });\n\n        // Stop observing this connection's inner stores once it is superseded or the caller\n        // aborts.\n        // Note: don't call reset here, causes a race with the abort reason\n        innerSignal.addEventListener(\n            'abort',\n            () => {\n                unsubscribeAction();\n                unsubscribeStream();\n            },\n            { once: true },\n        );\n\n        streamStore.withSignal(signal).connect();\n        actionStore.withSignal(signal).dispatch();\n    }\n\n    function performReset() {\n        currentInnerController?.abort();\n        currentInnerController = undefined;\n        // `lastUpdateSlot` resets too — a fresh connect() starts a new slot window.\n        lastUpdateSlot = -1n;\n        setState(IDLE_STATE);\n    }\n\n    return {\n        connect(): void {\n            performConnect(undefined);\n        },\n        getState(): ReactiveState<SolanaRpcResponse<TItem>> {\n            return currentState;\n        },\n        reset: performReset,\n        subscribe(callback: () => void): () => void {\n            subscribers.add(callback);\n            return () => {\n                subscribers.delete(callback);\n            };\n        },\n        withSignal(signal: AbortSignal) {\n            return {\n                connect(): void {\n                    performConnect(signal);\n                },\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 *\n * @deprecated Use {@link estimateResourceLimitsFactory} instead. The resource-limits estimator\n *   returns both the compute unit limit and (for version 1 transactions) the loaded accounts data\n *   size limit from a single simulation call.\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 and `RpcSimulateTransactionResult` describe overlapping but\n            // structurally different shapes (eg. `replacementBlockhash` is a parsed\n            // `TransactionBlockhashLifetime` object here, but a raw string there). Cast through\n            // `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 *\n * @deprecated Use {@link estimateAndSetResourceLimitsFactory} instead, which additionally sets the\n *   loaded accounts data size limit for version 1 transactions.\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 *\n * @deprecated Use {@link fillTransactionMessageProvisoryResourceLimits} instead, which additionally\n *   reserves space for the loaded accounts data size limit on version 1 transactions.\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 {\n    getSolanaErrorFromTransactionError,\n    isSolanaError,\n    type RpcSimulateTransactionResult,\n    SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT,\n    SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_LOADED_ACCOUNTS_DATA_SIZE_LIMIT,\n    SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_RESOURCE_LIMITS,\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    getTransactionMessageLoadedAccountsDataSizeLimit,\n    isTransactionMessageWithDurableNonceLifetime,\n    setTransactionMessageComputeUnitLimit,\n    setTransactionMessageLoadedAccountsDataSizeLimit,\n    TransactionMessage,\n    TransactionMessageWithFeePayer,\n} from '@solana/transaction-messages';\nimport { compileTransaction, getBase64EncodedWireTransaction } from '@solana/transactions';\n\nconst PROVISORY_LIMIT = 0;\n// From Agave: https://github.com/anza-xyz/agave/blob/2a165e7a90af75c76426d1e031ed0284211d5d1e/program-runtime/src/execution_budget.rs#L39\nconst MAX_COMPUTE_UNIT_LIMIT = 1_400_000;\n// From Agave: https://github.com/anza-xyz/agave/blob/2a165e7a90af75c76426d1e031ed0284211d5d1e/program-runtime/src/execution_budget.rs#L53\nconst MAX_LOADED_ACCOUNTS_DATA_SIZE_LIMIT = 64 * 1024 * 1024;\n\ntype EstimateResourceLimitsFactoryConfig = Readonly<{\n    rpc: Rpc<SimulateTransactionApi>;\n}>;\n\ntype EstimateResourceLimitsConfig = Readonly<{\n    abortSignal?: AbortSignal;\n    commitment?: Commitment;\n    minContextSlot?: Slot;\n}>;\n\n/**\n * The estimated resource limits for a transaction message.\n *\n * `computeUnitLimit` is always returned. For version 1 transaction messages,\n * `loadedAccountsDataSizeLimit` is also required. For legacy and version 0 messages, the\n * `loadedAccountsDataSizeLimit` is returned when the RPC includes it in the simulation result,\n * but is not required — callers that don't apply it can ignore the field.\n */\nexport type ResourceLimitsEstimate<TTransactionMessage extends TransactionMessage> = TTransactionMessage extends {\n    version: 1;\n}\n    ? { computeUnitLimit: number; loadedAccountsDataSizeLimit: number }\n    : { computeUnitLimit: number; loadedAccountsDataSizeLimit?: number };\n\ntype EstimateResourceLimitsFunction = <TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer>(\n    transactionMessage: TTransactionMessage,\n    config?: EstimateResourceLimitsConfig,\n) => Promise<ResourceLimitsEstimate<TTransactionMessage>>;\n\n/**\n * Returns a function that estimates the resource limits required by a transaction message by\n * simulating it.\n *\n * The estimator sets the compute unit limit to the maximum (1,400,000) and the loaded accounts data\n * size limit to the maximum (64 MiB) before simulating, so the simulation does not fail due to\n * resource exhaustion. For blockhash-lifetime transactions, the RPC is asked to replace the\n * blockhash during simulation, so any blockhash value will work. For durable nonce transactions,\n * the actual nonce value is used.\n *\n * For version 1 transaction messages, both `computeUnitLimit` and `loadedAccountsDataSizeLimit` are\n * returned. The function throws if the RPC does not return a `loadedAccountsDataSize` value, since\n * this value is required for version 1 transactions. For legacy and version 0 messages, only\n * `computeUnitLimit` is returned.\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 resource limits.\n *\n * @example\n * ```ts\n * import { estimateResourceLimitsFactory } from '@solana/kit';\n *\n * const estimateResourceLimits = estimateResourceLimitsFactory({ rpc });\n * const { computeUnitLimit, loadedAccountsDataSizeLimit } = await estimateResourceLimits(transactionMessage);\n * ```\n */\nexport function estimateResourceLimitsFactory({\n    rpc,\n}: EstimateResourceLimitsFactoryConfig): EstimateResourceLimitsFunction {\n    return async function estimateResourceLimits<\n        TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer,\n    >(transactionMessage: TTransactionMessage, config?: EstimateResourceLimitsConfig) {\n        const { abortSignal, ...simulateConfig } = config ?? {};\n        const replaceRecentBlockhash = !isTransactionMessageWithDurableNonceLifetime(transactionMessage);\n        const isDataSizeRequired = transactionMessage.version === 1;\n\n        const transaction = pipe(\n            transactionMessage,\n            m => setTransactionMessageComputeUnitLimit(MAX_COMPUTE_UNIT_LIMIT, m),\n            m =>\n                isDataSizeRequired\n                    ? setTransactionMessageLoadedAccountsDataSizeLimit(MAX_LOADED_ACCOUNTS_DATA_SIZE_LIMIT, m)\n                    : 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 and `RpcSimulateTransactionResult` describe overlapping but\n            // structurally different shapes (eg. `replacementBlockhash` is a parsed\n            // `TransactionBlockhashLifetime` object here, but a raw string there). Cast through\n            // `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 (isDataSizeRequired && simulationResult.loadedAccountsDataSize == null) {\n                throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_LOADED_ACCOUNTS_DATA_SIZE_LIMIT);\n            }\n\n            if (transactionError) {\n                throw new SolanaError(SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_RESOURCE_LIMITS, {\n                    ...simulationResult,\n                    cause: getSolanaErrorFromTransactionError(transactionError),\n                });\n            }\n\n            // Downcast from bigint to number, capping at u32 max.\n            const computeUnitLimit =\n                simulationResult.unitsConsumed > 4_294_967_295n\n                    ? 4_294_967_295\n                    : Number(simulationResult.unitsConsumed);\n\n            if (isDataSizeRequired) {\n                return {\n                    computeUnitLimit,\n                    loadedAccountsDataSizeLimit: simulationResult.loadedAccountsDataSize!,\n                } as ResourceLimitsEstimate<TTransactionMessage>;\n            }\n            return (\n                simulationResult.loadedAccountsDataSize == null\n                    ? { computeUnitLimit }\n                    : { computeUnitLimit, loadedAccountsDataSizeLimit: simulationResult.loadedAccountsDataSize }\n            ) as ResourceLimitsEstimate<TTransactionMessage>;\n        } catch (e) {\n            if (\n                isSolanaError(e, SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_RESOURCE_LIMITS) ||\n                isSolanaError(e, SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_LOADED_ACCOUNTS_DATA_SIZE_LIMIT)\n            ) {\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 resource limits for a transaction message and sets them on\n * the message.\n *\n * For all versions, the compute unit limit is updated to the estimated value if it is not already\n * set to an explicit, non-provisory value. The compute unit limit also treats the maximum\n * (1,400,000) as non-explicit, so messages that pre-set the max for simulation get re-estimated.\n *\n * For version 1 messages, the loaded accounts data size limit is updated only if it is unset or set\n * to the provisory value of 0. An explicit value — including the runtime maximum — is left\n * untouched, since callers who set it explicitly are signaling a deliberate choice.\n *\n * This is designed to work with {@link fillTransactionMessageProvisoryResourceLimits}: first add\n * provisory limits during transaction construction, then later estimate and replace them before\n * sending.\n *\n * @param estimateResourceLimits - The estimator function, typically created by\n *   {@link estimateResourceLimitsFactory}. You can also pass a custom wrapper that applies a buffer\n *   to the returned values.\n * @return A function that accepts a transaction message and returns it with resource limits set to\n *   the estimated values.\n *\n * @example\n * ```ts\n * import { estimateAndSetResourceLimitsFactory, estimateResourceLimitsFactory } from '@solana/kit';\n *\n * const estimator = estimateResourceLimitsFactory({ rpc });\n * const estimateAndSet = estimateAndSetResourceLimitsFactory(estimator);\n * const updatedMessage = await estimateAndSet(transactionMessage);\n * ```\n */\nexport function estimateAndSetResourceLimitsFactory(\n    estimateResourceLimits: EstimateResourceLimitsFunction,\n): <TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer>(\n    transactionMessage: TTransactionMessage,\n    config?: EstimateResourceLimitsConfig,\n) => Promise<TTransactionMessage> {\n    return async function estimateAndSetResourceLimits(transactionMessage, config) {\n        const existingComputeUnitLimit = getTransactionMessageComputeUnitLimit(transactionMessage);\n        const computeUnitLimitIsExplicit =\n            existingComputeUnitLimit !== undefined &&\n            existingComputeUnitLimit !== PROVISORY_LIMIT &&\n            existingComputeUnitLimit !== MAX_COMPUTE_UNIT_LIMIT;\n\n        const isV1 = transactionMessage.version === 1;\n        let loadedAccountsDataSizeLimitIsExplicit = true;\n        if (isV1) {\n            const existingLoadedAccountsDataSizeLimit =\n                getTransactionMessageLoadedAccountsDataSizeLimit(transactionMessage);\n            loadedAccountsDataSizeLimitIsExplicit =\n                existingLoadedAccountsDataSizeLimit !== undefined &&\n                existingLoadedAccountsDataSizeLimit !== PROVISORY_LIMIT;\n        }\n\n        // Nothing to do — every applicable limit is already explicitly set.\n        if (computeUnitLimitIsExplicit && loadedAccountsDataSizeLimitIsExplicit) {\n            return transactionMessage;\n        }\n\n        const estimate = await estimateResourceLimits(transactionMessage, config);\n\n        let result = transactionMessage;\n        if (!computeUnitLimitIsExplicit) {\n            result = setTransactionMessageComputeUnitLimit(estimate.computeUnitLimit, result);\n        }\n        if (isV1 && !loadedAccountsDataSizeLimitIsExplicit && 'loadedAccountsDataSizeLimit' in estimate) {\n            result = setTransactionMessageLoadedAccountsDataSizeLimit(estimate.loadedAccountsDataSizeLimit, result);\n        }\n        return result;\n    };\n}\n\n/**\n * Sets resource limits to a provisory value of 0 if no limit is currently set on the transaction\n * message.\n *\n * For all versions, this fills the compute unit limit. For version 1 messages, it also fills the\n * loaded accounts data size limit. If a limit is already set (any value, including 0), that limit\n * is left unchanged.\n *\n * This is useful during transaction construction to reserve space for resource limits that will\n * later be replaced with actual estimates via {@link estimateAndSetResourceLimitsFactory}.\n *\n * @param transactionMessage - The transaction message to add provisory limits to.\n * @return The transaction message with provisory resource limits set, or unchanged if all\n *   applicable limits were already present.\n *\n * @example\n * ```ts\n * import { fillTransactionMessageProvisoryResourceLimits } from '@solana/kit';\n *\n * const messageWithProvisoryLimits = fillTransactionMessageProvisoryResourceLimits(transactionMessage);\n * ```\n */\nexport function fillTransactionMessageProvisoryResourceLimits<TTransactionMessage extends TransactionMessage>(\n    transactionMessage: TTransactionMessage,\n): TTransactionMessage {\n    let result: TTransactionMessage = transactionMessage;\n    if (getTransactionMessageComputeUnitLimit(result) === undefined) {\n        result = setTransactionMessageComputeUnitLimit(PROVISORY_LIMIT, result);\n    }\n    if (result.version === 1 && getTransactionMessageLoadedAccountsDataSizeLimit(result) === undefined) {\n        result = setTransactionMessageLoadedAccountsDataSizeLimit(PROVISORY_LIMIT, result);\n    }\n    return result;\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"]}