18 of the 19 published crates are on crates.io at version 0.10.0:
shipstern, shipstern-core, shipstern-proto, shipstern-proc-macro, shipstern-parser, shipstern-mock, shipstern-stream, shipstern-bpf-loader-parser, shipstern-spl-token-parser, shipstern-spl-token-extensions-parser, shipstern-block-meta-parser, shipstern-slot-parser, shipstern-stake-pool-parser, shipstern-solana-rpc-source, shipstern-yellowstone-grpc-source, shipstern-yellowstone-fumarole-source, shipstern-solana-snapshot-source, shipstern-block-coordinator.
shipstern-jetstream-source stays at 0.9.0 on crates.io. Since #315 it depends on jetstreamer-firehose and jetstreamer-utils from the anza-xyz/jetstreamer main branch, because the crates.io 0.7.0 release of those is still on the Agave 3.x stack. crates.io does not accept git-only dependencies, so the 0.10.0 crate will be published once upstream cuts a release on Agave 4.x. Until then use it as a git dependency at the v0.10.0 tag.
See CHANGELOG.md for the full history.
Changed
shipstern.parseandshipstern.handleare nowdebugspans instead ofinfo, so they no longer spaminfo-level trace output (#313 by @ultrasilicon).- Bumped the Solana/Agave dependency stack from
3.xto4.2.2. This is the half of Transaction V1 (SIMD-0385) support that lives in the dependency graph:VersionedMessage::V1first appears insolana-message4.0.0, so a 3.x build cannot represent a v1 message at all. #304 already surfaced the inline budget asInstructionShared::transaction_config. Raises MSRV from 1.90 to 1.93, which Agave 4.2.2 requires (iter::chainin const contexts at 1.91,MaybeUninit::write_copy_of_sliceat 1.93); see #209.enable_tx_v1is activated on devnet and testnet. On mainnet-beta the feature account is funded but still owned by the System program with no data, so it is staged rather than queued. Devnet is already carrying v1 traffic. - Bumped
spl-token-2022from 10 to 11, forced by Agave 4.2.2'sspl-token-group-interface ^0.7.2. Brings thePermissionedBurnextension and its authority type, added to the protoAuthorityTypeenum as value 17, and replacesOptionalNonZeroPubkeywithMaybeNull<Address>.NativeExtensionDatastill rejectsPermissionedBurn, because there is no proto message forPermissionedBurnConfigyet. - Wire-visible behaviour change:
UpdateGroupAuthority.new_authoritynow reportsNonewhere it previously emitted the all-zero sentinel pubkey as a real key. It was built as an unconditionalSome(..);MaybeNull::get()maps the sentinel toNone(Address::NONEis[0u8; 32], so null and the zero key are the same value, exactly as in the deletedopt_nonzero_pubkey_to_byteshelper).InitializeGroup.update_authorityis unchanged, because it already went through that helper. This is a fix, but consumers readingnew_authoritywill see a changed value. shipstern-solana-snapshot-source:bank_forks_utils::load_bank_forkswas replaced upstream bytry_load_bank_forks_from_snapshot, which takes no blockstore and returnsOption. Two consequences beyond the signature. The source no longer opens the blockstore atAccessType::PrimaryForMaintenance, so it no longer takes an exclusive RocksDB lock on the ledger directory, and it now fails with a clear error when the snapshot archives directory holds nothing loadable. Account scanning moved from the now-privateAccountsDb::scan_accountstoBank::scan_all_accounts; accounts-db 4.x deletedScanOrderentirely (ScanConfigispub(crate)and carries only an abort flag), so startup account updates are no longer emitted in pubkey-sorted order. Nothing in shipstern relied on that order.shipstern-solana-rpc-source:solana-client4.x replacedget_program_accounts_with_configwithget_program_ui_accounts_with_config, which returns RPC-encodedUiAccounts. The owner is now parsed from a base58 string and the data decoded, so a malformed owner or an undecodable payload fails the source where previously neither could happen.shipstern-bpf-loader-parser:solana-loader-v3-interface7 dropped theMigrateandExtendProgramCheckedvariants, so the instruction match is exhaustive and an unknown discriminant now fails earlier, inUpgradeableLoaderInstruction::try_from_slice.shipstern-jetstream-source:TransactionStatusMeta.erris serialized withwincodeinstead ofbincode. Agave's ownsolana-storage-protomoved that same proto field to wincode in 4.2, and the field carries opaque bytes, so nothing but convention keeps the two ends agreeing. The encoders still produce identical bytes forTransactionError, so no consumer sees a change today.bincodemoves to a dev-dependency there, where a test asserts it does not produce v1 transaction wire bytes.
Fixed
shipstern-jetstream-source: convertVersionedMessage::V1instead of failing to build, and carry its inline budget through to the proto. The message conversion matched only Legacy and V0 and hardcodedconfig: None. Adding the match arm alone would have compiled and then silently dropped every V1 inline budget, and sinceversionedistruefor both V0 and V1, erased the distinction between them on the wire.configpresence is what marks a message as V1, so it is now wrapped unconditionally: a V1 message that sets no budget fields still serializes asSome(TransactionConfig::default()). V1 carries no address lookup tables, and its lifetime specifier maps onto the existingrecent_blockhashfield (#310).shipstern-jetstream-source: mapRewardType::DeactivatedStake, added in Agave 4.2 with a matching protoDeactivatedStake = 5. Thetransaction_status_metareward mapping had a catch-all arm that turned it intoUnspecified, losing the reward type for anyone reading it (#310).shipstern-jetstream-source: Agave 4.2 removedRewardInfo::commission, sokeyed_rewardsforwards the exactcommission_bpsinstead of deriving it from a percentage. The percent field is still filled in where the basis points divide evenly, sinceshipstern-block-meta-parserexposescommissionand has nocommission_bpsto fall back on.
What's Changed
- docs(readme): bump codegen macro dependency snippets to 0.9.0 by @kespinola in #314
- chore(runtime): downgrade parse/handle spans to debug level by @ultrasilicon in #313
- feat(deps): move to the Agave 4.2.2 stack and handle transaction v1 by @senzenn in #315
- chore(release): 0.10.0 by @kespinola in #316
Full Changelog: v0.9.0...v0.10.0