@@ -23,6 +23,8 @@ module Cardano.Api.Experimental.Tx.Internal.BodyContent.New
2323 , TxBodyContent (.. )
2424 , Datum (.. )
2525 , defaultTxBodyContent
26+ , extractDatumsAndHashes
27+ , getDatums
2628 , collectTxBodyScriptWitnessRequirements
2729 , makeUnsignedTx
2830 , extractAllIndexedPlutusScriptWitnesses
@@ -59,12 +61,15 @@ module Cardano.Api.Experimental.Tx.Internal.BodyContent.New
5961 , convProposalProcedures
6062
6163 -- * Legacy conversions
64+ , DatumDecodingError (.. )
6265 , legacyDatumToDatum
6366 , fromLegacyTxOut
6467 )
6568where
6669
6770import Cardano.Api.Address
71+ import Cardano.Api.Error
72+ import Cardano.Api.Experimental.AnyScriptWitness
6873import Cardano.Api.Experimental.Certificate qualified as Exp
6974import Cardano.Api.Experimental.Era
7075import Cardano.Api.Experimental.Plutus
@@ -76,6 +81,7 @@ import Cardano.Api.Experimental.Plutus
7681import Cardano.Api.Experimental.Simple.Script
7782import Cardano.Api.Experimental.Tx.Internal.AnyWitness
7883 ( AnyWitness (.. )
84+ , anyScriptWitnessToAnyWitness
7985 )
8086import Cardano.Api.Experimental.Tx.Internal.Certificate.Compatible (getTxCertWitness )
8187import Cardano.Api.Experimental.Tx.Internal.TxScriptWitnessRequirements
@@ -91,6 +97,7 @@ import Cardano.Api.Key.Internal
9197import Cardano.Api.Ledger.Internal.Reexport (StrictMaybe (.. ))
9298import Cardano.Api.Ledger.Internal.Reexport qualified as L
9399import Cardano.Api.Plutus.Internal.ScriptData qualified as Api
100+ import Cardano.Api.Pretty
94101import Cardano.Api.Tx.Internal.Body
95102 ( CtxTx
96103 , TxIn
@@ -113,6 +120,7 @@ import Cardano.Ledger.Keys qualified as L
113120import Cardano.Ledger.Plutus.Language qualified as Plutus
114121
115122import Control.Monad
123+ import Data.ByteString.Short qualified as SBS
116124import Data.Functor
117125import Data.List qualified as List
118126import Data.Map.Ordered.Strict (OMap )
@@ -132,7 +140,7 @@ makeUnsignedTx
132140 :: forall era
133141 . Era era
134142 -> TxBodyContent (LedgerEra era )
135- -> UnsignedTx era
143+ -> UnsignedTx ( LedgerEra era )
136144makeUnsignedTx DijkstraEra _ = error " makeUnsignedTx: Dijkstra era not supported yet"
137145makeUnsignedTx era@ ConwayEra bc = obtainCommonConstraints era $ do
138146 let TxScriptWitnessRequirements languages scripts datums redeemers = collectTxBodyScriptWitnessRequirements bc
@@ -146,7 +154,7 @@ makeUnsignedTx era@ConwayEra bc = obtainCommonConstraints era $ do
146154 txins = convTxIns $ txIns bc
147155 collTxIns = convCollateralTxIns bc
148156 refTxIns = convReferenceInputs apiReferenceInputs
149- outs = fromList [o | TxOut o _ <- txOuts bc]
157+ outs = fromList [o | TxOut o <- txOuts bc]
150158 protocolParameters = txProtocolParams bc
151159 fee = txFee bc
152160 withdrawals = convWithdrawals $ txWithdrawals bc
@@ -310,12 +318,12 @@ eraSpecificLedgerTxBody era ledgerbody bc =
310318 & L. currentTreasuryValueTxBodyL
311319 .~ L. maybeToStrictMaybe currentTreasuryValue
312320
313- data TxOut ctx era where
314- TxOut :: L. EraTxOut era => L. TxOut era -> Maybe ( Datum ctx era ) -> TxOut ctx era
321+ data TxOut era where
322+ TxOut :: L. EraTxOut era => L. TxOut era -> TxOut era
315323
316- deriving instance (Show (TxOut ctx era ))
324+ deriving instance (Show (TxOut era ))
317325
318- deriving instance (Eq (TxOut ctx era ))
326+ deriving instance (Eq (TxOut era ))
319327
320328data Datum ctx era where
321329 TxOutDatumHash
@@ -354,10 +362,32 @@ legacyDatumToDatum (OldApi.TxOutDatumInline _ hd) = do
354362 Just (TxOutDatumInline hash d)
355363legacyDatumToDatum OldApi. TxOutDatumNone = Nothing
356364
357- fromLegacyTxOut :: forall era . IsEra era => OldApi. TxOut CtxTx era -> TxOut CtxTx (LedgerEra era )
358- fromLegacyTxOut tOut@ (OldApi. TxOut _ _ d _) =
365+ fromLegacyTxOut
366+ :: forall era . IsEra era => OldApi. TxOut CtxTx era -> Either DatumDecodingError (TxOut (LedgerEra era ))
367+ fromLegacyTxOut tOut@ (OldApi. TxOut _ _ d _) = do
359368 let o = OldApi. toShelleyTxOutAny (convert $ useEra @ era ) tOut
360- in obtainCommonConstraints (useEra @ era ) $ TxOut o (legacyDatumToDatum d)
369+ newDatum :: L. Datum (LedgerEra era ) <- obtainCommonConstraints (useEra @ era ) $ toLedgerDatum d
370+ return $ obtainCommonConstraints (useEra @ era ) $ TxOut $ o & L. datumTxOutL .~ newDatum
371+
372+ newtype DatumDecodingError = DatumDecodingError String
373+ deriving (Show , Eq )
374+
375+ instance Error DatumDecodingError where
376+ prettyError (DatumDecodingError msg) = " Datum decoding error: " <> pshow msg
377+
378+ toLedgerDatum
379+ :: L. Era (LedgerEra era )
380+ => OldApi. TxOutDatum CtxTx era -> Either DatumDecodingError (L. Datum (LedgerEra era ))
381+ toLedgerDatum OldApi. TxOutDatumNone = Right L. NoDatum
382+ toLedgerDatum (OldApi. TxOutDatumHash _ (Api. ScriptDataHash h)) = Right $ L. DatumHash h
383+ toLedgerDatum (OldApi. TxOutSupplementalDatum _ h) =
384+ case L. makeBinaryData $ SBS. toShort $ Api. getOriginalScriptDataBytes h of
385+ Left e -> Left $ DatumDecodingError e
386+ Right bd -> Right $ L. Datum bd
387+ toLedgerDatum (OldApi. TxOutDatumInline _ h) =
388+ case L. makeBinaryData $ SBS. toShort $ Api. getOriginalScriptDataBytes h of
389+ Left e -> Left $ DatumDecodingError e
390+ Right bd -> Right $ L. Datum bd
361391
362392data TxInsReference era = TxInsReference [TxIn ] (Set (Datum CtxTx era ))
363393
@@ -399,14 +429,13 @@ mkTxCertificates era certs = TxCertificates . OMap.fromList $ map getStakeCred c
399429 getStakeCred (c@ (Exp. Certificate cert), wit) =
400430 (c, (,wit) <$> getTxCertWitness (convert era) (obtainCommonConstraints era cert))
401431
402- -- This is incorrect. Only scripts can witness minting!
403432newtype TxMintValue era
404433 = TxMintValue
405434 { unTxMintValue
406435 :: Map
407436 PolicyId
408437 ( PolicyAssets
409- , AnyWitness era
438+ , AnyScriptWitness era
410439 )
411440 }
412441 deriving (Eq , Show )
@@ -489,7 +518,7 @@ data TxBodyContent era
489518 { txIns :: [(TxIn , AnyWitness era )]
490519 , txInsCollateral :: [TxIn ]
491520 , txInsReference :: TxInsReference era
492- , txOuts :: [TxOut CtxTx era ]
521+ , txOuts :: [TxOut era ]
493522 , txTotalCollateral :: Maybe TxTotalCollateral
494523 , txReturnCollateral :: Maybe (TxReturnCollateral era )
495524 , txFee :: L. Coin
@@ -548,7 +577,7 @@ extractAllIndexedPlutusScriptWitnesses
548577extractAllIndexedPlutusScriptWitnesses era b = obtainCommonConstraints era $ do
549578 let txInWits = extractWitnessableTxIns $ txIns b
550579 certWits = extractWitnessableCertificates $ txCertificates b
551- mintWits = extractWitnessableMints $ txMintValue b
580+ mintWits = [(wit, anyScriptWitnessToAnyWitness sw) | (wit, sw) <- extractWitnessableMints $ txMintValue b]
552581 withdrawalWits = extractWitnessableWithdrawals $ txWithdrawals b
553582 proposalScriptWits = extractWitnessableProposals $ txProposalProcedures b
554583 voteWits = extractWitnessableVotes $ txVotingProcedures b
@@ -598,7 +627,7 @@ extractWitnessableMints
598627 :: forall era
599628 . IsEra era
600629 => TxMintValue (LedgerEra era )
601- -> [(Witnessable MintItem (LedgerEra era ), AnyWitness (LedgerEra era ))]
630+ -> [(Witnessable MintItem (LedgerEra era ), AnyScriptWitness (LedgerEra era ))]
602631extractWitnessableMints mVal =
603632 obtainCommonConstraints (useEra @ era ) $
604633 List. nub
@@ -700,7 +729,7 @@ collectTxBodyScriptWitnessRequirements
700729 extractWitnessableCertificates txCertificates
701730 txMintWits =
702731 obtainMonoidConstraint (useEra @ era ) getTxScriptWitnessesRequirements $
703- extractWitnessableMints txMintValue
732+ [(wit, anyScriptWitnessToAnyWitness sw) | (wit, sw) <- extractWitnessableMints txMintValue]
704733 txVotingWits =
705734 obtainMonoidConstraint (useEra @ era ) getTxScriptWitnessesRequirements $
706735 extractWitnessableVotes txVotingProcedures
@@ -738,14 +767,18 @@ getDatums
738767 . IsEra era
739768 => TxInsReference (LedgerEra era )
740769 -- ^ reference inputs
741- -> [TxOut CtxTx (LedgerEra era )]
770+ -> [TxOut (LedgerEra era )]
742771 -> L. TxDats (LedgerEra era )
743772getDatums txInsRef txOutsFromTx = do
744773 let TxInsReference _ datumSet = txInsRef
745774 refInDatums = mapMaybe extractDatumsAndHashes $ Set. toList datumSet
746775 -- use only supplemental datum
747776 txOutsDats =
748- [(h, d) | TxOut _ (Just (TxOutSupplementalDatum h d)) <- txOutsFromTx]
777+ [ (L. hashData d, d)
778+ | TxOut txout <- txOutsFromTx
779+ , d <-
780+ maybeToList $ L. strictMaybeToMaybe $ txout ^. obtainCommonConstraints (useEra @ era ) L. dataTxOutL
781+ ]
749782 :: [(L. DataHash , L. Data (LedgerEra era ))]
750783 obtainCommonConstraints (useEra @ era ) $
751784 L. TxDats $
@@ -790,7 +823,7 @@ setTxMetadata v txBodyContent = txBodyContent{txMetadata = v}
790823setTxFee :: L. Coin -> TxBodyContent era -> TxBodyContent era
791824setTxFee v txBodyContent = txBodyContent{txFee = v}
792825
793- setTxOuts :: [TxOut CtxTx era ] -> TxBodyContent era -> TxBodyContent era
826+ setTxOuts :: [TxOut era ] -> TxBodyContent era -> TxBodyContent era
794827setTxOuts v txBodyContent = txBodyContent{txOuts = v}
795828
796829setTxMintValue :: TxMintValue era -> TxBodyContent era -> TxBodyContent era
@@ -818,5 +851,5 @@ setTxTreasuryDonation :: L.Coin -> TxBodyContent era -> TxBodyContent era
818851setTxTreasuryDonation v txBodyContent = txBodyContent{txTreasuryDonation = Just v}
819852
820853modTxOuts
821- :: ([TxOut CtxTx era ] -> [TxOut CtxTx era ]) -> TxBodyContent era -> TxBodyContent era
854+ :: ([TxOut era ] -> [TxOut era ]) -> TxBodyContent era -> TxBodyContent era
822855modTxOuts f txBodyContent = txBodyContent{txOuts = f (txOuts txBodyContent)}
0 commit comments