@@ -74,6 +74,7 @@ import Cardano.CLI.Type.Error.TxCmdError
7474import Cardano.CLI.Type.Error.TxValidationError
7575import Cardano.CLI.Type.Output (renderScriptCostsWithScriptHashesMap )
7676import Cardano.Ledger.Api (allInputsTxBodyF , bodyTxL )
77+ import Cardano.Ledger.Hashes (DataHash )
7778import Cardano.Prelude (putLByteString )
7879
7980import 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
374377toTxOutInEra
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 )) )
378381toTxOutInEra (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 ))
745760runTxBuildRaw
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 ))
831850constructTxBodyContent
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
917938convertWithdrawals
@@ -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 ))
9821005runTxBuild
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
11561181toTxOutInShelleyBasedEra
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 )) )
11601185toTxOutInShelleyBasedEra (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
0 commit comments