@@ -154,7 +154,7 @@ import Cardano.Ledger.Plutus.Language qualified as Plutus
154154import Control.Monad
155155import Data.Aeson (FromJSON (.. ), ToJSON (.. ), (.:) , (.:?) , (.=) )
156156import Data.Aeson qualified as Aeson
157- import Data.Aeson.Types (Parser )
157+ import Data.Aeson.Types (Pair , Parser )
158158import Data.ByteString.Base16 qualified as Base16
159159import Data.ByteString.Short qualified as SBS
160160import Data.Functor
@@ -391,42 +391,44 @@ alonzoOnwardsTxOutToJson (TxOut o) =
391391 [ " address" .= addrToJson (o ^. L. addrTxOutL)
392392 , " value" .= valueToJson (o ^. L. valueTxOutL)
393393 ]
394- <> datumFields mDatum
395- <> inlineDatumFields isBabbagePlus mDatum
396- <> refScriptFields mRefScript
394+ <> datumAndRefScriptFields (o ^. L. datumTxOutG) (o ^. L. referenceScriptTxOutG)
395+
396+ -- | Emit the datum, inline-datum, and reference-script JSON fields appropriate
397+ -- for the era. Pre-Alonzo emits nothing; Alonzo emits @datumhash@ and @datum@;
398+ -- Babbage+ additionally emits @inlineDatum@, @inlineDatumRaw@, @inlineDatumhash@
399+ -- and @referenceScript@.
400+ datumAndRefScriptFields
401+ :: L. AlonzoEraScript era
402+ => Maybe (L. Datum era )
403+ -> Maybe (Maybe (L. Script era ))
404+ -> [Pair ]
405+ datumAndRefScriptFields mDatum mRefScript =
406+ datumFields <> inlineDatumFields <> refScriptFields
397407 where
398- mDatum = o ^. L. datumTxOutG
399- mRefScript = o ^. L. referenceScriptTxOutG
400408 isBabbagePlus = isJust mRefScript
401409
402- datumFields Nothing = []
403- datumFields (Just L. NoDatum ) =
404- [" datumhash" .= Aeson. Null , " datum" .= Aeson. Null ]
405- datumFields (Just (L. DatumHash dh)) =
406- [" datumhash" .= dh, " datum" .= Aeson. Null ]
407- datumFields (Just (L. Datum _)) =
408- [" datum" .= Aeson. Null ]
409-
410- inlineDatumFields _ (Just (L. Datum bd)) =
411- let hsd = Api. fromAlonzoData (L. binaryDataToData bd)
412- in [ " inlineDatumhash" .= L. hashBinaryData bd
413- , " inlineDatum" .= Api. scriptDataToJsonDetailedSchema hsd
414- , " inlineDatumRaw"
415- .= ( Aeson. String
416- . Text. decodeUtf8
417- . Base16. encode
418- . serialiseToCBOR
419- $ hsd
420- )
421- ]
422- inlineDatumFields True _ =
423- [" inlineDatum" .= Aeson. Null , " inlineDatumRaw" .= Aeson. Null ]
424- inlineDatumFields _ _ = []
425-
426- refScriptFields Nothing = []
427- refScriptFields (Just Nothing ) = [" referenceScript" .= Aeson. Null ]
428- refScriptFields (Just (Just script)) =
429- [" referenceScript" .= ledgerScriptToScriptInAnyLang script]
410+ datumFields = case mDatum of
411+ Nothing -> []
412+ Just L. NoDatum -> [" datumhash" .= Aeson. Null , " datum" .= Aeson. Null ]
413+ Just (L. DatumHash dh) -> [" datumhash" .= dh, " datum" .= Aeson. Null ]
414+ Just (L. Datum _) -> [" datum" .= Aeson. Null ]
415+
416+ inlineDatumFields = case mDatum of
417+ Just (L. Datum bd) ->
418+ let hsd = Api. fromAlonzoData (L. binaryDataToData bd)
419+ in [ " inlineDatumhash" .= L. hashBinaryData bd
420+ , " inlineDatum" .= Api. scriptDataToJsonDetailedSchema hsd
421+ , " inlineDatumRaw"
422+ .= (Aeson. String . Text. decodeUtf8 . Base16. encode . serialiseToCBOR $ hsd)
423+ ]
424+ _
425+ | isBabbagePlus -> [" inlineDatum" .= Aeson. Null , " inlineDatumRaw" .= Aeson. Null ]
426+ | otherwise -> []
427+
428+ refScriptFields = case mRefScript of
429+ Nothing -> []
430+ Just Nothing -> [" referenceScript" .= Aeson. Null ]
431+ Just (Just script) -> [" referenceScript" .= ledgerScriptToScriptInAnyLang script]
430432
431433-- | Render just the base fields (address and value) shared by all eras.
432434txOutBaseJson :: L. EraTxOut era => L. TxOut era -> Aeson. Value
0 commit comments