Skip to content

Commit 87cfa8a

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 7a2ac3c commit 87cfa8a

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
@@ -154,7 +154,7 @@ import Cardano.Ledger.Plutus.Language qualified as Plutus
154154
import Control.Monad
155155
import Data.Aeson (FromJSON (..), ToJSON (..), (.:), (.:?), (.=))
156156
import Data.Aeson qualified as Aeson
157-
import Data.Aeson.Types (Parser)
157+
import Data.Aeson.Types (Pair, Parser)
158158
import Data.ByteString.Base16 qualified as Base16
159159
import Data.ByteString.Short qualified as SBS
160160
import 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.
432434
txOutBaseJson :: L.EraTxOut era => L.TxOut era -> Aeson.Value

0 commit comments

Comments
 (0)