NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #4867 most downloaded on npm
Codecs for numbers of different sizes and endianness
Last release 6 days ago
28 Sep 2026
Ships fairly regularly
a new release about every 8 days
Nearly every release is documented
notes for 39 of 39 stable releases
1 version withdrawn
withdrawn after publishing
3 years old
2248 releases · first in 2023
One column per quarter.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
getState() and getError() remain on the type but are now @deprecated in favour of the unified snapshot.
[@solana/errors, @solana/kit, @solana/subscribable] #1552 c318d7f Thanks @mcintyre94! - Add retry() and getUnifiedState() to ReactiveStore. The new getUnifiedState() returns a discriminated { data, error, status } snapshot with stable identity, so stores can be passed directly to useSyncExternalStore without an intermediate wrapper. getState() and getError() remain on the type but are now @deprecated in favour of the unified snapshot.
A new createReactiveStoreFromDataPublisherFactory function is also introduced. It accepts a createDataPublisher: () => Promise<DataPublisher> factory rather than a ready-made publisher, which lets the store reconnect via retry() after an error. The existing createReactiveStoreFromDataPublisher is now @deprecated; calling retry() on a store it produced throws a new SolanaError with code SOLANA_ERROR__SUBSCRIBABLE__RETRY_NOT_SUPPORTED.
createReactiveStoreWithInitialValueAndSlotTracking (from @solana/kit) now supports retry(), which re-sends the RPC request and re-subscribes to the subscription with a fresh abort signal while preserving the last known slot and value.
[@solana/errors, @solana/kit] #1654 460557b Thanks @mcintyre94! - Added estimateResourceLimitsFactory, estimateAndSetResourceLimitsFactory, and fillTransactionMessageProvisoryResourceLimits to @solana/kit. These mirror the existing compute-unit estimators but additionally estimate and set the loaded accounts data size limit, which is required for version 1 transactions. Both limits are derived from a single simulation call.
Two new error codes were added to @solana/errors: SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_LOADED_ACCOUNTS_DATA_SIZE_LIMIT (thrown when an RPC fails to return a loadedAccountsDataSize value while estimating a version 1 transaction) and SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_RESOURCE_LIMITS (the resource-limits counterpart of SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT).
The compute-unit-only helpers are still exported but are now deprecated. The new helpers handle every transaction version: for legacy and version 0 messages they behave the same as the old ones (only the compute unit limit is set); for version 1 messages they additionally set the loaded accounts data size limit, which is required for v1.
estimateComputeUnitLimitFactory → estimateResourceLimitsFactoryThe new estimator returns an object instead of a number. Destructure computeUnitLimit from the result:
// Before
const estimateComputeUnitLimit = estimateComputeUnitLimitFactory({ rpc });
const units = await estimateComputeUnitLimit(transactionMessage);
// After
const estimateResourceLimits = estimateResourceLimitsFactory({ rpc });
const { computeUnitLimit } = await estimateResourceLimits(transactionMessage);
// If provided by the RPC, `loadedAccountsDataSizeLimit` is also returnedestimateAndSetComputeUnitLimitFactory → estimateAndSetResourceLimitsFactoryThe new helper accepts the multi-resource estimator and returns a function with the same shape as before — it takes a transaction message and returns the same message with resource limits set. No call-site change beyond the factory swap:
// Before
const estimator = estimateComputeUnitLimitFactory({ rpc });
const estimateAndSet = estimateAndSetComputeUnitLimitFactory(estimator);
// After
const estimator = estimateResourceLimitsFactory({ rpc });
const estimateAndSet = estimateAndSetResourceLimitsFactory(estimator);Behavior note: the new helper re-estimates the compute unit limit when it is unset, set to the provisory value of 0, or set to the runtime max of 1_400_000 (same as before). For the loaded accounts data size limit on v1 messages it only re-estimates when unset or set to the provisory 0; an explicit value — including the runtime max of 64 MiB — is left untouched, since callers who set it explicitly are signaling a deliberate choice.
fillTransactionMessageProvisoryComputeUnitLimit → fillTransactionMessageProvisoryResourceLimitsThe signature is unchanged. For v1 messages, the new helper additionally reserves a provisory 0 for the loaded accounts data size limit when none is set. For legacy and v0 messages, the behavior is unchanged and the function only reserves space for the CU limit.
// Before
const reserved = fillTransactionMessageProvisoryComputeUnitLimit(transactionMessage);
// After
const reserved = fillTransactionMessageProvisoryResourceLimits(transactionMessage);[@solana/errors] #1746 40e0848 Thanks @mcintyre94! - Add the SOLANA_ERROR__WALLET__ACCOUNT_NOT_AVAILABLE error code, thrown when a selected account is not available in the connected wallet. Its context carries the requested address and the walletName.
[@solana/errors, @solana/kit, @solana/rpc-subscriptions-spec, @solana/subscribable] #1554 47a785b Thanks @mcintyre94! - Rename ReactiveStore<T> to ReactiveStreamStore<T>. The old name remains exported as a deprecated alias and will be removed in a future major release.
[@solana/kit, @solana/rpc-spec] #1555 5e1644d Thanks @mcintyre94! - Add a reactiveStore() method to PendingRpcRequest. It fires the request on construction and synchronously returns a ReactiveActionStore that holds the request's idle/running/success/error lifecycle state. Compatible with useSyncExternalStore, Svelte stores, and other reactive primitives. Call dispatch() to re-fire the request (e.g. after an error), or reset() to abort the in-flight call and return to idle.
const store = rpc.getAccountInfo(address).reactiveStore();
const state = useSyncExternalStore(store.subscribe, store.getState);
if (state.status === 'error') return <ErrorMessage error={state.error} onRetry={store.dispatch} />;
if (state.status === 'running' && !state.data) return <Spinner />;
return <View data={state.data!} />;[@solana/kit, @solana/rpc-subscriptions-spec] #1553 15b610d Thanks @mcintyre94! - Add a reactiveStore() method to PendingRpcSubscriptionsRequest. Unlike reactive(), this variant returns a ReactiveStore synchronously and supports retry() to reconnect after an error. reactive() is now @deprecated in favour of reactiveStore().
const store = rpc.accountNotifications(address).reactiveStore({ abortSignal });
const state = useSyncExternalStore(store.subscribe, store.getUnifiedState);
if (state.status === 'error') return <ErrorMessage error={state.error} onRetry={store.retry} />;[@solana/kit, @solana/subscribable] #1606 da868aa Thanks @mcintyre94! - Add framework-agnostic source duck-types for reactive bindings.
@solana/subscribable now exports two new types:
ReactiveStreamSource<T> — anything with a reactiveStore({ abortSignal }) method that returns a ReactiveStreamStore<T>. PendingRpcSubscriptionsRequest<T> satisfies this by design.ReactiveActionSource<T> — anything with a zero-argument reactiveStore() method that returns a ReactiveActionStore<[], T>. PendingRpcRequest<T> satisfies this by design.These let reactive-framework bindings consume a single duck-type instead of naming concrete producer types — and let plugin authors expose their own pending-request objects to those bindings without modification.
Both source types live in @solana/subscribable and are not re-exported from @solana/kit, matching the existing convention for their parent ReactiveStreamStore / ReactiveActionStore types — anyone consuming a source duck-type is already in the reactive-primitives layer and will already be importing the related store types from the same package.
@solana/kit now publicly exports the previously-private CreateReactiveStoreWithInitialValueAndSlotTrackingConfig type so non-React consumers (e.g. plugins) can declare function return shapes based on it without taking a dependency on @solana/react.
[@solana/rpc-api] #1660 0d5aa7f Thanks @kh0ra! - Add the optional transactionIndex field to each element of the getSignaturesForAddress response. Agave 4.0 (anza-xyz/agave#9683) included the 0 based transaction index inside the block alongside each returned signature. The field is omitted by older RPC servers, so the new property is optional and existing call sites continue to compile without modification.
[@solana/rpc-api] #1658 d655bef Thanks @mcintyre94! - Added the clientId field to the getClusterNodes response type, exposing the name of the validator client software advertised by each node. Also marked the tpu and tpuForwards fields as @deprecated in favor of their QUIC equivalents (tpuQuic and tpuForwardsQuic); validators may report the UDP fields as null.
[@solana/rpc-types] #1659 93191af Thanks @kh0ra! - Base58EncodedBytes, Base64EncodedBytes, and Base64EncodedZStdCompressedBytes are no longer uniquely branded. They are now plain EncodedString<...> aliases over their respective encoding tags. As a result, any value that already carries the matching encoding tag (such as Address, Signature, or Blockhash for base 58) can be used wherever Base58EncodedBytes is expected. For example, an Address may now be passed directly as the bytes of a memcmp filter in getProgramAccounts. The runtime representation is unchanged and existing call sites continue to compile without modification.
[@solana/subscribable] #1550 82a1ac5 Thanks @mcintyre94! - Added createReactiveActionStore — a framework-agnostic state machine that wraps an async function and exposes a { dispatch, dispatchAsync, getState, subscribe, reset } contract compatible with useSyncExternalStore, Svelte stores, Vue's shallowRef, and similar reactive primitives. dispatch is synchronous and fire-and-forget (safe from UI event handlers); dispatchAsync returns a promise that resolves to the wrapped function's result and rejects on failure or supersede — use isAbortError from @solana/promises to filter aborts. Each call creates a fresh AbortController and aborts the previous one, so rapid successive dispatches only produce one final state transition — the outcome of the most recent call.
[@solana/errors] #1681 6b499ee Thanks @brooksprumo! - Add FILTER_TRANSACTION_NOT_FOUND error
[@solana/errors] #1679 74b8d3d Thanks @brooksprumo! - Add NO_SLOT_HISTORY error
[@solana/offchain-messages] #1741 6c2c903 Thanks @ChargingFoxSec! - Include the v0 preamble bytes when enforcing the 1232-byte limit for hardware-wallet-signable offchain messages.
[@solana/plugin-core] #1646 09e7796 Thanks @lorisleiva! - Flatten the inferred return type of extendClient and withCleanup so that chained .use() calls on a Client no longer produce deeply nested Omit<Omit<Omit<...>>> types in editor tooltips and error messages. The inferred shape now displays as a single flat object literal at every step of the chain, while optional (?) and readonly modifiers, symbol keys, and override semantics are preserved exactly as before. Also exports the new ExtendedClient<TClient, TAdditions> helper type for plugin authors who write their own merging helpers and want the same flattening guarantee.
[@solana/rpc-transport-http] #1700 bb67860 Thanks @pgtls! - Stop sending a manual Content-Length header from the HTTP transport. The value came from body.length — the JavaScript string's UTF-16 code-unit count — which is smaller than the body's actual UTF-8 byte length whenever the payload contains non-ASCII characters. For such payloads the server would respect the header, read only that many bytes off the socket, and stall waiting for a request that the client believed it had already finished sending. The symptom is a hung request rather than a thrown error, and it has been latent since the line was introduced; recent undici versions surface it more readily. The fix is to let fetch derive Content-Length from the body itself, which it always did anyway. The transport's TypeScript surface and dev-mode runtime check continue to disallow Content-Length as a caller-supplied header.
[@solana/transaction-confirmation] #1640 953eed6 Thanks @kh0ra! - Fix an abort listener leak in getTimeoutPromise. The listener registered on the caller's AbortSignal was never removed after the promise settled, which caused listeners to accumulate when the same signal was reused across multiple calls. getTimeoutPromise now registers the listener with the auto-cleanup signal option already used by the other strategies in this package and releases it in a finally block.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Kit's types still model this field as conditionally present based on config. A future breaking change will move it to the base response type as Transa…
[@solana/accounts, @solana/addresses, @solana/assertions, @solana/codecs, @solana/codecs-core, @solana/codecs-data-structures, @solana/codecs-numbers, @solana/codecs-strings, @solana/compat, @solana/errors, @solana/fast-stable-stringify, @solana/fixed-points, @solana/functional, @solana/instruction-plans, @solana/instructions, @solana/keys, @solana/kit, @solana/nominal-types, @solana/offchain-messages, @solana/options, @solana/plugin-core, @solana/plugin-interfaces, @solana/program-client-core, @solana/programs, @solana/promises, @solana/rpc, @solana/rpc-api, @solana/rpc-graphql, @solana/rpc-parsed-types, @solana/rpc-spec, @solana/rpc-spec-types, @solana/rpc-subscriptions, @solana/rpc-subscriptions-api, @solana/rpc-subscriptions-channel-websocket, @solana/rpc-subscriptions-spec, @solana/rpc-transformers, @solana/rpc-transport-http, @solana/rpc-types, @solana/signers, @solana/subscribable, @solana/sysvars, @solana/transaction-confirmation, @solana/transaction-messages, @solana/transactions, @solana/wallet-account-signer, @solana/webcrypto-ed25519-polyfill] #1562 096c48e Thanks @lorisleiva! - Bump the TypeScript peer dependency floor from >=5.0.0 to >=5.4.0.
[@solana/codecs, @solana/fixed-points, @solana/kit] #1570 c5e0e14 Thanks @lorisleiva! - Add a new @solana/fixed-points package providing precise fixed-point number types for Solana, both decimal (power-of-10 scale) and binary (power-of-2 scale), in signed and unsigned flavors with arbitrary bit widths. The package includes factories, guards, arithmetic, comparisons, signedness conversions, rescaling, string/number formatting, and byte-level codecs. Also re-exported from @solana/codecs and @solana/kit.
[@solana/errors] #1542 92126f4 Thanks @mcintyre94! - Add SOLANA_ERROR__WALLET__NO_SIGNER_CONNECTED and SOLANA_ERROR__WALLET__SIGNER_NOT_AVAILABLE error codes for wallet-signer availability checks.
[@solana/errors] #1559 a5ef97b Thanks @lorisleiva! - Add 13 new error codes in the [8090000, 8090999] range for the upcoming @solana/fixed-points package: INVALID_TOTAL_BITS, INVALID_FRACTIONAL_BITS, INVALID_DECIMALS, FRACTIONAL_BITS_EXCEED_TOTAL_BITS, VALUE_OUT_OF_RANGE, INVALID_STRING, INVALID_ZERO_DENOMINATOR_RATIO, ARITHMETIC_OVERFLOW, SHAPE_MISMATCH, DIVISION_BY_ZERO, STRICT_MODE_PRECISION_LOSS, MALFORMED_RAW_VALUE, and TOTAL_BITS_NOT_BYTE_ALIGNED.
[@solana/errors, @solana/kit, @solana/rpc-api, @solana/rpc-parsed-types] #1544 e82e03e Thanks @mcintyre94! - Update RPC types for Agave v3.x validator compatibility.
@solana/rpc-parsed-types: JsonParsedVoteAccount now includes blockRevenueCollector, blockRevenueCommissionBps, blsPubkeyCompressed, inflationRewardsCollector, inflationRewardsCommissionBps, pendingDelegatorRewards, and a latency field on each vote entry.
@solana/rpc-api: SimulateTransactionApiResponseBase now includes fee, loadedAddresses, preBalances, postBalances, preTokenBalances, and postTokenBalances.
@solana/errors: RpcSimulateTransactionResult updated with the same new fields.
Note on replacementBlockhash: Agave v3.x validators now always return replacementBlockhash in simulateTransaction responses (as null when replaceRecentBlockhash is not set). Kit's types still model this field as conditionally present based on config. A future breaking change will move it to the base response type as TransactionBlockhashLifetime | null to match v3.x behavior. Consumers using v3.x validators may see this field at runtime even when Kit's types don't surface it.
Note on Agave v3.x validator behavior: Validators running Agave v3.x no longer return a dedicated TRANSACTION_SIGNATURE_VERIFICATION_FAILURE RPC error for invalid signatures in simulateTransaction or sendTransaction. Instead, simulateTransaction returns a result with err: "SignatureFailure", and sendTransaction returns a preflight failure with the signature error as the cause. This is a validator-level change and does not affect Kit's API surface.
[@solana/kit, @solana/plugin-interfaces] #1551 d24f908 Thanks @mcintyre94! - Add ClientWithSubscribeToPayer and ClientWithSubscribeToIdentity interfaces. These are a framework-agnostic convention for plugins that mutate client.payer / client.identity reactively — they install a sibling subscribeToPayer / subscribeToIdentity function so consumers can observe changes without naming the specific plugin that provides them.
[@solana/kit, @solana/rpc-types] #1578 0e8fd3f Thanks @lorisleiva! - Add Sol, sol(), solToLamports, and lamportsToSol helpers for converting between SOL amounts expressed as @solana/fixed-points values and Lamports branded bigints. Also add getSolEncoder, getSolDecoder, and getSolCodec for serializing SOL amounts to bytes (the encoder accepts both Sol and Lamports inputs; the decoder always returns Sol). Finally, update getLamportsEncoder/getDefaultLamportsEncoder and their codec counterparts to also accept Sol as input.
[@solana/promises] #1549 8d73de5 Thanks @mcintyre94! - Added isAbortError(err) — returns true if err is an Error whose name is 'AbortError'. Use it to distinguish abort rejections from other failures without having to instanceof-check every platform-specific error class.
[@solana/plugin-core] #1569 b1ae82b Thanks @lorisleiva! - Fix extendClient so that a later plugin can override a key previously set by an earlier plugin. Previously, chaining two plugins that set the same key threw TypeError: Cannot redefine property because the frozen client's non-configurable property descriptors were copied verbatim onto the intermediate object.
[@solana/wallet-account-signer] #1548 f9bf4ef Thanks @mcintyre94! - Widen the chain parameter on createSignerFromWalletAccount, createTransactionSignerFromWalletAccount, and createTransactionSendingSignerFromWalletAccount from SolanaChain to SolanaChain | (IdentifierString & {}). The known Solana chain identifiers continue to autocomplete, but any Wallet Standard ${namespace}:${reference} value is now also accepted, matching the underlying solana:signTransaction and solana:signAndSendTransaction feature inputs.
096c48e Thanks @lorisleiva! - Bump the TypeScript peer dependency floor from >=5.0.0 to >=5.4.0.Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →