solana_kit 0.10.0 copy "solana_kit: ^0.10.0" to clipboard
solana_kit: ^0.10.0 copied to clipboard

Umbrella package re-exporting all Solana Kit Dart SDK packages.

Changelog #

All notable changes to this project will be documented in this file.

This changelog is managed by monochange.

0.10.0 - 2026-09-21 #

Breaking changes #

Raise the Dart and Flutter baseline

The workspace now builds against Dart 3.13.3 and Flutter 3.47.4, and every package declares that floor instead of the previous Dart 3.12 range. Consumers on older SDKs can no longer resolve these packages, so this release is breaking even though no Dart API changed.

The Flutter floor rises from 3.44 to 3.47 for solana_kit_mobile_wallet_adapter, solana_kit_mobile_wallet_adapter_protocol, and solana_kit_wallet_adapter, matching the floor solana_kit_wallet_ui already required. solana_kit_lints ships the raised floor to consumers, so it carries the same breaking bump. Every other package raises only the Dart SDK floor.

Raising the language version also switches dart format to the tall style, so 83 files across library, test, script, and Codama-generated trees are reflowed. The renderer pipes generated output through dart format, so regenerating stays consistent.

Align your own SDK constraint with the workspace:

environment:
  sdk: ^3.13.0
  # Omit for pure Dart packages; required for the Flutter packages above.
  flutter: ">=3.47.0"

Owner: Ifiok Jr. · Introduced in: 5f5fe01 · Last updated in: 19932db

Features #

Replace stubbed functions with real implementations

Several public functions promised behavior they did not deliver. Each is now implemented, with the missing API surface added alongside it.

estimateResourceLimitsFactory now simulates

The previous implementation returned its argument unchanged, so it performed no simulation: no compute unit measurement, no loaded accounts data size, no failure reporting. It also could not have worked where it lived, because it needs an RPC client and the transaction compiler, and solana_kit_transaction_messages depends on neither. Upstream defines this function in the umbrella @solana/kit package for the same reason, so it now lives in package:solana_kit with that dependency available.

It takes an EstimateResourceLimitsFactoryConfig holding the RPC client and returns a function that:

  • Sets the compute unit limit to the maximum (1400000) and, for version 1 messages, the loaded accounts data size limit to the maximum (67108864) before simulating, so the simulation is not cut short by a resource ceiling.
  • Asks the node to replace the blockhash for blockhash-lifetime transactions, and uses the real nonce for durable nonce transactions.
  • Returns the unitsConsumed the node reported, capped at the u32 ceiling, plus loadedAccountsDataSize.
  • Throws transactionFailedToEstimateComputeLimit when the node reports no compute units, transactionFailedToEstimateLoadedAccountsDataSizeLimit when a version 1 simulation omits the loaded accounts size, and transactionFailedWhenSimulatingToEstimateResourceLimits with the decoded transaction error as cause when the transaction itself fails. All three codes already existed and were never thrown.

Three supporting pieces land with it:

  • simulateTransaction and its simulateTransactionValue result are now available on the RPC client. The method was reachable only by hand-assembling a request before this.
  • maxLoadedAccountsDataSizeLimit (67108864) is exported.
  • estimateAndSetResourceLimitsFactory no longer computes a loaded accounts data size for legacy and version 0 messages. It previously did, which spent an extra simulation and could attach a SetLoadedAccountsDataSizeLimit instruction the runtime ignores. The loaded accounts limit is now only ever set on version 1 messages, matching upstream.
final estimate = estimateResourceLimitsFactory(
  EstimateResourceLimitsFactoryConfig(rpc: rpc),
);
final withLimits = await estimateAndSetResourceLimitsFactory(estimate)(message);
solana_kit_functional removed

The package is gone. Its only utility, the pipe extension, has lived in solana_kit_transaction_messages since the previous breaking release and is re-exported by solana_kit, so the package duplicated what the SDK already provided and existed only as an empty placeholder pending retirement. Anyone still importing it should switch to solana_kit_transaction_messages (or the solana_kit umbrella), which is a one-line import change.

solana_kit_addresses gains the PDA guards

isProgramDerivedAddress and assertIsProgramDerivedAddress were absent, leaving addressesMalformedPda and addressesPdaBumpSeedOutOfRange defined but unreachable. Both are now implemented: they validate that a value is an (Address, int) record, that the bump seed is in [0, 255], and that the address is well formed.

solana_kit_helius builds real smart transactions

createSmartTransaction returned a bare blockhash while documenting that it would estimate compute units and priority fees. It now performs the full sequence: validate, estimate compute units through simulateTransaction, sample the priority fee by account key, resolve the fee in both microLamports-per-unit and total lamports, and refresh the blockhash. It returns a SmartTransaction carrying the limits, fee, lifetime, instructions, fee payer, and account keys; signing stays with the caller because the client holds signer addresses rather than keys.

Two related silent defaults were removed:

  • getComputeUnits returned 200000 when the node omitted unitsConsumed. It now throws, because inventing a number sizes the transaction for work the simulation never confirmed. It also reports a failed simulation instead of returning the units of one that did not succeed, and it serializes real Instruction objects, which previously failed at JSON encoding.
  • broadcastTransaction, sendTransactionWithSender, and sendSmartTransaction accepted a senderUrl parameter they never used. The parameter is gone; the REST client already targets the sender base URL.
Version 1 durable nonce transactions are recognized

getTransactionLifetimeConstraintFromCompiledTransactionMessage only inspected the legacy instruction list, which a version 1 compiled message leaves empty in favour of separate instruction headers and payloads. Every version 1 durable nonce transaction therefore decompiled as a blockhash transaction, so a caller could not tell that its lifetime depended on a nonce. The version 1 branch now reads the headers and payloads, throws transactionInvalidNonceAccountIndex for an out-of-range nonce account index, and returns the blockhash lifetime only when the first instruction is genuinely not an advance-nonce instruction.

Priority fee lamports API

getTransactionMessagePriorityFeeLamports and setTransactionMessagePriorityFeeLamports add the missing read/write surface for the total-lamport priority fee that only version 1 messages carry. The setter removes the fee on null, drops an emptied config, and is a no-op when the value already matches.

Wallets can now express and check version 1 support

SolanaTransactionVersion gains version1 plus wireValue and fromWireValue, so the values a wallet advertises (legacy, 0, 1) round-trip instead of being collapsed. A supportsVersion1 extension makes the check usable. Two related corrections:

  • The browser registry used to map any advertised entry other than legacy onto version 0, so a wallet advertising 1 was reported as version 0 and a caller could build a transaction the wallet cannot sign. Unrecognized entries are now dropped rather than mislabelled.
  • The MWA-backed mobile wallet advertises an explicit legacy-and-version-0 list instead of SolanaTransactionVersion.values, which would have silently started claiming version 1 support as the enum grew. This matches upstream's wallet-standard-mobile.
Error codes that were defined but unreachable

Three codes had no throw site. signerWalletAccountCannotSignTransaction is now thrown when a WalletAccountSigner is created for an account advertising neither transaction feature, matching upstream's createSignerFromWalletAccount. heliusApiKeyRequired is thrown by HeliusConfig for a blank key, which previously produced a request that could only fail with a 401. heliusTransactionSimulationFailed replaces a bare StateError when a compute-unit simulation reports a transaction failure.

The remaining defined-but-unthrown codes were checked against upstream and are parity-faithful: upstream defines them without throwing them anywhere either (addressesInvalidBase58EncodedAddress, the four wallet* codes, subscribableRetryNotSupported, transactionInvalidNonceTransactionFirstInstructionMustBeAdvanceNonce), or they belong to abstractions this port intentionally does not have (the React hook path behind signerWalletMultisignUnimplemented, the fs-impl package behind fsUnsupportedEnvironment, the named-channel pubsub plan behind invariantViolationDataPublisherChannelUnimplemented).

solana_kit_dapp_publisher_cli reports unreadable balances

parseLamportsValue returned 0 for a balance response it could not parse. A malformed response therefore looked like an empty wallet. It now throws a FormatException, so a transport or schema change is reported as itself rather than as insufficient funds.

Owner: Ifiok Jr. · Introduced in: 19932db

Track @solana/kit v8.3.0

The workspace now tracks upstream @solana/kit v8.3.0 (previously v8.2.0), and upstream:parity passes against it. This entry maps every change in that upstream release to its Dart counterpart.

Ported in this release:

  • u256 and i256 number codecs (getU256Codec, getI256Codec and their encoder/decoder pairs) serialize 32 bytes, honour the endian option, validate the full range on encode, and decode to BigInt, mirroring the existing 64-bit and 128-bit codecs.
  • Tap codec helpers observe values or bytes without modifying them: tapEncoder, tapDecoder, and tapCodec observe values, while tapEncoderBytes, tapDecoderBytes, and tapCodecBytes observe raw bytes and offsets. Each wrapper preserves the size characteristics of what it wraps, and any tap may throw, which makes them validation guards that need no identity transformEncoder.

Already present before this release, and now covered by the v8.3.0 claim:

  • The getAgGenesisCert RPC method and its allowed numeric keypaths.
  • isSolanaRequest recognising getAgGenesisCert and getTransactionsForAddress, which is also what fixed upstream's bigint parsing for getTransactionsForAddress responses.

No Dart change needed:

  • HasAddress and the InstructionAccountInput / InstructionSignerInput widening are TypeScript type-level changes. Dart has no structural typing, and this port's ResolvedInstructionAccount already wraps an Object value, so it accepts addresses, address-bearing objects, ProgramDerivedAddress values, and AccountMeta role overrides at runtime without a cast.
  • Marking role as readonly on the writable and signer account types is already true here: AccountMeta.role is a final field.
  • createLazyKeyPairSignerFromBytes exists upstream to defer an asynchronous WebCrypto key import. Signer creation in this port is synchronous, so there is nothing to defer and the type is not needed.

Verification:

  • upstream:parity passes against @solana/kit@8.3.0
  • upstream:check reports the metadata is internally consistent for tracked version 8.3.0
  • The @solana/kit reference pin moved to tag v8.3.0

Owner: Ifiok Jr. · Introduced in: 220066e

Fixes #

Add scoped mutation testing tooling

Adds a mutation testing setup built on mutation_test, so the suite can be checked for tests that assert current behavior rather than the intended contract. Coverage cannot detect that failure mode: a test asserting the wrong contract still executes every line.

Four devenv tasks wrap a new driver at scripts/run_mutation_testing.dart:

  • mutation:list shows the configured scopes and their sizes.
  • mutation:check reports how completely each scope's test list covers its transitive dependents.
  • mutation:changed runs only the scopes touched since origin/main.
  • mutation:run runs a scope directly, with --scope, --full, and --coverage options.

Scopes live in config/mutation/scopes.json and pair source files with the test directories that can detect a change in them, covering the numeric codecs, transaction messages, transaction envelopes, string codecs, codec core, keys, PDAs, hashing, and the untrusted-input parsers.

A default run executes only a scope's listed tests, which costs about two seconds per mutant. Because shared packages have many dependents (solana_kit_codecs_numbers has 58, solana_kit_codecs_core has 59), a survivor in code other packages exercise can be a false positive; --full expands the run to every dependent so no survivor is. mutation:check reports the size of that gap per scope.

config/mutation/rules.xml replaces the builtin rule set, which is unsuitable for Dart: the builtin < rule also matches the first character of << and the builtin argument rules reorder call arguments, so both produce mutations that fail to compile and are then reported as survivors. The rules here use lookarounds to match genuine comparisons, and exclude comments and string literals.

This is advisory tooling only. It is not wired into CI: equivalent mutants survive legitimately and would make a required check permanently red. See docs/agents/mutation-testing.md.

Owner: Ifiok Jr. · Introduced in: 186ba3d

0.9.3 - 2026-09-12 #

Changed #

  • No package-specific changes were recorded; solana_kit was updated to 0.9.3 as part of group main.

0.9.2 - 2026-09-06 #

🚀 Feature #

Track @solana/kit v8.2.0

The workspace now tracks upstream @solana/kit v8.2.0 and the parity harness passes against it.

  • New getAgGenesisCert RPC method returning the Alpenglow genesis certificate (or null), with allowed numeric keypaths that keep blockId, bitmap, and signature byte arrays as numbers while upcasting slot to BigInt.
  • isSolanaRequest recognizes getAgGenesisCert and the previously missed getTransactionsForAddress.
  • New createTransactionPlanExecutorWithConcurrentLeaves mirroring upstream: every leaf starts concurrently (including across sequential plans), a failed leaf does not cancel siblings, non-divisible sequential plans are supported, and the executor builds results from the shared callback contract — context stored on the mutable map is preserved on failures.

Reference pins refreshed to the latest upstream tags (compute-budget v0.18.1, memo v0.13.1, token v0.16.1, token-2022 v0.16.1, stake v0.9.1, address-lookup-table v0.14.1, system v0.14.1, loader-v3 v0.6.1 — all packaging-only upstream changes), and the Codama renderer dependencies moved to codama 1.10.2 / renderers-core 1.4.0.

Owner: @ifiokjr · Review: PR #239

🐛 Fixed #

Update the README upstream compatibility claim

The solana_kit README now states the latest supported @solana/kit version as 8.2.0 and that this Dart port tracks upstream APIs and behavior through v8.2.0, matching the claims already propagated across the root readme and the docs site.

Owner: @ifiokjr · Review: PR #240 · Related issues: #239

0.9.1 - 2026-08-30 #

Changed #

  • No package-specific changes were recorded; solana_kit was updated to 0.9.1 as part of group main.

0.9.0 - 2026-08-30 #

🚀 Feature #

Sync upstream @solana/kit v8.1.0

Tracks upstream APIs and behavior through v8.1.0:

  • solana_kit_transaction_messages (breaking): removed the deprecated compute-unit-limit helpers fillTransactionMessageProvisoryComputeUnitLimit and estimateAndSetComputeUnitLimitFactory, matching upstream @solana/kit's removal of the deprecated @solana/kit estimation helpers (#1948). Use fillTransactionMessageProvisoryResourceLimits and estimateAndSetResourceLimitsFactory instead, which additionally reserve and set the loaded accounts data size limit for version 1 transactions. setTransactionMessageComputeUnitLimit and setTransactionMessageConfig now reject compute unit limits the runtime will not honor — an integer outside [0, 1400000] — throwing SolanaErrorCode.transactionComputeUnitLimitOutOfRange, and reject invalid heap sizes — not a multiple of 1024 bytes in [32768, 262144] — throwing SolanaErrorCode.transactionInvalidHeapSize (upstream #1972). Added the upstream heap-size.ts module as getTransactionMessageHeapSize/setTransactionMessageHeapSize with the same validation, and resource_limit_validation.dart with assertIsValidComputeUnitLimit/assertIsValidHeapSize, minHeapSize, maxHeapSize, and heapSizeMultipleOf. Decoding is unaffected: decompileTransactionMessage still returns messages carrying out-of-range values.

    Migration:

    • fillTransactionMessageProvisoryComputeUnitLimit(m) → fillTransactionMessageProvisoryResourceLimits(m).
    • estimateAndSetComputeUnitLimitFactory(estimate) → estimateAndSetResourceLimitsFactory(estimateResourceLimitsFactory(estimate)).
  • solana_kit_transactions (breaking): removed the fixed-size constants transactionPacketSize, transactionPacketHeader, and transactionSizeLimit, matching upstream's removal of TRANSACTION_PACKET_SIZE, TRANSACTION_PACKET_HEADER, and TRANSACTION_SIZE_LIMIT (#1948). Use getTransactionSizeLimit to derive the limit for a specific transaction, or the per-version constants legacyTransactionSizeLimit (1232) and v1TransactionSizeLimit (4096).

    Migration: TRANSACTION_SIZE_LIMIT - getTransactionSize(t) → getTransactionSizeLimit(t) - getTransactionSize(t).

  • solana_kit_errors: added the failedToSignTransaction (13) and failedToSignTransactions (14) error codes with upstream messages, plus the transaction codes transactionComputeUnitLimitOutOfRange (5663039) and transactionInvalidHeapSize (5663040) (upstream #1902, #1972).

  • solana_kit_instruction_plans: added createFailedToSendTransactionError, createFailedToSendTransactionsError, createFailedToSignTransactionError, createFailedToSignTransactionsError, and createFailedToExecuteTransactionPlanError, mirroring upstream @solana/instruction-plans' transaction-plan-errors.ts (#1902, #1434). The signing factories carry the same non-enumerable transactionPlanResult and optional logs/preflightData context as their sending counterparts, but the message includes no submission-location indicator because signing never submits. The executor now throws through createFailedToExecuteTransactionPlanError.

  • solana_kit: added the ClientWithTransactionSending and ClientWithTransactionSigning client interfaces, mirroring upstream @solana/plugin-interfaces (#1899). signTransaction/signTransactions accept the same flexible inputs as their sending counterparts and return signed transactions without submitting them. Sending results guarantee a signature-bearing context; signing makes no default guarantee about the context, matching the upstream TContext parameterization (adapted to Dart's map-based result contexts).

  • solana_kit_rpc_transformers (breaking): removed getBigIntDowncastRequestTransformer, matching upstream #1948. It was no longer used by the default Solana RPC request transformer: the Solana RPC transport serializes BigInt values losslessly as large integer literals via stringifyJsonWithBigInts, and Agave parses JSON integers across the full u64 range without precision loss, so downcasting BigInts to (potentially lossy) ints is unnecessary. getDefaultRequestTransformerForSolanaRpc no longer downcasts; if you still need this behavior, recreate it with getTreeWalkerRequestTransformer and a visitor that replaces BigInt nodes with int values.

  • solana_kit_rpc_transformers: the numeric allow-list keeps transactionConfig.computeUnitLimit, transactionConfig.heapSize, and transactionConfig.loadedAccountsDataSizeLimit from version 1 transaction responses as numbers instead of upcasting them to BigInt (upstream #1951).

  • Documentation now tracks @solana/kit v8.1.0, and the reference pin in config/reference-repos.json moved to bb54243d8a57 (tag v8.1.0).

Migration example:

// Before (removed):
// final estimate = estimateComputeUnitLimitFactory(rpc);
// var message = await estimateAndSetComputeUnitLimitFactory(estimate)(message);
// final freeBytes = transactionSizeLimit - getTransactionSize(transaction);

// After:
final estimate = estimateResourceLimitsFactory(rpc);
var message = await estimateAndSetResourceLimitsFactory(estimate)(message);
final freeBytes =
    getTransactionSizeLimit(transaction) - getTransactionSize(transaction);

Owner: @ifiokjr · Review: PR #225 · Related issues: #1899, #1902, #1910, #1913, #1948, #1951, #1957, #1970, #1971, #1972, #1979, #220

🐛 Fixed #

Sync upstream @solana/kit v7.1.1

Tracks upstream APIs and behavior through v7.1.1:

  • solana_kit: README now documents v7.1.1 as the latest supported upstream version.
  • solana_kit_codecs_strings: base-X decoders now report the end of the buffer as the next offset when no bytes remain to decode, matching upstream @solana/codecs-strings (#1926).
  • solana_kit_rpc_transformers: subscription responses for blockSubscribe/blockNotification now consult the blockNotifications numeric allow-list, matching upstream @solana/rpc-transformers (#1925).
  • solana_kit_instruction_plans: successfulSingleTransactionPlanResultFromTransaction is deprecated in favor of successfulSingleTransactionPlanResult with an explicit context, matching upstream @solana/instruction-plans (#1924).

Owner: @ifiokjr · Review: PR #220 · Related issues: #1924, #1925, #1926

📖 Documentation #

Typed tuple codecs and explicit integer factories

Add typed getTuple2Encoder/getTuple2Decoder helpers to solana_kit_codecs_data_structures, exposing two-element tuples as Dart records. Give the integer codec factories in solana_kit_codecs_numbers explicit generic specializations while preserving their existing FixedSizeEncoder<num> public return types. codama-renderers-dart now emits getTuple2* for arity-2 tuple nodes, escapes Dart reserved-word identifiers, keeps generated instructionData locals collision-free, and gives generated byte/list fields recursive value equality and hashing.

Owner: @ifiokjr · Review: PR #227

Unslop package docs and code comments

Rewrote every package README from a reader's perspective with verified, compilable examples, removed AI-tell phrasing from docs and code comments, and added a test that analyzes every Dart block in Markdown so examples cannot drift from the API.

Owner: @ifiokjr · Review: PR #223

0.8.0 - 2026-08-19 #

Changed #

  • No package-specific changes were recorded; solana_kit was updated to 0.8.0 as part of group main.

0.7.0 - 2026-08-18 #

💥 Breaking Change #

@solana/kit v7.0.0 upstream sync (foundational breaking changes)

Ports the foundational breaking changes from @solana/kit v7.0.0:

  • solana_kit_errors: new transactionIntrospection error domain + codes (transactionFailedToDecompileInstructionAccountIndexOutOfRange, transactionIntrospectionCannotDecodeJsonParsedTransaction, transactionIntrospectionUnrecognizedGetTransactionResponse) and instruction-plans max-instructions codes (instructionPlansInvalidMaxInstructionsPerTransaction, instructionPlansMaxInstructionsPerTransactionExceeded).
  • solana_kit_codecs_data_structures: createDependentStructDecoder fluent builder for structs whose later fields depend on earlier decoded values.
  • solana_kit_instruction_plans: configurable maxInstructionsPerTransaction (default 16, limit 64) on TransactionPlannerConfig, individual TransactionPlanner invocations, and MessagePacker; invocation-specific planner values take precedence without leaking to later calls.
  • solana_kit_rpc_types: isSolanaRpcResponse runtime guard.
  • solana_kit: removed the local getMinimumBalanceForRentExemption helper (rent exemption is becoming dynamic; use the RPC method instead).
  • solana_kit_subscribable: ReactiveStreamStore v7 rewrite — caller-driven connect()/reset()/withSignal(), starts idle, collapses retrying into loading (stale-while-revalidate), renames getUnifiedState() → getState(); removed retry(), value-only getState(), getError(). ReactiveActionStore now passes a fresh CancellationToken to every action, cancels superseded/reset/disposed dispatches, suppresses late outcomes, exposes caller cancellation through withSignal(), and preserves stale results and errors while running.
  • solana_kit_transaction_introspection: new first-class package porting @solana/transaction-introspection — RPC transaction decoding, instruction and inner-instruction extraction, loaded-address resolution, and instruction walking helpers; re-exported from the solana_kit umbrella.
  • solana_kit_rpc_parsed_types / solana_kit_rpc_transformers / solana_kit_rpc_api: Agave 4.1.0 parsed-account types — vote commissions/latency as int (not BigInt); rent sysvar union (lamportsPerByte vs deprecated burnPercent/exemptionThreshold/ lamportsPerByteYear); stake warmupCooldownRate optional; config slashPenalty/warmupCooldownRate deprecated; keep vote commissions and latency as int in the numeric-keypath allow-lists.

Migration: getMinimumBalanceForRentExemption(space) → rpc.getMinimumBalanceForRentExemption(space).send(); store.retry() → store.connect(); store.getUnifiedState() → store.getState(); the deprecated ReactiveStore/createReactiveStoreFromStreams → createReactiveStreamStore; reactive actions must migrate from (args) async => result to (signal, args) async => result.

// Before
final lamports = getMinimumBalanceForRentExemption(space);
store.retry();
final state = store.getUnifiedState();

// After
final lamports = await rpc.getMinimumBalanceForRentExemption(space).send();
store.connect();
final state = store.getState();

Owner: @ifiokjr · Review: PR #204

🚀 Feature #

@solana/kit v7.1.0 upstream sync

Ports the @solana/kit v7.1.0 changes into the Dart SDK.

solana_kit_errors

Adds the three new error codes introduced in @solana/kit v7.1.0:

  • offchainMessageContentDoesNotMatchExpected (5607018) — from @solana/offchain-messages's new assertOffchainMessageV1Equal helper.
  • offchainMessageRequiredSignatoriesDoNotMatchExpected (5607019) — same.
  • subscribableStreamClosedWithoutError (8195001) — from @solana/subscribable's new bridgeStoreToAsyncIterable helper.
solana_kit_subscribable

Adds bridgeStoreToAsyncIterable, which adapts a ReactiveStreamStore into a pull-based Stream (the Dart equivalent of the upstream AsyncIterable). It seeds from the store's current snapshot, yields loaded values (latest-wins), throws on error (substituting subscribableStreamClosedWithoutError when the error payload is nullish), and ends cleanly when the CancellationToken fires. The caller owns the store's lifecycle (connect()/reset()).

solana_kit_offchain_messages

Adds assertOffchainMessageV1Equal, which asserts that a version 1 offchain message received from an untrusted signer is the message you expected it to sign. Compares content (reporting UTF-8 byte lengths) and required signatories (order-insensitive, sorted for comparison), throwing offchainMessageContentDoesNotMatchExpected / offchainMessageRequiredSignatoriesDoNotMatchExpected on mismatch.

solana_kit_instruction_plans

createTransactionPlanExecutor's executeTransactionMessage callback may now return the context of a successful result (a map that must include a signature) instead of a Signature or Transaction. The returned context is merged with the mutable context, taking precedence. Returning a Signature or Transaction still behaves as before (stored as context['signature'] / context['transaction'] with the signature derived).

solana_kit_rpc_transformers / solana_kit_rpc_api
  • New tokenBalancesConfigs export (accountIndex, uiTokenAmount.decimals, uiTokenAmount.uiAmount).
  • getTransaction, getBlock, and simulateTransaction now allow-list uiTokenAmount.uiAmount (previously upcast to BigInt when whole).
  • simulateTransaction now allow-lists token-balance accountIndex and uiTokenAmount.decimals.
  • getTransaction and getBlock now allow-list the transaction version (previously arrived as 0n while typechecking as 0).
  • getTransactionsForAddress allowed-numeric keypaths.
solana_kit

Adds the v7.1.0 client-interface helpers:

  • ClientWithGetMinimumBalance and ClientWithFetchAccounts interfaces.
  • createClientWithGetMinimumBalanceFromRpc — computes the rent-exempt minimum balance via getMinimumBalanceForRentExemption (with the withoutHeader rate-recovery trick).
  • createClientWithFetchAccountsFromRpc — dispatches on address count (getAccountInfo / getMultipleAccounts / empty short-circuit).
  • createClientWithInterfacesFromRpc — returns both interfaces.

Also re-exports the @solana/promises helpers as Dart counterparts: isAbortError, getAbortablePromise, and safeRace (adapted to Dart's cancellation model via CancellationToken; AbortError lives in solana_kit_subscribable).

solana_kit_rpc_api

Adds the getTransactionsForAddress RPC method request side: config (commitment, filters, limit, minContextSlot, paginationToken, sortOrder, encoding, maxSupportedTransactionVersion, transactionDetails), filters (blockTime/signature/slot comparisons, status, tokenAccounts), and the params builder.

solana_kit_rpc_types
  • Adds the getTransactionsForAddress response types: signatures and full modes (with per-entry base fields, transaction/status variants, and the TransactionDetails enum).
  • Adds the shared meta.costUnits field to the transaction meta types.

Already present in the Dart port (no change needed):

  • @solana/codecs-data-structures getBitArrayEncoder next-offset fix (offset + size) — the Dart encoder already returns offset + size.
  • @solana/transaction-messages compressTransactionMessageUsingAddressLookupTables rejecting v1 transactions — a compile-time-only type narrowing upstream; not expressible in Dart's single-class TransactionMessage model, so no runtime change.

@solana/react changes are not ported (React-only).

Owner: @ifiokjr · Review: PR #206

🐛 Fixed #

Kit-plugin style Surfpool client + SDK-based integration tests

solana_kit_surfpool (minor)

Add createSurfpoolClient() / connectSurfpoolClient() returning a SurfpoolClient wired up like the @solana/surfpool/kit plugin for TypeScript:

  • rpc / rpcSubscriptions — Solana Kit RPC and subscriptions clients pointed at the Surfnet.
  • payer — the Surfnet's pre-funded KeyPairSigner (embedded mode) or a caller-provided funded signer (attach mode).
  • cheatcodes — a typed SurfnetCheatcodes RPC covering every surfnet_* cheatcode with the prefix stripped (timeTravel, pauseClock, setAccount, writeProgram, …).
  • rpcUrl / wsUrl — the Surfnet's HTTP and WebSocket URLs.
  • airdrop / getMinimumBalance — funding and rent-exemption helpers.
  • stop() — idempotent teardown that stops the Surfnet when this client started it.

createSurfpoolClient stops the Surfnet if wiring fails, so no orphaned process or ports are left behind. The new API is fully unit-tested with 100% patch coverage.

codama-renderers-dart (patch)

Fix visitSizePrefixType so BigInt-width size prefixes (u64/u128/i64/i128) generate transformEncoder/transformDecoder wrappers instead of substituting u32. The system program's bincode String length is u64, so the u32 substitution broke on-chain encoding of seed fields.

solana_kit_system (patch)

Regenerate the system program client with the size-prefix renderer fix; createAccountWithSeed, allocateWithSeed, assignWithSeed, and transferSolWithSeed now encode their u64 String-length prefixes correctly.

solana_kit_errors (patch)

Fix getSolanaErrorFromTransactionError to handle account_index values returned as BigInt by some RPC nodes (e.g. SurfPool), matching the earlier instruction-error-index fix.

solana_kit (patch)

Convert test/integration/rpc_basic_test.dart to start its own Surfpool via the SDK instead of requiring an externally launched validator.

solana_kit_mpl_bubblegum (patch)

Convert the compressed-NFT integration test to start its own Surfpool via the SDK; add solana_kit_surfpool as a dev dependency.

solana_kit_integration_tests (minor)

Integration tests now start their own Surfpool per test file via the SDK (auto-allocated ports, parallel-safe) instead of requiring an externally launched instance. Adds the gap-coverage tests: loader full deploy, system seed-based instructions, config store (committed config-v3.0.0.so artifact), subscriptions on-chain lifecycle, ALT extend/deactivate/close, error paths, token/2022 transfer+burn+setAuthority+closeAccount, stake authorize, and ATA idempotency.

// Before: manual Surfnet wiring
final surfnet = await Surfnet.start();
final rpc = createSolanaRpc(surfnet.rpcUrl);

// After: kit-plugin style client
final client = await createSurfpoolClient();
final rpc = client.rpc;
final payer = client.payer;
await client.cheatcodes.timeTravel(...);
await client.stop();

Owner: @ifiokjr · Review: PR #208

0.6.0 - 2026-08-12 #

💥 Breaking Change #

Remove deprecated APIs across the SDK

Breaking change. Clears every remove_deprecations_in_breaking_versions lint warning by deleting deprecated members and migrating call sites to their documented replacements. No deprecations are suppressed; each deprecated declaration is removed.

createEmptyClient (solana_kit)

Removed the deprecated createEmptyClient alias. Use createClient instead.

// Before
final client = createEmptyClient({'ready': true});
// After
final client = createClient({'ready': true});
Deprecated fixed-point rounding modes (solana_kit_fixed_points)

Removed the deprecated FixedPointRoundingMode values down, up, and halfUp. The surviving modes are strict, floor, ceil, trunc, round.

  • down was a duplicate of trunc — use FixedPointRoundingMode.trunc.
  • halfUp was a duplicate of round — use FixedPointRoundingMode.round.
  • up ("round away from zero") has no single replacement. Use floor or ceil depending on the sign of the value, or round for nearest.
Deprecated Pipe extension (solana_kit_functional)

Removed the deprecated Pipe extension from solana_kit_functional. Pipe is re-exported from solana_kit_transaction_messages and the solana_kit umbrella. Switch imports accordingly:

// Before
import 'package:solana_kit_functional/solana_kit_functional.dart';
// After
import 'package:solana_kit_transaction_messages/solana_kit_transaction_messages.dart';

solana_kit no longer depends on solana_kit_functional. The solana_kit_functional package is now an empty placeholder pending full retirement.

Deprecated subscriptions compatibility APIs

The deprecated AbortSignal/AbortController and DataPublisher/WritableDataPublisher/createDataPublisher compatibility APIs were the core transport substrate of the subscriptions stack, not a thin compatibility layer. They are replaced by stream-native and cancellation-token equivalents.

Cancellation
  • AbortSignal → CancellationToken (from solana_kit_subscribable)
  • AbortController → CancellationTokenSource (from solana_kit_subscribable)
  • controller.signal → source.token
  • controller.abort([reason]) → source.cancel([reason])
  • signal.isAborted → token.isCancelled
  • signal.reason → token.reason
  • signal.future → token.future

Public field/parameter names that held an AbortSignal (e.g. abortSignal, signal) are kept; only their type changed to CancellationToken. CancellationToken and CancellationTokenSource are re-exported from solana_kit_rpc_subscriptions and solana_kit_rpc_subscriptions_channel_websocket so consumers do not need a direct solana_kit_subscribable dependency.

AbortError, isAbortError, getAbortableFuture, and normalClosureCode remain in solana_kit_rpc_subscriptions_channel_websocket (behavior unchanged; their AbortSignal? params are now CancellationToken?).

DataPublisher → NotificationStreams
  • The transport contract changed from Future<DataPublisher> to Future<NotificationStreams>.
  • RpcSubscriptionsChannel now exposes NotificationStreams get streams instead of the on(channelName, subscriber) method.
  • createDataPublisher(), WritableDataPublisher, DataPublisher, and the DataPublisherStreams extension are removed.
  • The *FromDataPublisher helpers are removed: createStreamFromDataPublisher, StreamFromDataPublisherConfig, createAsyncIterableFromDataPublisher, demultiplexDataPublisher, createReactiveStoreFromDataPublisher, createReactiveStreamStoreFromDataPublisher.
  • The stream-native helpers are kept: ChannelStreamController, createStreamFromDataAndErrorStreams, demultiplexStream, createReactiveStoreFromStreams, ReactiveStore, ReactiveStreamStore, createReactiveStreamStore.
Public subscription APIs

PendingRpcSubscriptionsRequest.subscribe() and .reactive() still return Future<Stream<T>> and Future<ReactiveStore<T>> respectively. Internally they now consume NotificationStreams.notifications / .errors instead of DataPublisher channels.

Migration
// Before
final controller = AbortController();
final stream = await pending.subscribe(
  RpcSubscribeOptions(abortSignal: controller.signal),
);
controller.abort();

// After
final source = CancellationTokenSource();
final stream = await pending.subscribe(
  RpcSubscribeOptions(abortSignal: source.token),
);
source.cancel();

Owner: Ifiok Jr. · Introduced in: 3901c24 · Last updated in: 7d98d00

🐛 Fixed #

Upstream @solana/kit 6.10.0 parity

Updates core packages to match upstream @solana/kit 6.10.0:

  • solana_kit_errors: Adds 6 new error codes from @solana/errors 6.10: JSON_RPC__SERVER_ERROR_NO_SLOT_HISTORY (-32021), JSON_RPC__SERVER_ERROR_FILTER_TRANSACTION_NOT_FOUND (-32020), TRANSACTION__FAILED_TO_ESTIMATE_LOADED_ACCOUNTS_DATA_SIZE_LIMIT (5663036), TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_RESOURCE_LIMITS (5663037), SUBSCRIBABLE__RETRY_NOT_SUPPORTED (8195000), WALLET__ACCOUNT_NOT_AVAILABLE (8900003). Adds subscribable and wallet error domains. Updates unwrapSimulationError to treat resource-limit simulation failures as simulation errors.

  • solana_kit_subscribable: Adds ReactiveActionStore<TArgs, TResult> with idle/running/success/error states, dispatch/dispatchAsync/reset. Adds ReactiveStreamStore<T> with loading/loaded/error/retrying states, getUnifiedState and retry. Mirrors upstream @solana/subscribable 6.10.

  • solana_kit_rpc_spec: Adds PendingRpcRequest.reactiveStore() returning a ReactiveActionStore for reactive request dispatch.

  • solana_kit_rpc_api: Adds clientId to ClusterNode. Documents tpu and tpuForwards as deprecated in favor of QUIC fields.

  • solana_kit_transaction_messages: Adds resource-limit estimation helpers: ResourceLimitsEstimate, estimateResourceLimitsFactory, estimateAndSetResourceLimitsFactory, fillTransactionMessageProvisoryResourceLimits, getTransactionMessageLoadedAccountsDataSizeLimit, setTransactionMessageLoadedAccountsDataSizeLimit.

Owner: @ifiokjr · Review: PR #195

📖 Documentation #

Centralize package version documentation

Centralize package version metadata in versions.json and render package installation snippets from the shared MDT data source. Published package behavior is unchanged.

Owner: @ifiokjr · Review: PR #188

Point package README website badges at package docs

Updated package README website badges to link directly to each package's docs catalog entry and added missing package entries to the documentation website catalog/index.

Owner: @ifiokjr · Review: PR #192

0.5.0 - 2026-06-01 #

💥 Breaking Change #

Raise minimum Dart SDK to 3.12

Raise the minimum supported Dart SDK constraint to ^3.12.0 across public Dart packages.

This is a breaking change because consumers must use Dart 3.12 or newer. Flutter consumers must use a Flutter SDK that bundles Dart 3.12 or newer.

environment:
  sdk: ^3.12.0

Owner: Ifiok Jr. · Introduced in: 32d5d36

🐛 Fixed #

Add well-known program, sysvar, SPL, Metaplex, and token mint address constants

Add centralized address constants to solana_kit_addresses so that any package can reference well-known on-chain addresses without importing the full domain package or hardcoding strings.

New exports:

  • program_addresses.dart — All Agave/Solana native program addresses (system, ALT, BPF loaders, compute budget, config, stake, vote, etc.)
  • sysvar_addresses.dart — All sysvar addresses (clock, rent, recentBlockhashes, fees, rewards, etc.) plus the sysvar owner address
  • spl_addresses.dart — SPL program addresses (Token, Token-2022, ATA, Memo, Memo Legacy)
  • metaplex_addresses.dart — Metaplex program addresses (Token Metadata, Bubblegum, Auth Rules, Core, SPL Account Compression, Noop)
  • well_known_addresses.dart — Well-known token mint addresses (Wrapped SOL, USDC, USDT)

Also re-exports from solana_kit_address (Address type, codecs, comparator, PublicKey) and solana_kit_address_constants (well-known address constants).

Owner: Ifiok Jr. · Introduced in: 3f596ef · Last updated in: 4643648

0.4.0 - 2026-05-30 #

🚀 Feature #

Trim program exports from umbrella

Remove program-specific package exports from the…

Remove program-specific package exports from the solana_kit umbrella package so program clients remain explicit imports.

Owner: Ifiok Jr. · Introduced in: 8285b34 · Last updated in: 0ee3d60

📝 Changed #

Restructure release groups

Move program-specific and domain-specific packages out of the main release group into standalone release schedules with independent versioning. Core SDK packages remain synchronized in the main group.

Owner: Ifiok Jr. · Introduced in: fccec7f · Last updated in: 93b3cd3

🐛 Fixed #

Add per-package coverage badges

Add codecov flags and per-package coverage badges to all package READMEs.

Owner: Ifiok Jr. · Introduced in: bed1b1f · Last updated in: 93b3cd3

Add integration tests CI job

Add SurfPool integration test CI job and devenv command for running integration tests.

Owner: Ifiok Jr. · Introduced in: 7983fb5 · Last updated in: 93b3cd3

Add per-package codecov flags

Add Codecov patch coverage and package-level coverage…

Add Codecov patch coverage and package-level coverage flags for Dart and renderer packages.

Owner: Ifiok Jr. · Introduced in: 30e1d19 · Last updated in: 0ee3d60

Fix duplicate ecosystems.dart section in monochange.toml

Merge duplicate [ecosystem.dart] and [ecosystems.dart] TOML sections into a single [ecosystems.dart] section.

Owner: Ifiok Jr. · Introduced in: d5765af

Deploy docs from main pushes

Deploy the docs site from main pushes instead of…

Deploy the docs site from main pushes instead of release-tag events so GitHub Pages deployments comply with the repository's github-pages environment branch policy.

Owner: Ifiok Jr. · Introduced in: 8543d72 · Last updated in: 0ee3d60

Add shared test fixtures and coverage gates

Add shared workspace test fixtures plus risk-tier package…

Add shared workspace test fixtures plus risk-tier package coverage gates so high-risk Solana Kit packages stay above 90% line coverage in CI.

Owner: Ifiok Jr. · Introduced in: ba96efb · Last updated in: 0ee3d60

Expand MDT doc callouts

Expand MDT-backed documentation callouts for preferred…

Expand MDT-backed documentation callouts for preferred Dart paths, compatibility notes, parity status, security guidance, and Android-only Mobile Wallet Adapter platform messaging across the workspace docs and package surfaces.

Owner: Ifiok Jr. · Introduced in: 53acc17 · Last updated in: 0ee3d60

Replace dynamic with Object?

Replace dynamic with Object? across lib source files; remaining dynamic usage is only in test matcher API signatures required by the test package.

Owner: Ifiok Jr. · Introduced in: fe249a4 · Last updated in: 0ee3d60

Add barrel-file re-export tests

Add barrel-file re-export tests for solana_kit and solana_kit_codecs umbrella packages.

Owner: Ifiok Jr. · Introduced in: 29e8823 · Last updated in: 0ee3d60

Expand coverage thresholds to 26 packages

Expand per-package coverage thresholds from 5 packages to…

Expand per-package coverage thresholds from 5 packages to 26 packages; core packages at 80%+, high-risk at 60%+.

Owner: Ifiok Jr. · Introduced in: fe249a4 · Last updated in: 0ee3d60

Add SurfPool integration test directory

Add integration test directory with basic RPC tests…

Add integration test directory with basic RPC tests designed for SurfPool local validator; not run in CI automatically.

Owner: Ifiok Jr. · Introduced in: fe249a4 · Last updated in: 0ee3d60

Enable public_member_api_docs lint

Enable public_member_api_docs lint rule with file-level suppressions for incremental backfill.

Owner: Ifiok Jr. · Introduced in: 29e8823 · Last updated in: 0ee3d60

Add examples/ directory with 26 scripts

Add a top-level examples/ directory with 26 standalone…

Add a top-level examples/ directory with 26 standalone Dart example scripts and a README covering addresses, keys, codecs, structs, options, errors, sysvars, offchain messages, transaction building/signing/confirmation, RPC, subscriptions, accounts, Helius DAS/priority-fees, functional pipe, fast-stable-stringify, address comparator, union codecs, and transaction serialisation.

Owner: Ifiok Jr. · Introduced in: 29e8823 · Last updated in: 0ee3d60

Add solana-program reference repos

Add solana-program/ reference repos to clone:repos with…

Add solana-program/* reference repos to clone:repos with pinned version tracking for all 11 program repos.

Owner: Ifiok Jr. · Introduced in: 0d394fb · Last updated in: 0ee3d60

Add transaction execution boundary

Add a higher-level transaction execution boundary that…

Add a higher-level transaction execution boundary that combines instruction-plan planning, signing, and sending into a single structured outcome, with a signer-based convenience wrapper for common app flows.

Owner: Ifiok Jr. · Introduced in: 69db7ef · Last updated in: 0ee3d60

Add account client and RPC response models

Add a higher-level Solana account client plus typed RPC…

Add a higher-level Solana account client plus typed RPC response wrappers for common account, balance, blockhash, and multi-account request flows.

Owner: Ifiok Jr. · Introduced in: aa54336 · Last updated in: 0ee3d60

Add upstream parity test harness

Add an executable upstream parity harness that compares…

Add an executable upstream parity harness that compares selected Solana Kit Dart behaviors against the tracked @solana/kit release in CI and local development.

Owner: Ifiok Jr. · Introduced in: bf0f168 · Last updated in: 0ee3d60

Expose upstream-compatible client helpers

Expose the new upstream-compatible convenience surface…

Expose the new upstream-compatible convenience surface from the umbrella package. This re-exports the fixed-point helpers, functional helpers, compute-unit estimation helpers, Dart-native client/plugin composition APIs, identity and payer capability interfaces, and slot-tracking stream/reactive-store helpers used to combine an initial RPC value with live subscription updates.

Owner: Ifiok Jr. · Introduced in: 9ee2e44 · Last updated in: 0ee3d60

Fix MDT product callout rendering so preferred-path

Owner: Ifiok Jr. · Introduced in: a7355ff · Last updated in: a526ea3

Move reference repos to config JSON

Move reference repo pins out of devenv.nix into…

Move reference repo pins out of devenv.nix into config/reference-repos.json, and teach clone:repos to read that config and report repo status.

Owner: Ifiok Jr. · Introduced in: 731da8d · Last updated in: 0ee3d60