@@ -18,11 +18,12 @@ import Cardano.CLI.EraBased.Script.Read.Common
1818import Cardano.CLI.Orphan ()
1919import Cardano.CLI.Read
2020import Cardano.CLI.Type.Common
21+ import Cardano.Ledger.Api.Tx qualified as L
2122import Cardano.Ledger.Hashes (DataHash )
22- import Cardano.Ledger.Plutus.Data qualified as L
2323
2424import Data.Map.Strict (Map )
2525import Data.Map.Strict qualified as Map
26+ import Lens.Micro
2627
2728toTxOutInAnyEra
2829 :: ShelleyBasedEra era
@@ -32,51 +33,101 @@ toTxOutInAnyEra era (TxOutAnyEra addr' val' mDatumHash refScriptFp) = do
3233 let addr = anyAddressInShelleyBasedEra era addr'
3334 mkTxOut era addr val' mDatumHash refScriptFp
3435
35- -- | Build an output for a transaction body. Produces the experimental
36- -- 'Exp.TxOut' plus any supplemental datum bodies that the caller-supplied
37- -- datum carries. The legacy 'TxOut CtxTx era' bundled supplemental datums
38- -- inside outputs; 'Exp.TxOut' only carries the datum hash, so callers thread
39- -- the full datum bodies in separately (e.g. via 'createCompatibleTx').
40- --
41- -- The legacy 'TxOut CtxTx era' is used internally as a stepping stone to
42- -- reuse the api's 'toShelleyTxOutAny' field-level conversion logic; it is
43- -- not exposed.
4436mkTxOut
4537 :: ShelleyBasedEra era
4638 -> AddressInEra era
4739 -> Value
4840 -> TxOutDatumAnyEra
4941 -> ReferenceScriptAnyEra
5042 -> CIO e (Exp. TxOut (ShelleyLedgerEra era ), Map DataHash (L. Data (ShelleyLedgerEra era )))
51- mkTxOut sbe addr val' mDatumHash refScriptFp = do
52- let era = toCardanoEra sbe
53- val <- toTxOutValueInShelleyBasedEra sbe val'
54-
55- datum <-
56- inEonForEra
57- (pure TxOutDatumNone )
58- (`toTxAlonzoDatum` mDatumHash)
59- era
60-
61- refScript <-
62- inEonForEra
63- (pure ReferenceScriptNone )
64- (`getReferenceScript` refScriptFp)
65- era
66-
67- let legacyTxOut = TxOut addr val datum refScript
68- pure $
69- shelleyBasedEraConstraints sbe $
70- (Exp. TxOut (toShelleyTxOutAny sbe legacyTxOut), supplementalsOf datum)
71- where
72- supplementalsOf
73- :: L. Era (ShelleyLedgerEra era )
74- => TxOutDatum CtxTx era
75- -> Map DataHash (L. Data (ShelleyLedgerEra era ))
76- supplementalsOf (TxOutSupplementalDatum _ h) =
77- let ld = toAlonzoData h
78- in Map. singleton (L. hashData ld) ld
79- supplementalsOf _ = mempty
43+ mkTxOut sbe addr val' mDatumAnyEra refScriptFp = do
44+ txVal <- toTxOutValueInShelleyBasedEra sbe val'
45+ let ledgerAddr = toShelleyAddr addr
46+ shelleyBasedEraConstraints sbe $
47+ case txVal of
48+ TxOutValueShelleyBased _ ledgerVal ->
49+ case sbe of
50+ ShelleyBasedEraShelley -> pure (Exp. TxOut (L. mkBasicTxOut ledgerAddr ledgerVal), mempty )
51+ ShelleyBasedEraAllegra -> pure (Exp. TxOut (L. mkBasicTxOut ledgerAddr ledgerVal), mempty )
52+ ShelleyBasedEraMary -> pure (Exp. TxOut (L. mkBasicTxOut ledgerAddr ledgerVal), mempty )
53+ ShelleyBasedEraAlonzo -> do
54+ (mDH, suppl) <- alonzoDatumFields mDatumAnyEra
55+ pure
56+ ( Exp. TxOut (L. mkBasicTxOut ledgerAddr ledgerVal & L. dataHashTxOutL .~ mDH)
57+ , suppl
58+ )
59+ ShelleyBasedEraBabbage -> do
60+ (dat, suppl) <- babbageDatumFields mDatumAnyEra
61+ refScript <- readRefScript BabbageEraOnwardsBabbage refScriptFp
62+ pure
63+ ( Exp. TxOut
64+ ( L. mkBasicTxOut ledgerAddr ledgerVal
65+ & L. datumTxOutL .~ dat
66+ & L. referenceScriptTxOutL .~ refScript
67+ )
68+ , suppl
69+ )
70+ ShelleyBasedEraConway -> do
71+ (dat, suppl) <- babbageDatumFields mDatumAnyEra
72+ refScript <- readRefScript BabbageEraOnwardsConway refScriptFp
73+ pure
74+ ( Exp. TxOut
75+ ( L. mkBasicTxOut ledgerAddr ledgerVal
76+ & L. datumTxOutL .~ dat
77+ & L. referenceScriptTxOutL .~ refScript
78+ )
79+ , suppl
80+ )
81+
82+ alonzoDatumFields
83+ :: L. Era ledgerera
84+ => TxOutDatumAnyEra
85+ -> CIO e (L. StrictMaybe DataHash , Map DataHash (L. Data ledgerera ))
86+ alonzoDatumFields = \ case
87+ TxOutDatumByNone ->
88+ pure (L. SNothing , mempty )
89+ TxOutDatumByHashOnly h ->
90+ pure (L. SJust (unScriptDataHash h), mempty )
91+ TxOutDatumByHashOf sDataOrFile -> do
92+ sData <- fromExceptTCli $ readScriptDataOrFile sDataOrFile
93+ pure (L. SJust (unScriptDataHash (hashScriptDataBytes sData)), mempty )
94+ TxOutDatumByValue sDataOrFile -> do
95+ sData <- fromExceptTCli $ readScriptDataOrFile sDataOrFile
96+ let ld = toAlonzoData sData
97+ dh = L. hashData ld
98+ pure (L. SJust dh, Map. singleton dh ld)
99+ TxOutInlineDatumByValue _ ->
100+ throwCliError $ TxCmdTxFeatureMismatch (AnyCardanoEra AlonzoEra ) TxFeatureInlineDatums
101+
102+ babbageDatumFields
103+ :: L. Era ledgerera
104+ => TxOutDatumAnyEra
105+ -> CIO e (L. Datum ledgerera , Map DataHash (L. Data ledgerera ))
106+ babbageDatumFields = \ case
107+ TxOutDatumByNone ->
108+ pure (L. NoDatum , mempty )
109+ TxOutDatumByHashOnly h ->
110+ pure (L. DatumHash (unScriptDataHash h), mempty )
111+ TxOutDatumByHashOf sDataOrFile -> do
112+ sData <- fromExceptTCli $ readScriptDataOrFile sDataOrFile
113+ pure (L. DatumHash (unScriptDataHash (hashScriptDataBytes sData)), mempty )
114+ TxOutDatumByValue sDataOrFile -> do
115+ sData <- fromExceptTCli $ readScriptDataOrFile sDataOrFile
116+ let dh = unScriptDataHash (hashScriptDataBytes sData)
117+ pure (L. DatumHash dh, Map. singleton dh (toAlonzoData sData))
118+ TxOutInlineDatumByValue sDataOrFile -> do
119+ sData <- fromExceptTCli $ readScriptDataOrFile sDataOrFile
120+ pure (scriptDataToInlineDatum sData, mempty )
121+
122+ readRefScript
123+ :: BabbageEraOnwards era
124+ -> ReferenceScriptAnyEra
125+ -> CIO e (L. StrictMaybe (L. Script (ShelleyLedgerEra era )))
126+ readRefScript boe = \ case
127+ ReferenceScriptAnyEraNone -> pure L. SNothing
128+ ReferenceScriptAnyEra fp -> do
129+ script <- readFileScriptInAnyLang fp
130+ pure $ refScriptToShelleyScript (convert boe) (ReferenceScript boe script)
80131
81132toTxOutValueInShelleyBasedEra
82133 :: ShelleyBasedEra era
@@ -91,35 +142,6 @@ toTxOutValueInShelleyBasedEra sbe val =
91142 (\ w -> return (TxOutValueShelleyBased sbe (toLedgerValue w val)))
92143 sbe
93144
94- toTxAlonzoDatum
95- :: ()
96- => AlonzoEraOnwards era
97- -> TxOutDatumAnyEra
98- -> CIO e (TxOutDatum CtxTx era )
99- toTxAlonzoDatum supp cliDatum =
100- case cliDatum of
101- TxOutDatumByNone -> pure TxOutDatumNone
102- TxOutDatumByHashOnly h -> pure (TxOutDatumHash supp h)
103- TxOutDatumByHashOf sDataOrFile -> do
104- sData <- fromExceptTCli $ readScriptDataOrFile sDataOrFile
105- pure (TxOutDatumHash supp $ hashScriptDataBytes sData)
106- TxOutDatumByValue sDataOrFile -> do
107- sData <- fromExceptTCli $ readScriptDataOrFile sDataOrFile
108- pure (TxOutSupplementalDatum supp sData)
109- TxOutInlineDatumByValue sDataOrFile -> do
110- let cEra = toCardanoEra supp
111- forEraInEon cEra (txFeatureMismatch cEra TxFeatureInlineDatums ) $ \ babbageOnwards -> do
112- sData <- fromExceptTCli $ readScriptDataOrFile sDataOrFile
113- pure $ TxOutDatumInline babbageOnwards sData
114-
115- getReferenceScript
116- :: BabbageEraOnwards era
117- -> ReferenceScriptAnyEra
118- -> CIO e (ReferenceScript era )
119- getReferenceScript w = \ case
120- ReferenceScriptAnyEraNone -> return ReferenceScriptNone
121- ReferenceScriptAnyEra fp -> ReferenceScript w <$> readFileScriptInAnyLang fp
122-
123145-- | An enumeration of era-dependent features where we have to check that it
124146-- is permissible to use this feature in this era.
125147data TxFeature
0 commit comments