Hydra Protocol Versions
Hydra SDK talks to a hydra-node, and the node follows the Hydra Head protocol's own release cycle. This page tracks that cycle and which node versions the SDK supports.
@hydra-sdk/bridge2.x targets the hydra-node v2 line (verified against 2.3.0). The bridge major version tracks the hydra-node major version.Bridge 1.x is end of life — it spoke the v1 commit-based flow and receives no further releases. v2 removed the commit phase entirely (ADR-33): a head opens directly, and funds enter through incremental deposits. Upgrading is a breaking change; see the migration guide.Version timeline
| Version | Date | Line | Status | Theme |
|---|---|---|---|---|
1.0.0 | 2025-10-08 | v1 | Stable | First production-ready release |
1.1.0 | 2025-10-28 | v1 | Stable | Deposit & fanout improvements |
1.2.0 | 2025-11-28 | v1 | Stable | SafeClose, Blockfrost TUI |
1.3.0 | 2026-03-05 | v1 | Stable (SDK target) | Sync, rollback & fee optimization |
1.2.1 | 2026-04-22 | v1 | Pre-release | Backport: era-aware EpochInfo fix |
2.0.0 | 2026-04-02 | v2 | Alpha (initial V2) | Protocol simplification (commit-less) |
2.1.0 | 2026-05-13 | v2 | Superseded by 2.2.0 | SQLite persistence, snapshot & security |
2.2.0 | 2026-06-12 | v2 | Superseded by 2.3.0 | Partial fanout, cheaper L2 transactions |
2.3.0 | 2026-07-15 | v2 | Stable (SDK target) | No snapshot Plutus re-eval, HD-wallet keys, YAML config |
v1.3.0 — Stable v1 line
1.3.0 is the largest and most stable release in the v1 line, and is fully supported by @hydra-sdk/bridge. Highlights relevant to SDK integrations:
- ~4× cheaper fees for
init/openand related on-chain transactions, thanks to improved fee estimation. - Out-of-sync protection (breaking) — the node now rejects inputs while it is behind the chain, surfacing
NodeUnsynced/NodeSyncedstate. Client code should wait forNodeSyncedbefore submitting. - Richer
Greetings(breaking) — the greeting message now carriescurrentSlotand sync status;@hydra-sdk/bridgereads these extended fields. - Longer contestation period (breaking) —
defaultContestationPeriodchanged from 10 minutes to 12 hours, which affects how long closing a head takes. - Bounded transactions per snapshot and fixes for deposits/decommits across chain rollbacks.
Compatible tooling: cardano-node 10.6.2 · cardano-cli 10.15.0.0 · mithril 2524.0
v1.2.1 (pre-release) backports the era-aware EpochInfo fix from V2 to the v1 line, correcting POSIXTime values inside Plutus ScriptContext on multi-era chains. It is a pre-release — prefer 1.3.0.Everything below describes the V2 line. It changes the head lifecycle and on-chain scripts; V2 stabilized with 2.2.0.
2.0.0 — Protocol simplification
Remove commit phase — directly open heads
The most fundamental change in Hydra V2: the commit phase is removed. In V1, opening a head required all participants to commit UTxOs during an initialization phase (Init → Commit → CollectCom). In V2:
- Heads open directly after initialization — no
commit,collectCom, oraborttransactions. - Funds are added incrementally via
deposittransactions while the head is already open. - This decision is documented in ADR-33.
Benefits:
- Simplified lifecycle: removes the multi-step head opening process, reducing operational complexity.
- Resolved "non-abortable head" issue: previously, a participant committing too large a UTxO could make the head un-abortable. This problem no longer exists.
- Lower costs: eliminating
collectComandaborttransactions reduces total on-chain costs for most use cases. See transaction cost benchmarks.
API changes:
/commitendpoint behavior changes — it now acceptsdeposittransactions directly since heads open without a prior commit phase.- Head initialization endpoint (
GET /head-initialization) removed. - All on-chain scripts changed — new script hashes across all networks.
HydraHeadV2 token
The head token name has been upgraded from HydraHeadV1 to HydraHeadV2. This ensures version differentiation and prevents interaction between V1 and V2 heads — code that identifies heads on L1 by token name must be updated.
Era-aware Plutus scripts
L2 ledger Globals now uses era-aware EpochInfo queried from the blockchain instead of fixedEpochInfo, ensuring correct POSIXTime values for time-sensitive Plutus scripts on multi-era chains (mainnet/testnet).
Snapshot & deposit fixes
| Issue | Description |
|---|---|
| Stuck in RequestedSnapshot | Fixed a head getting permanently stuck when CommitFinalized races with an in-flight ReqSn. Only SeenSnapshot now blocks re-request; RequestedSnapshot retries correctly. |
| Silently dropped deposits | Deposits that become active while a snapshot is in-flight are no longer silently dropped — the next chained snapshot picks them up via selectNextDeposit. |
| Cross-head deposit contamination | Deposits from other heads are no longer picked up when multiple heads share the same network — depositsForHead is applied consistently, and deposit aggregate cases are guarded by headId. |
| 100 ADA commit limit removed | The hard-coded 100 ADA mainnet commit limit was removed. Until 2.2.0, conservative deposit amounts were still advised for full fund safety — the Partial fanout feature in 2.2.0 (below) lifts that ceiling entirely. |
2.1.0 — Persistence & resilience
2.1.0 is superseded by 2.2.0 — prefer 2.2.0 for the V2 line.SQLite-backed event store
File-based persistence (the append-only JSON state file) is replaced with a SQLite-backed event store (hydra.db):
- Events are persisted in
<persistence-dir>/hydra.db. - On first startup after upgrading, existing
statefiles are automatically migrated intohydra.dband renamed tostate.migrated. - Startup and recovery performance improve significantly.
Deposit security hardening
The deposit Plutus validator has been hardened against malformed increment transactions, closing a security gap in on-chain deposit handling.
Snapshot latency improvement
Snapshot confirmation latency is reduced by ~7% on average by caching pre-computed signable bytes in SeenSnapshot. This avoids repeated UTxO serialization and hashing on every AckSn verification during signing rounds.
Blockfrost error resilience
Transient chain-following errors in the Blockfrost backend (DecodeError, MissingNextBlockHash, etc.) are now retried with exponential backoff instead of crashing the node.
Other changes
Listreplaced withSeqto speed up transaction processing in certain operations.- Several
StateChangedevent fields were renamed or removed (see breaking changes below). - Upgraded to
cardano-nodeprotocol version 12+.
Compatible tooling: cardano-node 11.0.1 · cardano-cli 11.0.0 · mithril 2617
2.2.0 — Partial fanout & cheaper L2
This is the current stable V2 release.
Partial fanout — no more per-head UTxO ceiling
Until now, the number of UTxOs a head could hold was effectively capped by what fit in a single fanout transaction. Partial fanout removes that limit:
- A head with an arbitrarily large UTxO set is closed out across multiple steps — each
PartialFanoutTxdistributes as many outputs as fit in one transaction, and a finalFinalPartialFanoutTxburns the head tokens to complete the process. - Every step is verified on-chain with a BLS accumulator membership proof.
- The chunk size is determined dynamically (binary search over valid sizes) rather than by a hard-coded limit.
This resolves the conservative-deposit caveat from V2's early releases.
Cheaper L2 transactions
utxoCostPerByte is set to zero on L2, so a NewTx can be submitted with as little as 1 lovelace — lowering the cost of transacting inside a head.
Revamped hydra-tui
A substantially revised hydra-tui: pending-deposit recovery from Open and Closed/Final states, a dark/light theme toggle persisted to config, an event-history filter (all vs errors only), and tab navigation.
Correctness & performance fixes
- Fixed replaying persisted events from a previous head corrupting the state of a newly opened head.
- Fixed a recovered incremental-commit deposit reappearing in the L2 UTxO after sideloading a snapshot (which made the same UTxO spendable on L1 and L2 at once).
- Added a
mustNotMintOrBurnguard to theIncrementandDecrementvalidator transitions. - Reduced on-disk event-store growth by dropping redundant
newLocalUTxOfields (post-tx UTxO is recomputed arithmetically). - Lazy
Mapreplaced with strictMapto improve memory usage.
Compatible tooling: cardano-node 11.0.1 · cardano-cli 11.0.0 · mithril 2617
Breaking changes summary (V2)
2.1.0 — StateChanged event schema
| Event | Change |
|---|---|
SnapshotRequested | snapshot → requestedSnapshot; requestedTxIds removed (now carried inside the snapshot) |
PartySignedSnapshot | snapshot :: Snapshot tx → snapshotNumber :: SnapshotNumber |
SnapshotConfirmed | snapshot :: Snapshot tx → snapshot :: Maybe (Snapshot tx) (Nothing when the snapshot was already carried by SnapshotRequested) |
DecommitRecorded | utxoToDecommit :: UTxOType tx field removed |
2.2.0 — Fanout & UTxO fields
| Field / event | Change |
|---|---|
HeadIsFinalized (server output) | utxo → finalizedUTxO; type changed from a UTxO map (keyed by TxIn) to an array of TxOut (intermediate partial-fanout outputs carry no spending reference) |
ClosedState (persisted) | remainingFanoutUTxO → remainingFanoutOutputs, distributedFanoutUTxO → distributedFanoutOutputs; both UTxO map → array of TxOut |
TransactionAppliedToLocalUTxO, SnapshotRequested, DecommitRecorded | newLocalUTxO field removed |
Hydra script hashes
On-chain scripts have new hashes with each protocol change. For the v1.3.0 and V2 lines (both supported by the bridge):
| Network | 1.3.0 | 2.1.0 | 2.2.0 (two scripts) |
|---|---|---|---|
preview | 8ae405c2…cf88621 | 86288ee0…add66c4 | 52c84ab1…e799ad6c, dd4b3920…afb95f41 |
preprod | 476b37a7…a11e8f3da | 16f275a5…54298e46 | 2c01bf78…9ea00b03, 395ecc51…af4696dd |
mainnet | 2c6cff50…4d5e8b67 | a864514b…c45539da2 | 17fb77e1…b29d276b9, 906ecc6e…76dbfc4a3 |
2.2.0 publishes two script hashes per network because partial fanout adds the accumulator script. Always confirm the full hashes against the networks.json for your exact node version.
Migrating a node from V1 to V2
V1 → V2 is a breaking, one-way change at the protocol level — different protocol, token, and scripts, with no backward compatibility between a V1 and a V2 node. @hydra-sdk/bridge supports both lines, so no SDK change is required; when you switch a node from V1 to V2:
- Close all active heads before upgrading the node.
- Update script references — all hydra script hashes changed; update your network/script configuration.
- Update API consumers — adjust client code for the new
StateChangedevent schema, theHeadIsFinalized/ClosedStatefield changes, and the removed head-initialization endpoint. - Adapt the deposit workflow — replace the commit-then-open pattern with direct-open-then-deposit.
- Verify the persistence directory — existing
statefiles are auto-migrated to SQLite on first startup. - Upgrade companion tools —
cardano-node >= 11.0.1,cardano-cli >= 11.0.0,mithril >= 2617.
