@@ -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
615619instance IsShelleyBasedEra era => FromJSON (TxOut CtxUTxO era ) where
616620 parseJSON = withObject " TxOut" $ \ o -> do
0 commit comments