Releases: sgbett/bsv-ruby-sdk
Releases · sgbett/bsv-ruby-sdk
bsv-ruby-sdk 0.14.0
0.14.0 — 2026-04-22
Added
BSV::Network::WhatsOnChainexpanded withcurrent_height,
get_block_header(height), andvalid_root_for_height?(root, height)—
a single WhatsOnChain instance now serves as a complete chain data source
(#596)- BEEF-based SPV verification conformance tests (#607)
Changed
Transaction#verifynow raisesVerificationErrorfor all failure modes:
:script_failure(wrapsScriptErrorwith cause chaining),
:missing_source(replacesArgumentError),:invalid_merkle_proof,
:insufficient_fee, and:output_overflow. Code rescuingArgumentError
orScriptErrorfromverifymust switch toVerificationError(#608)- Removed dead code:
BSV::Wallet::Wallet(superseded by bsv-wallet gem's
Client),BSV::Messages(unused re-export alias), and duplicate
BSV::Wallet::InsufficientFundsError(#594)
Fixed
- WhatsOnChain
valid_root_for_height?YARD doc now correctly documents
that 404 returnsfalserather than raising
bsv-wallet 0.11.0
0.11.0 — 2026-04-22
Added
chain_data_source:constructor param onClient— injectable chain
data provider for local blockchain queries without a remote substratesync_utxosrestored — discovers on-chain UTXOs via the chain data
source and imports them into storage as:spendablewith
derivation_type: :identity. Deduplicates transaction fetches and
validates UTXO API values against transaction outputs (#599)get_heightrestored with local chain data fallback — returns
{ height: Integer }without requiring a substrate (#597)get_header_for_heightrestored with local chain data fallback —
returns WoC block header JSON (#598)- BEEF SPV merkle root verification restored in
internalize_action
when a chain data source withvalid_root_for_height?is available;
error messages now distinguish SPV rejection from structural
invalidity (#600) - Store conformance shared examples extracted to
lib/bsv/wallet/testing/— downstream adapter gems can now
require 'bsv/wallet/testing/store_conformance'for interface and
wallet-level test coverage (#591)
Changed
MemoryStoreguarded inClient.new— raisesArgumentErrorunless
allow_memory_store: trueis passed, preventing accidental data loss
in production- Wallet-level dual-store specs refactored to use shared examples via
it_behaves_like; no test coverage lost (1281 examples preserved)
Fixed
sync_utxosdeduplicates UTXO response entries before processing
and caches fetched transactions by txid to minimise WoC API callsinternalize_actionchain tracker guard uses explicit nil check for
clarity- Consistent error message wording across
get_heightand
get_header_for_height
bsv-ruby-sdk 0.13.0
0.13.0 — 2026-04-21
Added
- Protocol layer: base class with declarative DSL, HTTP dispatch, and Result value types
- WoCREST protocol with transaction detail, script query, exchange rate, fee, mempool, SPV, wallet, and address commands
- ARC protocol with broadcast escape hatches and enriched response data
- TAALBinary protocol with binary broadcast support
- Chaintracks and Ordinals protocols with base_url override
- Provider configuration container with block DSL and
.default(testnet:)pattern - Provider introspection and capability matrix
- Concrete provider defaults for GorillaPool, WhatsOnChain, and TAAL
Changed
- Facades (ARC, WhatsOnChain, ChainTracker) hollowed out to delegate via Protocol
- Removed
BSV::MAINNET_URL/TESTNET_URLconstants and ENV var reading — provider defaults are the single source of truth - Removed
BASE_URLfrom protocols —base_url:is now mandatory - Wallet namespace reorganisation:
StoreandBroadcastQueuecollaborators namespaced underClient ProtoWalletandWalletClientreplaced withClient
Fixed
- Ruby 2.7 kwargs compatibility in
Protocol#calland TAALBinary spec doubles - Nil-guard on WoCREST broadcast and ARC status metadata
- ARC status rejection checks and TAALBinary nil-txid guard
BSV::Wallet::Walletautoload failure in multi-gem setup- SimpleCov coverage gate now requires
COVERAGE=trueexplicitly
bsv-wallet 0.10.0
0.10.0 — 2026-04-21
Added
- BRC-100 abstract contract modules and
Clientwith composition architecture - UTXO pool system:
UTXOPoolinterface,LocalPoolimplementation,ReplenishmentWorker, andutxo_poolfactory on Client - BRC-122 two-zone basket validation
update_output_basketon Store interface
Changed
ProtoWalletandWalletClientdeleted, replaced withClientusing concern modules (Transaction,Crypto,Identity,Network,Authentication)- File paths renamed from
wallet_interfacetowallet StoreandBroadcastQueuecollaborators namespaced underClient- Contracts moved under
Interfacenamespace - Legacy
ChainProviderclasses removed
Fixed
internalize_paymentandinternalize_basketnow setstate: :spendableexplicitly on stored outputs- Derivation metadata now persisted in
store_tracked_outputs - Cold start normalisation and eager validation fixes
- SimpleCov coverage gate now requires
COVERAGE=trueexplicitly
bsv-wallet-postgres 0.6.0
0.6.0 — 2026-04-21
Added
update_output_basketimplementation onPostgresStore, matching the new Store interface method
Changed
- Updated for bsv-wallet 0.10.0 namespace changes (
Interface,Client,Store)
bsv-ruby-sdk 0.12.1
0.12.1 — 2026-04-16
Fixed
Transaction#to_efnow derivessource_satoshisandsource_locking_scriptfrominput.source_transaction.outputs[input.prev_tx_out_index]when the explicit fields are unset. Previouslyto_efraisedArgumentErroron inputs wired viaTransaction.from_beef, causingARC#broadcastto silently fall back to raw hex — which ARC rejects when parent transactions are unconfirmed. Consumer impact: recently-received UTXOs that previously could not be re-broadcast now can. Matches TS SDKwriteEFbehaviour. (#467, HLR #466)Transaction.from_beefandfrom_beef_hexnow useBeef#find_atomic_transactionto locate the subject transaction, ensuring thatFORMAT_RAW_TXancestors whose txid appears as a leaf in a separately-stored BUMP have theirmerkle_pathattached. Covers a late-bound BUMP attachment gap not handled by the initialwire_source_transactionspass. MatchesTransaction.fromAtomicBEEFsemantics in the TS SDK. (#468, HLR #466)
Related upstream issue: wallet-toolbox#149 — same architectural gap in the TS SDK.
bsv-wallet 0.9.1
0.9.1 — 2026-04-16
Changed
- Raised
bsv-sdkdependency floor to>= 0.12.1to pick up BEEF ancestry correctness fixes (bsv-sdk#467, bsv-sdk#468, HLR #466). Consumer impact: recently-received UTXOs that previously could not be re-broadcast now can — the wallet'screate_actionflow relies onTransaction.from_beefproducing fully-wired ancestry, which the old SDK didn't do.
Fixed
- Removed redundant
store_transactioncall ininternalize_action—store_proofs_from_beefalready persists every transaction in the BEEF bundle, so the subject tx was being written twice. No behaviour change; minor cleanup. (#469)
Related: wallet-toolbox#149 — same architectural gap reported upstream.
bsv-wallet 0.9.0
0.9.0 — 2026-04-16
Changed — Breaking
Action status taxonomy aligned with BRC-100 reference SDK (HLR #455)
This release realigns the action status values with the wallet-toolbox reference
implementation. The meaning of 'completed' has changed — consumers must
update any code that checks for 'completed' as the post-broadcast success
state.
| Status | Old meaning | New meaning |
|---|---|---|
'nosend' |
No change | Transaction built but not broadcast (no_send: true) |
'sending' |
No change | Async queue accepted; worker has not yet attempted broadcast |
'unproven' |
(new) | Broadcast succeeded; awaiting merkle proof |
'completed' |
Broadcast succeeded | Merkle proof received and stored |
'failed' |
No change | Broadcast rejected or transaction invalid |
Migration:
- Code querying
list_actions(status: 'completed')will return fewer results
until a proof-watcher is implemented (out of scope for this release). To find
successfully-broadcast actions that have not yet received a proof, query
status: 'unproven'instead. create_actionandsign_actionnow raiseBSV::Wallet::WalletErrorwhen
no broadcaster is configured andoptions: { no_send: true }is not set.
Previously these calls succeeded silently. To resolve: pass
broadcaster: BSV::Network::ARC.defaulttoWalletClient.new, or pass
options: { no_send: true }tocreate_actionto build without
broadcasting.internalize_actionnow sets status to'completed'only when the supplied
BEEF contains a merkle proof for the subject transaction. Plain BEEF (raw
transaction, no BUMP) results in status'unproven'.- Wallets configured with a
SolidQueueAdaptersatisfy the broadcaster
requirement if the adapter carries an embeddedbroadcaster:— the
WalletClientitself does not need one.
Related upstream incidents: x402-rack #148, x402-rack #158, x402-doom #196.
Tracking issue: #455.
bsv-wallet-postgres 0.5.0
0.5.0 — 2026-04-16
Changed — Breaking
SolidQueueAdapternow sets the wallet action status to'unproven'instead of'completed'on successful broadcast. Aligns with the status taxonomy change in bsv-wallet 0.9.0 (HLR #455). Thewallet_broadcast_jobsrow status is unchanged (job queue lifecycle is a separate domain).
Added
BroadcastQueue#broadcast_enabled?interface method;SolidQueueAdapterreturnstrue(broadcaster required at construction time). EnablesWalletClient#broadcast_enabled?to detect a queue-embedded broadcaster.
Changed
- Minimum
bsv-walletversion raised from>= 0.6.0to>= 0.9.0. Required for the new status taxonomy andbroadcast_enabled?interface.
bsv-ruby-sdk 0.12.0
0.12.0 — 2026-04-15
Added
- Certificate infrastructure:
BSV::Auth::Certificatebase class with field map,
serialisation, and signature verification (#420) BSV::Auth::MasterCertificatefor certificate issuance with identity key
binding (#421)BSV::Auth::VerifiableCertificatefor selective field revelation with
proof-of-field-revelation (#422)- Certificate utilities:
validate_certificatesandget_verifiable_certificates
helpers (#427, #428) - Peer protocol:
certificateRequest/certificateResponsemessage handling,
callback registration, andlast_interacted_peer(#430, #431) - High-level peer session API:
Peer#to_peerandPeer#get_authenticated_session
for reusable authenticated sessions (#433) - BRC-104 HTTP auth transport:
AuthFetchclient,SimplifiedFetchTransport,
AuthMiddleware(Rack), andAuthHeaders/AuthPayloadserialiser (#437–#441) AuthFetch402 payment handling for paid API endpoints (#441)BSV::WireFormatmodule for camelCase/snake_case conversion at JSON
boundaries (#447)- Cross-SDK conformance and integration specs for certificates (#423)
- Peer protocol integration tests (#434)
- BRC-104 integration tests (#442)
Fixed
- Auth handshake now uses shallow key conversion to avoid corrupting nested
message payloads - Certificate classes hardened against edge cases from code review
- Certifier allowlist enforced in
process_certificate_response - Flaky
validate_certificates_specfixed (missingrequire 'base64')
Changed
GetVerifiableCertificatesbug warning note removed (underlying bug now
fixed in bsv-wallet)- Peer protocol internals refactored:
PairedTransporthelper, deduplicated
high-level API, hardened message processing