Skip to content

Commit 19370a4

Browse files
authored
Merge pull request #1341 from IntersectMBO/jordan/supplemental-datum-fix
Fix supplemental datum propagation in transaction build
2 parents f650aa5 + 8e3411e commit 19370a4

4 files changed

Lines changed: 46 additions & 20 deletions

File tree

cabal.project

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ repository cardano-haskell-packages
1414
-- you need to run if you change them
1515
index-state:
1616
, hackage.haskell.org 2026-02-06T20:27:32Z
17-
, cardano-haskell-packages 2026-02-18T15:43:28Z
17+
, cardano-haskell-packages 2026-02-27T19:25:49Z
1818

1919
packages:
2020
cardano-cli

cardano-cli/src/Cardano/CLI/EraBased/Transaction/Run.hs

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ import Cardano.CLI.Type.Error.TxCmdError
7474
import Cardano.CLI.Type.Error.TxValidationError
7575
import Cardano.CLI.Type.Output (renderScriptCostsWithScriptHashesMap)
7676
import Cardano.Ledger.Api (allInputsTxBodyF, bodyTxL)
77+
import Cardano.Ledger.Hashes (DataHash)
7778
import Cardano.Prelude (putLByteString)
7879

7980
import RIO hiding (toList)
@@ -203,13 +204,14 @@ runTransactionBuildCmd
203204

204205
requiredSigners <-
205206
mapM (fromEitherIOCli . readRequiredSigner) reqSigners
206-
mReturnCollateral :: Maybe (Exp.TxOut (Exp.LedgerEra era)) <-
207+
mReturnCollateralAndDatums <-
207208
forM mReturnColl toTxOutInShelleyBasedEra
209+
let mReturnCollateral = fst <$> mReturnCollateralAndDatums
210+
returnCollDatums = maybe mempty snd mReturnCollateralAndDatums
208211

209-
txOuts <-
210-
mapM
211-
toTxOutInEra
212-
txouts
212+
txOutsAndDatums <- mapM toTxOutInEra txouts
213+
let txOuts = map fst txOutsAndDatums
214+
supplementalDatums = mconcat (map snd txOutsAndDatums) <> returnCollDatums
213215

214216
-- Conway related
215217
votingProceduresAndMaybeScriptWits :: [(VotingProcedures era, Exp.AnyWitness (Exp.LedgerEra era))] <-
@@ -321,6 +323,7 @@ runTransactionBuildCmd
321323
votingProceduresAndMaybeScriptWits
322324
proposals
323325
currentTreasuryValueAndDonation
326+
supplementalDatums
324327

325328
-- TODO: Calculating the script cost should live as a different command.
326329
-- Why? Because then we can simply read a txbody and figure out
@@ -374,7 +377,7 @@ runTransactionBuildCmd
374377
toTxOutInEra
375378
:: Exp.IsEra era
376379
=> TxOutAnyEra
377-
-> CIO e (Exp.TxOut (Exp.LedgerEra era))
380+
-> CIO e (Exp.TxOut (Exp.LedgerEra era), Map.Map DataHash (L.Data (Exp.LedgerEra era)))
378381
toTxOutInEra (TxOutAnyEra addr' val' mDatumHash refScriptFp) = do
379382
let addr = anyAddressInShelleyBasedEra (convert Exp.useEra) addr'
380383
o <- mkTxOut (convert Exp.useEra) addr val' mDatumHash refScriptFp
@@ -445,9 +448,13 @@ runTransactionBuildEstimateCmd -- TODO change type
445448
requiredSigners <-
446449
mapM (fromEitherIOCli . readRequiredSigner) reqSigners
447450

448-
mReturnCollateral <- mapM toTxOutInShelleyBasedEra mReturnColl
451+
mReturnCollateralAndDatums <- mapM toTxOutInShelleyBasedEra mReturnColl
452+
let mReturnCollateral = fst <$> mReturnCollateralAndDatums
453+
returnCollDatums = maybe mempty snd mReturnCollateralAndDatums
449454

450-
txOuts <- mapM toTxOutInEra txouts
455+
txOutsAndDatums <- mapM toTxOutInEra txouts
456+
let txOuts = map fst txOutsAndDatums
457+
supplementalDatums = mconcat (map snd txOutsAndDatums) <> returnCollDatums
451458

452459
-- the same collateral input can be used for several plutus scripts
453460
let filteredTxinsc = nubOrd txInsCollateral
@@ -498,6 +505,7 @@ runTransactionBuildEstimateCmd -- TODO change type
498505
votingProceduresAndMaybeScriptWits
499506
proposals
500507
currentTreasuryValueAndDonation
508+
supplementalDatums
501509

502510
let stakeCredentialsToDeregisterMap = fromList $ catMaybes [getStakeDeregistrationInfo cert | (cert, _) <- certsAndMaybeScriptWits]
503511
drepsToDeregisterMap =
@@ -653,9 +661,13 @@ runTransactionBuildRawCmd
653661
requiredSigners <-
654662
mapM (fromEitherIOCli . readRequiredSigner) reqSigners
655663

656-
mReturnCollateral <- mapM toTxOutInShelleyBasedEra mReturnColl
664+
mReturnCollateralAndDatums <- mapM toTxOutInShelleyBasedEra mReturnColl
665+
let mReturnCollateral = fst <$> mReturnCollateralAndDatums
666+
returnCollDatums = maybe mempty snd mReturnCollateralAndDatums
657667

658-
txOuts <- mapM toTxOutInEra txouts
668+
txOutsAndDatums <- mapM toTxOutInEra txouts
669+
let txOuts = map fst txOutsAndDatums
670+
supplementalDatums = mconcat (map snd txOutsAndDatums) <> returnCollDatums
659671

660672
-- the same collateral input can be used for several plutus scripts
661673
let filteredTxinsc = toList @(Set _) $ fromList txInsCollateral
@@ -700,6 +712,7 @@ runTransactionBuildRawCmd
700712
votingProceduresAndMaybeScriptWits
701713
proposals
702714
currentTreasuryValueAndDonation
715+
supplementalDatums
703716
let Exp.UnsignedTx lTx = txBody
704717
noWitTx = ShelleyTx (convert eon) lTx
705718
fromEitherIOCli $
@@ -741,6 +754,8 @@ runTxBuildRaw
741754
-> [(VotingProcedures era, Exp.AnyWitness (Exp.LedgerEra era))]
742755
-> [(Proposal era, Exp.AnyWitness (Exp.LedgerEra era))]
743756
-> Maybe (TxCurrentTreasuryValue, TxTreasuryDonation)
757+
-> Map.Map DataHash (L.Data (Exp.LedgerEra era))
758+
-- ^ Supplemental datums
744759
-> Either TxCmdError (Exp.UnsignedTx (Exp.LedgerEra era))
745760
runTxBuildRaw
746761
mScriptValidity
@@ -762,7 +777,8 @@ runTxBuildRaw
762777
mpparams
763778
votingProcedures
764779
proposals
765-
mCurrentTreasuryValueAndDonation = do
780+
mCurrentTreasuryValueAndDonation
781+
suppDatums = do
766782
txBodyContent <-
767783
constructTxBodyContent
768784
mScriptValidity
@@ -785,6 +801,7 @@ runTxBuildRaw
785801
votingProcedures
786802
proposals
787803
mCurrentTreasuryValueAndDonation
804+
suppDatums
788805

789806
return $ Exp.makeUnsignedTx Exp.useEra txBodyContent
790807

@@ -827,6 +844,8 @@ constructTxBodyContent
827844
-- ^ The current treasury value and the donation. This is a stop gap as the
828845
-- semantics of the donation and treasury value depend on the script languages
829846
-- being used.
847+
-> Map.Map DataHash (L.Data (Exp.LedgerEra era))
848+
-- ^ Supplemental datums
830849
-> Either TxCmdError (Exp.TxBodyContent (Exp.LedgerEra era))
831850
constructTxBodyContent
832851
mScriptValidity
@@ -848,7 +867,8 @@ constructTxBodyContent
848867
txMetadata
849868
votingProcedures
850869
proposals
851-
mCurrentTreasuryValueAndDonation =
870+
mCurrentTreasuryValueAndDonation
871+
suppDatums =
852872
do
853873
let allReferenceInputs =
854874
getAllReferenceInputs
@@ -912,6 +932,7 @@ constructTxBodyContent
912932
& Exp.setTxProposalProcedures validatedTxProposals
913933
& maybe id Exp.setTxCurrentTreasuryValue validatedCurrentTreasuryValue
914934
& maybe id Exp.setTxTreasuryDonation validatedTreasuryDonation
935+
& Exp.setTxSupplementalDatums suppDatums
915936
)
916937

917938
convertWithdrawals
@@ -978,6 +999,8 @@ runTxBuild
978999
-> [(Proposal era, Exp.AnyWitness (Exp.LedgerEra era))]
9791000
-> Maybe (TxCurrentTreasuryValue, TxTreasuryDonation)
9801001
-- ^ The current treasury value and the donation.
1002+
-> Map.Map DataHash (L.Data (Exp.LedgerEra era))
1003+
-- ^ Supplemental datums
9811004
-> ExceptT TxCmdError IO (Exp.UnsignedTx (Exp.LedgerEra era), Exp.TxBodyContent (Exp.LedgerEra era))
9821005
runTxBuild
9831006
socketPath
@@ -1002,7 +1025,8 @@ runTxBuild
10021025
mOverrideWits
10031026
votingProcedures
10041027
proposals
1005-
mCurrentTreasuryValueAndDonation = do
1028+
mCurrentTreasuryValueAndDonation
1029+
suppDatums = do
10061030
let sbe = convert (Exp.useEra @era)
10071031
shelleyBasedEraConstraints sbe $ do
10081032
-- TODO: All functions should be parameterized by ShelleyBasedEra
@@ -1068,6 +1092,7 @@ runTxBuild
10681092
votingProcedures
10691093
proposals
10701094
mCurrentTreasuryValueAndDonation
1095+
suppDatums
10711096

10721097
firstExceptT TxCmdTxInsDoNotExist
10731098
. hoistEither
@@ -1156,7 +1181,7 @@ getAllReferenceInputs
11561181
toTxOutInShelleyBasedEra
11571182
:: Exp.IsEra era
11581183
=> TxOutShelleyBasedEra
1159-
-> CIO e (Exp.TxOut (Exp.LedgerEra era))
1184+
-> CIO e (Exp.TxOut (Exp.LedgerEra era), Map.Map DataHash (L.Data (Exp.LedgerEra era)))
11601185
toTxOutInShelleyBasedEra (TxOutShelleyBasedEra addr' val' mDatumHash refScriptFp) = do
11611186
let sbe = convert Exp.useEra
11621187
addr = shelleyAddressInEra sbe addr'
@@ -1439,7 +1464,8 @@ runTransactionCalculateMinValueCmd
14391464
pp :: L.PParams (Exp.LedgerEra era) <-
14401465
fromExceptTCli @ProtocolParamsError
14411466
(obtainCommonConstraints era $ readProtocolParameters protocolParamsFile)
1442-
out <- obtainCommonConstraints era $ toTxOutInShelleyBasedEra txOut
1467+
(out, _suppDatums :: Map.Map DataHash (L.Data (Exp.LedgerEra era))) <-
1468+
obtainCommonConstraints era $ toTxOutInShelleyBasedEra txOut
14431469

14441470
let minValue = Exp.calculateMinimumUTxO pp out
14451471
liftIO . IO.print $ minValue
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"type": "Tx ConwayEra",
33
"description": "Ledger Cddl Format",
4-
"cborHex": "84a300d90102818258202392d2b1200b5139fe555c81261697b29a8ccf561c5c783d46e78a479d977053000181a3005839016b837ca50316ee4e00033482ed128887d72c2bae5b0438d692dc1251b0c8b17595ebdb93c1f974be0a9b1ef26c474649d9c2ae766ed135cf011864028201d81842182a020ca104d9010281182af5f6"
4+
"cborHex": "84a300d90102818258202392d2b1200b5139fe555c81261697b29a8ccf561c5c783d46e78a479d977053000181a3005839016b837ca50316ee4e00033482ed128887d72c2bae5b0438d692dc1251b0c8b17595ebdb93c1f974be0a9b1ef26c474649d9c2ae766ed135cf011864028201d81842182a020ca0f5f6"
55
}

flake.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)