Skip to content

Releases: sgbett/bsv-ruby-sdk

bsv-ruby-sdk 0.14.0

22 Apr 11:26

Choose a tag to compare

0.14.0 — 2026-04-22

Added

  • BSV::Network::WhatsOnChain expanded with current_height,
    get_block_header(height), and valid_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#verify now raises VerificationError for all failure modes:
    :script_failure (wraps ScriptError with cause chaining),
    :missing_source (replaces ArgumentError), :invalid_merkle_proof,
    :insufficient_fee, and :output_overflow. Code rescuing ArgumentError
    or ScriptError from verify must switch to VerificationError (#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 returns false rather than raising

bsv-wallet 0.11.0

22 Apr 13:11

Choose a tag to compare

0.11.0 — 2026-04-22

Added

  • chain_data_source: constructor param on Client — injectable chain
    data provider for local blockchain queries without a remote substrate
  • sync_utxos restored — discovers on-chain UTXOs via the chain data
    source and imports them into storage as :spendable with
    derivation_type: :identity. Deduplicates transaction fetches and
    validates UTXO API values against transaction outputs (#599)
  • get_height restored with local chain data fallback — returns
    { height: Integer } without requiring a substrate (#597)
  • get_header_for_height restored 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 with valid_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

  • MemoryStore guarded in Client.new — raises ArgumentError unless
    allow_memory_store: true is 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_utxos deduplicates UTXO response entries before processing
    and caches fetched transactions by txid to minimise WoC API calls
  • internalize_action chain tracker guard uses explicit nil check for
    clarity
  • Consistent error message wording across get_height and
    get_header_for_height

bsv-ruby-sdk 0.13.0

21 Apr 01:05
bea3b29

Choose a tag to compare

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_URL constants and ENV var reading — provider defaults are the single source of truth
  • Removed BASE_URL from protocols — base_url: is now mandatory
  • Wallet namespace reorganisation: Store and BroadcastQueue collaborators namespaced under Client
  • ProtoWallet and WalletClient replaced with Client

Fixed

  • Ruby 2.7 kwargs compatibility in Protocol#call and TAALBinary spec doubles
  • Nil-guard on WoCREST broadcast and ARC status metadata
  • ARC status rejection checks and TAALBinary nil-txid guard
  • BSV::Wallet::Wallet autoload failure in multi-gem setup
  • SimpleCov coverage gate now requires COVERAGE=true explicitly

bsv-wallet 0.10.0

21 Apr 01:23

Choose a tag to compare

0.10.0 — 2026-04-21

Added

  • BRC-100 abstract contract modules and Client with composition architecture
  • UTXO pool system: UTXOPool interface, LocalPool implementation, ReplenishmentWorker, and utxo_pool factory on Client
  • BRC-122 two-zone basket validation
  • update_output_basket on Store interface

Changed

  • ProtoWallet and WalletClient deleted, replaced with Client using concern modules (Transaction, Crypto, Identity, Network, Authentication)
  • File paths renamed from wallet_interface to wallet
  • Store and BroadcastQueue collaborators namespaced under Client
  • Contracts moved under Interface namespace
  • Legacy ChainProvider classes removed

Fixed

  • internalize_payment and internalize_basket now set state: :spendable explicitly on stored outputs
  • Derivation metadata now persisted in store_tracked_outputs
  • Cold start normalisation and eager validation fixes
  • SimpleCov coverage gate now requires COVERAGE=true explicitly

bsv-wallet-postgres 0.6.0

21 Apr 01:32

Choose a tag to compare

0.6.0 — 2026-04-21

Added

  • update_output_basket implementation on PostgresStore, 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

16 Apr 20:57

Choose a tag to compare

0.12.1 — 2026-04-16

Fixed

  • Transaction#to_ef now derives source_satoshis and source_locking_script from input.source_transaction.outputs[input.prev_tx_out_index] when the explicit fields are unset. Previously to_ef raised ArgumentError on inputs wired via Transaction.from_beef, causing ARC#broadcast to 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 SDK writeEF behaviour. (#467, HLR #466)
  • Transaction.from_beef and from_beef_hex now use Beef#find_atomic_transaction to locate the subject transaction, ensuring that FORMAT_RAW_TX ancestors whose txid appears as a leaf in a separately-stored BUMP have their merkle_path attached. Covers a late-bound BUMP attachment gap not handled by the initial wire_source_transactions pass. Matches Transaction.fromAtomicBEEF semantics 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

16 Apr 21:01

Choose a tag to compare

0.9.1 — 2026-04-16

Changed

  • Raised bsv-sdk dependency floor to >= 0.12.1 to 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's create_action flow relies on Transaction.from_beef producing fully-wired ancestry, which the old SDK didn't do.

Fixed

  • Removed redundant store_transaction call in internalize_actionstore_proofs_from_beef already 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

16 Apr 13:42

Choose a tag to compare

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_action and sign_action now raise BSV::Wallet::WalletError when
    no broadcaster is configured and options: { no_send: true } is not set.
    Previously these calls succeeded silently. To resolve: pass
    broadcaster: BSV::Network::ARC.default to WalletClient.new, or pass
    options: { no_send: true } to create_action to build without
    broadcasting.
  • internalize_action now 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 SolidQueueAdapter satisfy the broadcaster
    requirement if the adapter carries an embedded broadcaster: — the
    WalletClient itself 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

16 Apr 13:49

Choose a tag to compare

0.5.0 — 2026-04-16

Changed — Breaking

  • SolidQueueAdapter now 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). The wallet_broadcast_jobs row status is unchanged (job queue lifecycle is a separate domain).

Added

  • BroadcastQueue#broadcast_enabled? interface method; SolidQueueAdapter returns true (broadcaster required at construction time). Enables WalletClient#broadcast_enabled? to detect a queue-embedded broadcaster.

Changed

  • Minimum bsv-wallet version raised from >= 0.6.0 to >= 0.9.0. Required for the new status taxonomy and broadcast_enabled? interface.

bsv-ruby-sdk 0.12.0

15 Apr 19:41

Choose a tag to compare

0.12.0 — 2026-04-15

Added

  • Certificate infrastructure: BSV::Auth::Certificate base class with field map,
    serialisation, and signature verification (#420)
  • BSV::Auth::MasterCertificate for certificate issuance with identity key
    binding (#421)
  • BSV::Auth::VerifiableCertificate for selective field revelation with
    proof-of-field-revelation (#422)
  • Certificate utilities: validate_certificates and get_verifiable_certificates
    helpers (#427, #428)
  • Peer protocol: certificateRequest/certificateResponse message handling,
    callback registration, and last_interacted_peer (#430, #431)
  • High-level peer session API: Peer#to_peer and Peer#get_authenticated_session
    for reusable authenticated sessions (#433)
  • BRC-104 HTTP auth transport: AuthFetch client, SimplifiedFetchTransport,
    AuthMiddleware (Rack), and AuthHeaders/AuthPayload serialiser (#437#441)
  • AuthFetch 402 payment handling for paid API endpoints (#441)
  • BSV::WireFormat module 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_spec fixed (missing require 'base64')

Changed

  • GetVerifiableCertificates bug warning note removed (underlying bug now
    fixed in bsv-wallet)
  • Peer protocol internals refactored: PairedTransport helper, deduplicated
    high-level API, hardened message processing