This document describes all changes required to bump cardano-wallet from cardano-node 10.5.x to 10.6.2, which introduces DijkstraEra (the 8th Cardano era, protocol version 12).
Branch: chore/bump-node-10.6.2
PR: #5197
- haskell.nix pinned to a newer rev supporting GHC and Dijkstra ledger.
- CHaP advanced to
2026-02-09; Hackage rolled back to2025-09-29to avoid breakage from newer upstream packages while CHaP carries the node 10.6.2 ecosystem. - Old legacy inputs removed (
ghc-8.6.5-iohk,ghc910X,ghc911,hydra,nix,lowdown-src,nixpkgs-regression,em).
- Removed
-Wno-deriving-typeable: GHC 9.12 warns on redundantderiving Typeable. Source code cleaned up instead (see §6). - streaming-commons Windows patch: Reverted the
mkForce []override — haskell.nix's built-in patch is still needed untilindex-stateresolvesstreaming-commons >= 0.2.3.1.
Key dependency bumps:
| Package | Old | New |
|---|---|---|
cardano-api |
10.16 | 10.23.0.0 |
cardano-ledger-core |
1.17 | 1.18.0.0 |
cardano-ledger-alonzo |
1.13 | 1.14.0.0 |
cardano-ledger-babbage |
1.11 | 1.12.0.0 |
cardano-ledger-conway |
1.19 | 1.20.0.0 |
cardano-ledger-shelley |
1.16 | 1.17.0.0 |
ouroboros-consensus |
0.27 | 0.30.0.1 |
ouroboros-consensus-cardano |
0.25 | 0.26.0.3 |
ouroboros-network |
— | 0.22.6.0 |
plutus-core/ledger-api/tx |
— | 1.57.0.0 |
io-classes |
— | 1.8.0.1 |
Other changes:
- All
.cabalfiles drop per-package version bounds for Cardano ecosystem deps; pinning is now centralised incabal.projectconstraints:. allow-newerforstrict-stm:io-classes/si-timers:io-classesremoved (io-classes 1.8 is compatible).source-repository-packagefor cardano-cli removed (resolved via CHaP).- Package renames:
crypton-asn1-encoding→asn1-encoding,time-hourglass→hourglass.
The lowest-level era-indexed layer. Every type family and era-dispatch function
gains a Dijkstra branch.
DijkstraEra is the 8th member (index 7):
type KnownEras =
'[ ByronEra, ShelleyEra, AllegraEra, MaryEra
, AlonzoEra, BabbageEra, ConwayEra, DijkstraEra ]
indexOfEra Dijkstra = 7Era GADT, IsEra instance, and Dijkstra type alias all added.
parseEraIndex 7 = Just $ EraValue Dijkstra. All instances (Show, Eq,
Ord, NFData) gain Dijkstra cases.
Significant refactor. Previously:
- Shelley–Mary used
ShelleyTxdirectly - Alonzo–Conway used
AlonzoTxdirectly
Now all post-Byron eras use Core.Tx era (the associated type from
EraTx):
type family TxT era where
TxT Byron = Byron.ATxAux ()
TxT Shelley = Core.Tx Shelley
TxT Allegra = Core.Tx Allegra
...
TxT Dijkstra = Core.Tx DijkstraWhy: The ledger now wraps each era's internal tx in a newtype, e.g.
MkDijkstraTx (AlonzoTx DijkstraEra). Core.Tx is the abstract unified
type.
BlockT Dijkstra = O.ShelleyBlock (Praos O.StandardCrypto) DijkstrafromConsensusBlock gains:
O.BlockDijkstra block -> EraValue (Block block :: Block Dijkstra)Constraint simplified:
- Old:
EraSegWits era, EncCBOR (ShelleyProtocolHeader proto) - New:
EraBlockBody era
Body extraction changes from toList (fromTxSeq txs) to
toList (txs ^. txSeqBlockBodyL) (new lens-based API).
Constraints EncCBOR, EncCBORGroup, Core.Era,
ShelleyProtocolHeader all removed. Simplified to:
getHeaderHashShelley
:: ProtocolHeaderSupportsEnvelope (praos StandardCrypto)
=> O.ShelleyBlock (praos StandardCrypto) era -> ShelleyHashEvery feature (Inputs, Outputs, Fee, Mint, Certificates, Withdrawals,
CollateralInputs, CollateralOutputs, ReferenceInputs, ExtraSigs, Validity,
Integrity, Metadata, Witnesses) gains Dijkstra case. Pattern: Dijkstra uses
same underlying ledger type as Conway, with these exceptions:
- Certificates:
CertificatesType Dijkstra = StrictSeq (DijkstraTxCert Dijkstra)— Dijkstra has its own certificate type. - ExtraSigs: uses
reqSignerHashesTxBodyG(getter) instead ofreqSignerHashesTxBodyL(lens).
Refactored from standalone shelleyWithdrawals function with view to inline
tx ^. bodyTxL . withdrawalsTxBodyL, adding an explicit EraTx constraint.
New module Cardano.Wallet.Read.Tx.Gen.Dijkstra providing mkDijkstraTx.
Key observations:
- Constructs via
MkDijkstraTx $ AlonzoTx body wits valid aux DijkstraTxBodyhas two new fields vs Conway:guards :: OSet (Credential 'Guard)— a new credential role- An additional empty field
- Uses
natVersion @12(protocol version 12, Conway was 10)
All existing era generators updated to use era-specific Tx newtype
constructors (MkAllegraTx, MkAlonzoTx, MkBabbageTx, MkConwayTx) and
Core.Tx era / L.TxBody era instead of concrete types.
New mkDijkstraCertsK handles DijkstraTxCert:
data DijkstraTxCert era
= DijkstraTxCertDeleg (DijkstraDelegCert era)
| DijkstraTxCertPool PoolCert
| DijkstraTxCertGov (ConwayGovCert era)DijkstraDelegCert subtypes:
DijkstraRegCert— stake key registration (with deposit)DijkstraUnRegCert— deregistration (with deposit return)DijkstraDelegCert— delegation to pool/DRepDijkstraRegDelegCert— combined registration + delegation
Pool certs reuse PoolCert (RegPool/RetirePool). Gov certs reuse
ConwayGovCert.
New fromDijkstraTxOut, identical structure to fromConwayTxOut:
fromDijkstraTxOut
:: Babbage.BabbageTxOut DijkstraEra
-> (W.TxOut, Maybe (AlonzoScript DijkstraEra))New dijkstraAnyExplicitScript. All era functions updated:
Alonzo.TimelockScript → Alonzo.NativeScript.
New dijkstraWitnessCount following same pattern as conwayWitnessCount,
using fromDijkstraTxOut and dijkstraAnyExplicitScript.
-
fromDijkstraPParams: New function, identical structure tofromConwayPParams. Decentralisation fixed at 0%. -
nodeToClientVersions: Extended from[V_16, V_17]to[V_16 .. V_22]for Dijkstra support. -
Constraint simplifications:
getProducer,getBabbageProducer,getConwayProducerdropEra era,EncCBORGroup (TxSeq era)constraints. -
fromPoolDistr: Changed fromConsensus.PoolDistr cryptotoLedger.PoolDistr(monomorphic). Types moved toCardano.Ledger.State. -
Certificate witness handling:
cardanoCertKeysForWitnessesnow usesCardano.Compat.selectStakeCredentialWitness(fromCardano.Api.Compatible.Certificate).
toWalletScript: catch-all for new timelock constructorstoPlutusScriptInfo: newLedger.PlutusV4 -> PlutusVersionV4
Gains Dijkstra case in era dispatch (same pattern as Conway).
Gains Dijkstra case for minting/burning policy extraction.
Gains Dijkstra case using fromDijkstraTxOut.
Drops the constraint Core.Tx era ~ Babbage.AlonzoTx era. Now that Core.Tx
is a newtype per era (not a type synonym for AlonzoTx), this equality no
longer holds. fromAnyCardanoEra gains _ -> Nothing for Dijkstra.
downgradeScript updated: TimelockScript → Alonzo.NativeScript.
toLedgerScript in updateTx: TimelockScript → NativeScript for both
Babbage and Conway.
Substantial rewrite of addScriptIntegrityHash:
Alonzo.txdats'renamed toAlonzo.txdatshashScriptIntegritynow takes a singleScriptIntegrityrecord instead of three arguments- Critical fix: When all components (redeemers, datums, language views)
are empty, sets
SNothinginstead of computing an empty hash:
integrityHash
| Map.null (view Alonzo.unRedeemersL rdmrs)
, Map.null (view Alonzo.unTxDatsL dats)
, Set.null langViews = SNothing
| otherwise =
SJust $ Alonzo.hashScriptIntegrity
$ Alonzo.ScriptIntegrity rdmrs dats langViewsThis fix (commit ffda1e6fa3) was needed because the ledger now rejects
transactions with a non-empty integrity hash but no Plutus scripts.
estimateDelegSigningKeys refactored from pattern-matching on
CardanoApi.ShelleyRelatedCertificate / ConwayCertificate to using
Exp.Certificate (experimental API):
estimateDelegSigningKeys (Exp.Certificate txCert) =
case txCert of
Shelley.RegTxCert _ -> 0
Shelley.DelegStakeTxCert c _ -> estimateWitNumForCred c
Shelley.UnRegTxCert c -> estimateWitNumForCred c
_ -> 1toTimelockScript: Alonzo.TimelockScript → Alonzo.NativeScript.
codecConfig: 8thShelleyCodecConfigfor Dijkstra.- Mux tracer:
nctMuxTracer = nullTracer→nctMuxTracers = nullTracers(mux library API change to a record of tracers). - New constraints:
MonadThrow m/MonadMask mon client functions (ouroboros-network-framework API change). _getUTxOByTxIn:errorstub for Dijkstra.
onAnyEra and onAnyEra' gain an 8th onDijkstra parameter.
QueryIfCurrentDijkstra from consensus. eraIndexToAnyCardanoEra maps
index 7 to DijkstraEra.
StakeDistribution.hs: UsesShelley.GetStakeDistribution2instead ofGetStakeDistribution.UTxO.hs:errorstub for Dijkstra with TODO.PParams.hs,RewardAccount.hs: Pass same Shelley query for Dijkstra.
Both fromReadEra and fromAnyCardanoEra gain error stubs for Dijkstra.
Aeson.Value type family instances moved from Client.hs to Types.hs,
eliminating orphan instances.
All API error types drop deriving Typeable (redundant in GHC 9.12).
pparamsInRecentEra: error stub for Dijkstra.
forAllBlocks: error stub for BlockDijkstra.
withRecentEraLedgerTx:errorstub for Dijkstra.- New
certToLedgerbridges deprecatedCardano.Api.CertificatetoCardano.Api.Experimental.Certificate. {-# OPTIONS_GHC -Wno-deprecations #-}added (temporary).
-Wno-deprecations added. Cardano.Api.Shelley → Cardano.Api.
The systematic pattern for adding each era:
- Type family:
TypeFamily Dijkstra = <ledger type>(usually same as Conway) - Era dispatch:
Dijkstra -> <implementation>case ingetEra*functions fromConsensusBlock: MapO.BlockDijkstratoEraValueonAnyEra: Add 8th parameter- Local state queries: Add Dijkstra query (or
errorstub) - API mapping:
errorstubs untilApiDijkstraexists
Structurally very similar — Praos consensus, BabbageTxOut, AlonzoScript,
same integrity/validity/fee mechanisms. Differences:
| Aspect | Conway | Dijkstra |
|---|---|---|
| Protocol version | 10 | 12 |
| Certificate type | ConwayTxCert |
DijkstraTxCert |
| Required signers | lens (reqSignerHashesTxBodyL) |
getter (reqSignerHashesTxBodyG) |
| New credential role | — | Guard |
| TxBody fields | — | 2 additional empty fields |
| Plutus | V1–V3 | V1–V4 |
TODO.md catalogs 16 error stubs across 14 files that must be implemented
when DijkstraEra is promoted to RecentEra:
| File | Function |
|---|---|
Api/Types/Era.hs |
fromReadEra, fromAnyCardanoEra |
Write/Tx.hs |
upgradeToOutputConway |
Network/Implementation.hs |
_getUTxOByTxIn |
LocalStateQuery/UTxO.hs |
getUTxOByTxIn |
Convert.hs |
toWalletScript |
Read/Eras.hs |
fromAnyCardanoEra |
Outputs.hs |
txOutFromOutput |
Sealed.hs |
fromCardanoApiTx |
TxExtended.hs |
fromCardanoTx |
Shelley.hs |
toCardanoEra |
Wallet.hs |
pparamsInRecentEra |
Pools.hs |
forAllBlocks |
Transaction.hs |
withRecentEraLedgerTx |
Plus 3 files needing certificate API migration (-Wno-deprecations):
Transaction.hs, Delegation.hs, Voting.hs.
- Tx newtype per era:
MkDijkstraTx (AlonzoTx era)etc. UseCore.Tx era. TimelockScript→NativeScriptPoolParams/PoolMetadata/PoolDistr→Cardano.Ledger.Statetxdats'→txdatshashScriptIntegrity: singleScriptIntegrityrecord, not 3 argsPlutusV4: new language version- Constraint simplification:
EraBlockBodyreplacesEraSegWits+EncCBORcombos fromTxSeq→txSeqBlockBodyL(lens)
Cardano.Api.Shelleydeprecated → merged intoCardano.Api- Certificate API:
Cardano.Api.Certificatedeprecated →Cardano.Api.Experimental.Certificate selectStakeCredentialWitness→Cardano.Api.Compatible.Certificate
BlockDijkstra,QueryIfCurrentDijkstra: new constructorsGetStakeDistribution2: replaces/augmentsGetStakeDistributionNodeToClientV_18..V_22: new protocol versionsnctMuxTracer→nctMuxTracers(record of tracers)MonadThrow/MonadMask: new constraints on client functions