Skip to content

Commit 26e41b2

Browse files
committed
refactor(api): unify reconcileBabbage and reconcileConway functions
Replaces two nearly-identical datum reconciliation functions with a single reconcileDatums function that works for all Babbage+ eras, eliminating ~40 lines of duplicated code. The unified function: - Works with BabbageEraOnwards constraint (covering Babbage, Conway, Dijkstra) - Uses era witness to construct appropriate ReferenceScript types - Generates era-specific error messages dynamically - Handles conflicting Alonzo-style and Babbage-style datums All tests pass, confirming behavioral equivalence and backwards compatibility.
1 parent 8c94320 commit 26e41b2

File tree

1 file changed

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

1 file changed

+28
-43
lines changed

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

Lines changed: 28 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -459,17 +459,17 @@ instance IsShelleyBasedEra era => FromJSON (TxOut CtxTx era) where
459459
alonzoTxOutInBabbage <- alonzoTxOutParser AlonzoEraOnwardsBabbage o
460460
mInlineDatum <- parseInlineDatum BabbageEraOnwardsBabbage o
461461
mReferenceScript <- o .:? "referenceScript"
462-
reconcileBabbage alonzoTxOutInBabbage mInlineDatum mReferenceScript
462+
reconcileDatums BabbageEraOnwardsBabbage alonzoTxOutInBabbage mInlineDatum mReferenceScript
463463
ShelleyBasedEraConway -> do
464464
alonzoTxOutInConway <- alonzoTxOutParser AlonzoEraOnwardsConway o
465465
mInlineDatum <- parseInlineDatum BabbageEraOnwardsConway o
466466
mReferenceScript <- o .:? "referenceScript"
467-
reconcileConway ConwayEraOnwardsConway alonzoTxOutInConway mInlineDatum mReferenceScript
467+
reconcileDatums BabbageEraOnwardsConway alonzoTxOutInConway mInlineDatum mReferenceScript
468468
ShelleyBasedEraDijkstra -> do
469469
alonzoTxOutInConway <- alonzoTxOutParser AlonzoEraOnwardsDijkstra o
470470
mInlineDatum <- parseInlineDatum BabbageEraOnwardsDijkstra o
471471
mReferenceScript <- o .:? "referenceScript"
472-
reconcileConway ConwayEraOnwardsDijkstra alonzoTxOutInConway mInlineDatum mReferenceScript
472+
reconcileDatums BabbageEraOnwardsDijkstra alonzoTxOutInConway mInlineDatum mReferenceScript
473473
where
474474
-- | Parse inline datum fields from JSON object
475475
-- Handles both inlineDatumhash and inlineDatum fields, validating they match
@@ -499,60 +499,45 @@ instance IsShelleyBasedEra era => FromJSON (TxOut CtxTx era) where
499499
fail
500500
"Should not be possible to create a tx output with either an inline datum hash or an inline datum"
501501

502-
reconcileBabbage
503-
:: TxOut CtxTx BabbageEra
504-
-- \^ Alonzo era datum in Babbage era
505-
-> TxOutDatum CtxTx BabbageEra
506-
-- \^ Babbage inline datum
507-
-> Maybe ScriptInAnyLang
508-
-> Aeson.Parser (TxOut CtxTx BabbageEra)
509-
reconcileBabbage top@(TxOut addr v dat r) babbageDatum mBabRefScript = do
510-
-- We check for conflicting datums
511-
finalDat <- case (dat, babbageDatum) of
512-
(TxOutDatumNone, bDatum) -> return bDatum
513-
(anyDat, TxOutDatumNone) -> return anyDat
514-
(alonzoDat, babbageDat) ->
515-
fail $
516-
"Parsed an Alonzo era datum and a Babbage era datum "
517-
<> "TxOut: "
518-
<> show top
519-
<> "Alonzo datum: "
520-
<> show alonzoDat
521-
<> "Babbage dat: "
522-
<> show babbageDat
523-
finalRefScript <- case mBabRefScript of
524-
Nothing -> return r
525-
Just anyScript ->
526-
return $ ReferenceScript BabbageEraOnwardsBabbage anyScript
527-
return $ TxOut addr v finalDat finalRefScript
528-
529-
reconcileConway
530-
:: ConwayEraOnwards era
502+
-- | Reconcile Alonzo-style and Babbage-style datums and reference scripts
503+
-- This handles the two-phase parsing where both old and new style fields may be present
504+
reconcileDatums
505+
:: BabbageEraOnwards era
531506
-> TxOut CtxTx era
532-
-- \^ Alonzo era datum in Conway era
507+
-- \^ TxOut with Alonzo-style datum
533508
-> TxOutDatum CtxTx era
534-
-- \^ Babbage inline datum
509+
-- \^ Babbage-style inline datum
535510
-> Maybe ScriptInAnyLang
511+
-- \^ Optional reference script
536512
-> Aeson.Parser (TxOut CtxTx era)
537-
reconcileConway w top@(TxOut addr v dat r) babbageDatum mBabRefScript = do
538-
-- We check for conflicting datums
539-
finalDat <- case (dat, babbageDatum) of
513+
reconcileDatums w top@(TxOut addr v dat r) inlineDatum mRefScript = do
514+
-- Check for conflicting datums
515+
finalDat <- case (dat, inlineDatum) of
540516
(TxOutDatumNone, bDatum) -> return bDatum
541517
(anyDat, TxOutDatumNone) -> return anyDat
542518
(alonzoDat, babbageDat) ->
543519
fail $
544-
"Parsed an Alonzo era datum and a Conway era datum "
520+
"Parsed an Alonzo era datum and a "
521+
<> eraName
522+
<> " era datum. "
545523
<> "TxOut: "
546524
<> show top
547-
<> "Alonzo datum: "
525+
<> " Alonzo datum: "
548526
<> show alonzoDat
549-
<> "Conway dat: "
527+
<> " "
528+
<> eraName
529+
<> " datum: "
550530
<> show babbageDat
551-
finalRefScript <- case mBabRefScript of
531+
finalRefScript <- case mRefScript of
552532
Nothing -> return r
553-
Just anyScript ->
554-
return $ ReferenceScript (convert w) anyScript
533+
Just anyScript -> return $ ReferenceScript w anyScript
555534
return $ TxOut addr v finalDat finalRefScript
535+
where
536+
eraName = case (convert w :: ShelleyBasedEra era) of
537+
ShelleyBasedEraBabbage -> "Babbage"
538+
ShelleyBasedEraConway -> "Conway"
539+
ShelleyBasedEraDijkstra -> "Dijkstra"
540+
_ -> "unknown" -- This case should never occur due to BabbageEraOnwards constraint
556541

557542
alonzoTxOutParser
558543
:: AlonzoEraOnwards era -> Aeson.Object -> Aeson.Parser (TxOut CtxTx era)

0 commit comments

Comments
 (0)