solana_kit_subscribable 0.10.0
solana_kit_subscribable: ^0.10.0 copied to clipboard
Subscribable and observable pattern 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
0.9.3 - 2026-09-12 #
Changed #
- No package-specific changes were recorded;
solana_kit_subscribablewas updated to 0.9.3 as part of groupmain.
0.9.2 - 2026-09-06 #
π Fixed #
Propagate stream errors and cancellation
Contain native source errors and malformed notification type/transformer failures within subscription streams, where consumer error handlers can receive them. Release reactive connection listeners when caller cancellation fires, and avoid opening a connection after a loading subscriber resets or disposes its store.
Fix reactive stream bridge cancellation while awaiting a quiet store, unsubscribe after predicate failures, and preserve latest-value delivery and error precedence while consumers are paused.
0.9.1 - 2026-08-30 #
Changed #
- No package-specific changes were recorded;
solana_kit_subscribablewas updated to 0.9.1 as part of groupmain.
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.
0.8.0 - 2026-08-19 #
Changed #
- No package-specific changes were recorded;
solana_kit_subscribablewas updated to 0.8.0 as part of groupmain.
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
transactionIntrospectionerror domain + codes (transactionFailedToDecompileInstructionAccountIndexOutOfRange,transactionIntrospectionCannotDecodeJsonParsedTransaction,transactionIntrospectionUnrecognizedGetTransactionResponse) and instruction-plans max-instructions codes (instructionPlansInvalidMaxInstructionsPerTransaction,instructionPlansMaxInstructionsPerTransactionExceeded). - solana_kit_codecs_data_structures:
createDependentStructDecoderfluent builder for structs whose later fields depend on earlier decoded values. - solana_kit_instruction_plans: configurable
maxInstructionsPerTransaction(default 16, limit 64) onTransactionPlannerConfig, individualTransactionPlannerinvocations, andMessagePacker; invocation-specific planner values take precedence without leaking to later calls. - solana_kit_rpc_types:
isSolanaRpcResponseruntime guard. - solana_kit: removed the local
getMinimumBalanceForRentExemptionhelper (rent exemption is becoming dynamic; use the RPC method instead). - solana_kit_subscribable:
ReactiveStreamStorev7 rewrite β caller-drivenconnect()/reset()/withSignal(), startsidle, collapsesretryingintoloading(stale-while-revalidate), renamesgetUnifiedState()βgetState(); removedretry(), value-onlygetState(),getError().ReactiveActionStorenow passes a freshCancellationTokento every action, cancels superseded/reset/disposed dispatches, suppresses late outcomes, exposes caller cancellation throughwithSignal(), 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 thesolana_kitumbrella. - 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(notBigInt); rent sysvar union (lamportsPerBytevs deprecatedburnPercent/exemptionThreshold/lamportsPerByteYear); stakewarmupCooldownRateoptional; configslashPenalty/warmupCooldownRatedeprecated; keep vote commissions and latency asintin 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 newassertOffchainMessageV1Equalhelper.offchainMessageRequiredSignatoriesDoNotMatchExpected(5607019) β same.subscribableStreamClosedWithoutError(8195001) β from@solana/subscribable's newbridgeStoreToAsyncIterablehelper.
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
tokenBalancesConfigsexport (accountIndex,uiTokenAmount.decimals,uiTokenAmount.uiAmount). getTransaction,getBlock, andsimulateTransactionnow allow-listuiTokenAmount.uiAmount(previously upcast toBigIntwhen whole).simulateTransactionnow allow-lists token-balanceaccountIndexanduiTokenAmount.decimals.getTransactionandgetBlocknow allow-list the transactionversion(previously arrived as0nwhile typechecking as0).getTransactionsForAddressallowed-numeric keypaths.
solana_kit
Adds the v7.1.0 client-interface helpers:
ClientWithGetMinimumBalanceandClientWithFetchAccountsinterfaces.createClientWithGetMinimumBalanceFromRpcβ computes the rent-exempt minimum balance viagetMinimumBalanceForRentExemption(with thewithoutHeaderrate-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
getTransactionsForAddressresponse types:signaturesandfullmodes (with per-entry base fields, transaction/status variants, and theTransactionDetailsenum). - Adds the shared
meta.costUnitsfield to the transaction meta types.
Already present in the Dart port (no change needed):
@solana/codecs-data-structuresgetBitArrayEncodernext-offset fix (offset + size) β the Dart encoder already returnsoffset + size.@solana/transaction-messagescompressTransactionMessageUsingAddressLookupTablesrejecting v1 transactions β a compile-time-only type narrowing upstream; not expressible in Dart's single-classTransactionMessagemodel, so no runtime change.
@solana/react changes are not ported (React-only).
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.
downwas a duplicate oftruncβ useFixedPointRoundingMode.trunc.halfUpwas a duplicate ofroundβ useFixedPointRoundingMode.round.up("round away from zero") has no single replacement. Usefloororceildepending on the sign of the value, orroundfor 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(fromsolana_kit_subscribable)AbortControllerβCancellationTokenSource(fromsolana_kit_subscribable)controller.signalβsource.tokencontroller.abort([reason])βsource.cancel([reason])signal.isAbortedβtoken.isCancelledsignal.reasonβtoken.reasonsignal.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>toFuture<NotificationStreams>. RpcSubscriptionsChannelnow exposesNotificationStreams get streamsinstead of theon(channelName, subscriber)method.createDataPublisher(),WritableDataPublisher,DataPublisher, and theDataPublisherStreamsextension are removed.- The
*FromDataPublisherhelpers 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
π Feature #
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/errors6.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). Addssubscribableandwalleterror domains. UpdatesunwrapSimulationErrorto treat resource-limit simulation failures as simulation errors. -
solana_kit_subscribable: Adds
ReactiveActionStore<TArgs, TResult>with idle/running/success/error states,dispatch/dispatchAsync/reset. AddsReactiveStreamStore<T>with loading/loaded/error/retrying states,getUnifiedStateandretry. Mirrors upstream@solana/subscribable6.10. -
solana_kit_rpc_spec: Adds
PendingRpcRequest.reactiveStore()returning aReactiveActionStorefor reactive request dispatch. -
solana_kit_rpc_api: Adds
clientIdtoClusterNode. DocumentstpuandtpuForwardsas 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.
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
π Feature #
Refactor subscriptions to stream-native APIs
Refactor subscription internals toward stream-native Dart APIs while keeping the existing DataPublisher and AbortSignal compatibility APIs available as deprecated APIs.
Added stream-native helpers for channel streams, demultiplexing, reactive stores, and data/error stream composition, and migrated internal subscription consumers to use Dart Stream/StreamSubscription flows where possible.
Owner: Ifiok Jr. Β· Introduced in: 6fcc74a Β· Last updated in: 9988103
π§ͺ 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 #
π 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
Document stream-first subscription preference
Document stream-first preference in solana_kit_subscribable and rpc_subscriptions; DataPublisher remains as a compatibility layer.
Owner: Ifiok Jr. Β· Introduced in: 29e8823 Β· Last updated in: 12316d5
Add reactive store for subscription flows
Add the reactive store helper used by slot-trackingβ¦
Add the reactive store helper used by slot-tracking RPC/subscription flows, including subscriber notification, initial value, and update coverage.
Owner: Ifiok Jr. Β· Introduced in: 9ee2e44 Β· Last updated in: 0ee3d60