Skip to content

Commit a58eab7

Browse files
authored
Merge pull request #1004 from IntersectMBO/newhoggy/refactor-alonzoTxOutParser
refactor(internal): improve clarity and maintainability of alonzoTxOutParser
2 parents a2df13b + 233176b commit a58eab7

File tree

1 file changed

+28
-24
lines changed
  • cardano-api/src/Cardano/Api/Tx/Internal

1 file changed

+28
-24
lines changed

cardano-api/src/Cardano/Api/Tx/Internal/Output.hs

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -586,31 +586,35 @@ instance IsShelleyBasedEra era => FromJSON (TxOut CtxTx era) where
586586
alonzoTxOutParser
587587
:: AlonzoEraOnwards era -> Aeson.Object -> Aeson.Parser (TxOut CtxTx era)
588588
alonzoTxOutParser w o = do
589+
-- Parse optional datum fields (both hash and JSON value may be present)
589590
mDatumHash <- o .:? "datumhash"
590-
mDatumVal <- o .:? "datum"
591-
case (mDatumVal, mDatumHash) of
592-
(Nothing, Nothing) ->
593-
TxOut
594-
<$> o .: "address"
595-
<*> o .: "value"
596-
<*> return TxOutDatumNone
597-
<*> return ReferenceScriptNone
598-
(Just dVal, Just{}) -> do
599-
case scriptDataJsonToHashable ScriptDataJsonDetailedSchema dVal of
600-
Left e -> fail $ "Error parsing ScriptData: " <> show e
601-
Right hashableData ->
602-
TxOut
603-
<$> o .: "address"
604-
<*> o .: "value"
605-
<*> return (TxOutSupplementalDatum w hashableData)
606-
<*> return ReferenceScriptNone
607-
(Nothing, Just dHash) ->
608-
TxOut
609-
<$> o .: "address"
610-
<*> o .: "value"
611-
<*> return (TxOutDatumHash w dHash)
612-
<*> return ReferenceScriptNone
613-
(Just _dVal, Nothing) -> fail "Only datum JSON was found, this should not be possible."
591+
mDatumJson <- o .:? "datum"
592+
593+
-- Parse required fields common to all TxOuts
594+
parsedAddress <- o .: "address"
595+
parsedValue <- o .: "value"
596+
597+
-- Parse datum based on which fields are present
598+
txOutDatum <-
599+
case (mDatumJson, mDatumHash) of
600+
-- No datum information provided
601+
(Nothing, Nothing) ->
602+
pure TxOutDatumNone
603+
-- Only datum hash provided (datum not included in tx)
604+
(Nothing, Just dHash) ->
605+
pure (TxOutDatumHash w dHash)
606+
-- Both hash and JSON provided (supplemental datum in tx body)
607+
(Just datumJson, Just{}) -> do
608+
case scriptDataJsonToHashable ScriptDataJsonDetailedSchema datumJson of
609+
Left e -> fail $ "Error parsing ScriptData: " <> show e
610+
Right hashableData ->
611+
pure (TxOutSupplementalDatum w hashableData)
612+
-- Only JSON provided without hash (invalid state)
613+
(Just _datumJson, Nothing) ->
614+
fail "Only datum JSON was found, this should not be possible."
615+
616+
-- Note: ReferenceScript is always None for Alonzo-era parsing
617+
pure $ TxOut parsedAddress parsedValue txOutDatum ReferenceScriptNone
614618

615619
instance IsShelleyBasedEra era => FromJSON (TxOut CtxUTxO era) where
616620
parseJSON = withObject "TxOut" $ \o -> do

0 commit comments

Comments
 (0)