@@ -147,7 +147,7 @@ import Cardano.Ledger.Plutus.Language qualified as Plutus
147147import Control.Monad
148148import Data.Aeson (FromJSON (.. ), ToJSON (.. ), (.:) , (.:?) , (.=) )
149149import Data.Aeson qualified as Aeson
150- import Data.Aeson.Types (Parser )
150+ import Data.Aeson.Types (Pair , Parser )
151151import Data.ByteString.Base16 qualified as Base16
152152import Data.ByteString.Short qualified as SBS
153153import Data.Functor
@@ -405,42 +405,44 @@ alonzoOnwardsTxOutToJson (TxOut o) =
405405 [ " address" .= addrToJson (o ^. L. addrTxOutL)
406406 , " value" .= valueToJson (o ^. L. valueTxOutL)
407407 ]
408- <> datumFields mDatum
409- <> inlineDatumFields isBabbagePlus mDatum
410- <> refScriptFields mRefScript
408+ <> datumAndRefScriptFields (o ^. L. datumTxOutG) (o ^. L. referenceScriptTxOutG)
409+
410+ -- | Emit the datum, inline-datum, and reference-script JSON fields appropriate
411+ -- for the era. Pre-Alonzo emits nothing; Alonzo emits @datumhash@ and @datum@;
412+ -- Babbage+ additionally emits @inlineDatum@, @inlineDatumRaw@, @inlineDatumhash@
413+ -- and @referenceScript@.
414+ datumAndRefScriptFields
415+ :: L. AlonzoEraScript era
416+ => Maybe (L. Datum era )
417+ -> Maybe (Maybe (L. Script era ))
418+ -> [Pair ]
419+ datumAndRefScriptFields mDatum mRefScript =
420+ datumFields <> inlineDatumFields <> refScriptFields
411421 where
412- mDatum = o ^. L. datumTxOutG
413- mRefScript = o ^. L. referenceScriptTxOutG
414422 isBabbagePlus = isJust mRefScript
415423
416- datumFields Nothing = []
417- datumFields (Just L. NoDatum ) =
418- [" datumhash" .= Aeson. Null , " datum" .= Aeson. Null ]
419- datumFields (Just (L. DatumHash dh)) =
420- [" datumhash" .= dh, " datum" .= Aeson. Null ]
421- datumFields (Just (L. Datum _)) =
422- [" datum" .= Aeson. Null ]
423-
424- inlineDatumFields _ (Just (L. Datum bd)) =
425- let hsd = Api. fromAlonzoData (L. binaryDataToData bd)
426- in [ " inlineDatumhash" .= L. hashBinaryData bd
427- , " inlineDatum" .= Api. scriptDataToJsonDetailedSchema hsd
428- , " inlineDatumRaw"
429- .= ( Aeson. String
430- . Text. decodeUtf8
431- . Base16. encode
432- . serialiseToCBOR
433- $ hsd
434- )
435- ]
436- inlineDatumFields True _ =
437- [" inlineDatum" .= Aeson. Null , " inlineDatumRaw" .= Aeson. Null ]
438- inlineDatumFields _ _ = []
439-
440- refScriptFields Nothing = []
441- refScriptFields (Just Nothing ) = [" referenceScript" .= Aeson. Null ]
442- refScriptFields (Just (Just script)) =
443- [" referenceScript" .= ledgerScriptToScriptInAnyLang script]
424+ datumFields = case mDatum of
425+ Nothing -> []
426+ Just L. NoDatum -> [" datumhash" .= Aeson. Null , " datum" .= Aeson. Null ]
427+ Just (L. DatumHash dh) -> [" datumhash" .= dh, " datum" .= Aeson. Null ]
428+ Just (L. Datum _) -> [" datum" .= Aeson. Null ]
429+
430+ inlineDatumFields = case mDatum of
431+ Just (L. Datum bd) ->
432+ let hsd = Api. fromAlonzoData (L. binaryDataToData bd)
433+ in [ " inlineDatumhash" .= L. hashBinaryData bd
434+ , " inlineDatum" .= Api. scriptDataToJsonDetailedSchema hsd
435+ , " inlineDatumRaw"
436+ .= (Aeson. String . Text. decodeUtf8 . Base16. encode . serialiseToCBOR $ hsd)
437+ ]
438+ _
439+ | isBabbagePlus -> [" inlineDatum" .= Aeson. Null , " inlineDatumRaw" .= Aeson. Null ]
440+ | otherwise -> []
441+
442+ refScriptFields = case mRefScript of
443+ Nothing -> []
444+ Just Nothing -> [" referenceScript" .= Aeson. Null ]
445+ Just (Just script) -> [" referenceScript" .= ledgerScriptToScriptInAnyLang script]
444446
445447-- | Render just the base fields (address and value) shared by all eras.
446448txOutBaseJson :: L. EraTxOut era => L. TxOut era -> Aeson. Value
0 commit comments