Skip to content

Commit 3467b7f

Browse files
committed
Collapse datum and reference script field helpers into one function
Replace the three separate where-bound helpers (datumFields, inlineDatumFields, refScriptFields) with a single top-level datumAndRefScriptFields function. Simplifies alonzoOnwardsTxOutToJson and documents the per-era field layout in one place.
1 parent 70dc595 commit 3467b7f

1 file changed

Lines changed: 36 additions & 34 deletions

File tree

  • cardano-api/src/Cardano/Api/Experimental/Tx/Internal/BodyContent

cardano-api/src/Cardano/Api/Experimental/Tx/Internal/BodyContent/New.hs

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ import Cardano.Ledger.Plutus.Language qualified as Plutus
147147
import Control.Monad
148148
import Data.Aeson (FromJSON (..), ToJSON (..), (.:), (.:?), (.=))
149149
import Data.Aeson qualified as Aeson
150-
import Data.Aeson.Types (Parser)
150+
import Data.Aeson.Types (Pair, Parser)
151151
import Data.ByteString.Base16 qualified as Base16
152152
import Data.ByteString.Short qualified as SBS
153153
import 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.
446448
txOutBaseJson :: L.EraTxOut era => L.TxOut era -> Aeson.Value

0 commit comments

Comments
 (0)