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

Primary RPC client for the Solana Kit Dart SDK.

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

0.9.3 - 2026-09-12 #

Changed #

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

0.9.2 - 2026-09-06 #

🐛 Fixed #

Honor RPC HTTP cancellation and protect credentials

Honor RPC cancellation signals while sending HTTP requests and streaming response bodies. Keep requests with cancellation signals independent so cancelling one caller cannot cancel another caller's request. Require http 1.5 or newer for native request abortion support.

Reject HTTP redirects without forwarding custom authentication headers to the redirect destination.

Prevent connection, cancellation, and response-stream HTTP exceptions from exposing credentials embedded in endpoint URLs or client error messages.

Owner: @ifiokjr · Review: PR #238

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

0.9.1 - 2026-08-30 #

Changed #

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

0.9.0 - 2026-08-30 #

📖 Documentation #

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_rpc was updated to 0.8.0 as part of group main.

0.7.0 - 2026-08-18 #

📖 Documentation #

Reformat package docs

Docs have been reformatted to remove line wrapping.

Owner: @ifiokjr · Review: PR #212

0.6.0 - 2026-08-12 #

📖 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

🧪 Testing #

Improve test coverage to 95%+ across all packages

Added 500+ tests covering equality/hashCode/toString, codec edge cases, error paths, and constructor variants. Removed dead code in fast_stable_stringify. Fixed concurrent modification bug in subscribable.

Owner: Ifiok Jr. · Introduced in: 48216f9 · Last updated in: b7f5419

0.4.0 - 2026-05-30 #

🚀 Feature #

Add typed value methods to RPC methods

Add typed value convenience methods to SolanaRpcMethods…

Add typed value convenience methods to SolanaRpcMethods extension

Five new methods join the existing raw-request helpers on Rpc:

  • getAccountInfoValue(address, config) — returns PendingRpcRequest<SolanaRpcResponse<Map<String, Object?>?>>, parsing the JSON-RPC response envelope into a typed SolanaRpcResponse wrapper so callers access .value and .context.slot directly instead of manually navigating the raw map.
  • getBalanceValue(address, config) — returns PendingRpcRequest<SolanaRpcResponse<Lamports>>, converting the integer balance into a Lamports value type.
  • getLatestBlockhashValue(config) — returns PendingRpcRequest<SolanaRpcResponse<LatestBlockhashValue>>, parsing the blockhash and last-valid-block-height into a structured model.
  • getMultipleAccounts(addresses, config) — raw multi-account fetch returning PendingRpcRequest<Map<String, Object?>>.
  • getMultipleAccountsValue(addresses, config) — typed multi-account fetch returning PendingRpcRequest<SolanaRpcResponse<List<Map<String, Object?>?>>>.

Each *Value method uses an internal _mapPendingRpcRequest adapter that wraps the underlying raw request plan and applies a response parser, keeping the transport and plan plumbing intact. The existing raw methods (getAccountInfo, getBalance, getLatestBlockhash, etc.) remain unchanged, so this is purely additive.

Additionally, the createSolanaJsonRpcIntegerOverflowError helper now calls createSolanaError(...) instead of the SolanaError(...) constructor, and uses SolanaErrorContextKeys.methodName and SolanaErrorContextKeys.path for standardised context keys. This aligns error construction with the rest of the solana_kit_errors surface.

The README code examples have been updated to demonstrate the preferred typed-call pattern (rpc.getLatestBlockhashValue().send()) and a new "Preferred Dart path" callout section guides users toward typed helpers before falling back to raw rpc.request(...).

Owner: Ifiok Jr. · Introduced in: 6fd8642 · 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