Skip to content

Commit 3583170

Browse files
committed
Update TxOut rendering to handle Dijkstra era
1 parent 2bc46f0 commit 3583170

File tree

1 file changed

+113
-12
lines changed
  • cardano-api/src/Cardano/Api/Tx/Internal

1 file changed

+113
-12
lines changed

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

Lines changed: 113 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import Cardano.Api.Era.Internal.Core
6060
import Cardano.Api.Era.Internal.Eon.AlonzoEraOnwards
6161
import Cardano.Api.Era.Internal.Eon.BabbageEraOnwards
6262
import Cardano.Api.Era.Internal.Eon.Convert
63+
import Cardano.Api.Era.Internal.Eon.ConwayEraOnwards
6364
import Cardano.Api.Era.Internal.Eon.ShelleyBasedEra
6465
import Cardano.Api.Error (Error (..), displayError)
6566
import Cardano.Api.Hash
@@ -209,6 +210,14 @@ fromLedgerTxOuts sbe body scriptdata =
209210
| let txdatums = selectTxDatums scriptdata
210211
, txouts <- toList (body ^. L.outputsTxBodyL)
211212
]
213+
ShelleyBasedEraDijkstra ->
214+
[ fromBabbageTxOut
215+
BabbageEraOnwardsDijkstra
216+
txdatums
217+
txouts
218+
| let txdatums = selectTxDatums scriptdata
219+
, txouts <- toList (body ^. L.outputsTxBodyL)
220+
]
212221

213222
validateTxOuts :: ShelleyBasedEra era -> [TxOut CtxTx era] -> Either TxOutputError ()
214223
validateTxOuts sbe txOuts = do
@@ -349,6 +358,16 @@ txOutToJsonValue era (TxOut addr val dat refScript) =
349358
, "inlineDatumRaw" .= inlineDatumRawJsonCbor dat
350359
, "referenceScript" .= refScriptJsonVal refScript
351360
]
361+
DijkstraEra ->
362+
object
363+
[ "address" .= addr
364+
, "value" .= val
365+
, datHashJsonVal dat
366+
, "datum" .= datJsonVal dat
367+
, "inlineDatum" .= inlineDatumJsonVal dat
368+
, "inlineDatumRaw" .= inlineDatumRawJsonCbor dat
369+
, "referenceScript" .= refScriptJsonVal refScript
370+
]
352371
where
353372
datHashJsonVal :: TxOutDatum ctx era -> Aeson.Pair
354373
datHashJsonVal d =
@@ -466,7 +485,31 @@ instance IsShelleyBasedEra era => FromJSON (TxOut CtxTx era) where
466485

467486
mReferenceScript <- o .:? "referenceScript"
468487

469-
reconcileConway alonzoTxOutInConway mInlineDatum mReferenceScript
488+
reconcileConway ConwayEraOnwardsConway alonzoTxOutInConway mInlineDatum mReferenceScript
489+
ShelleyBasedEraDijkstra -> do
490+
alonzoTxOutInConway <- alonzoTxOutParser AlonzoEraOnwardsDijkstra o
491+
492+
-- We check for the existence of inline datums
493+
inlineDatumHash <- o .:? "inlineDatumhash"
494+
inlineDatum <- o .:? "inlineDatum"
495+
mInlineDatum <-
496+
case (inlineDatum, inlineDatumHash) of
497+
(Just dVal, Just h) ->
498+
case scriptDataFromJson ScriptDataJsonDetailedSchema dVal of
499+
Left err ->
500+
fail $ "Error parsing TxOut JSON: " <> displayError err
501+
Right sData ->
502+
if hashScriptDataBytes sData /= h
503+
then fail "Inline datum not equivalent to inline datum hash"
504+
else return $ TxOutDatumInline BabbageEraOnwardsDijkstra sData
505+
(Nothing, Nothing) -> return TxOutDatumNone
506+
(_, _) ->
507+
fail
508+
"Should not be possible to create a tx output with either an inline datum hash or an inline datum"
509+
510+
mReferenceScript <- o .:? "referenceScript"
511+
512+
reconcileConway ConwayEraOnwardsDijkstra alonzoTxOutInConway mInlineDatum mReferenceScript
470513
where
471514
reconcileBabbage
472515
:: TxOut CtxTx BabbageEra
@@ -496,13 +539,14 @@ instance IsShelleyBasedEra era => FromJSON (TxOut CtxTx era) where
496539
return $ TxOut addr v finalDat finalRefScript
497540

498541
reconcileConway
499-
:: TxOut CtxTx ConwayEra
542+
:: ConwayEraOnwards era
543+
-> TxOut CtxTx era
500544
-- \^ Alonzo era datum in Conway era
501-
-> TxOutDatum CtxTx ConwayEra
545+
-> TxOutDatum CtxTx era
502546
-- \^ Babbage inline datum
503547
-> Maybe ScriptInAnyLang
504-
-> Aeson.Parser (TxOut CtxTx ConwayEra)
505-
reconcileConway top@(TxOut addr v dat r) babbageDatum mBabRefScript = do
548+
-> Aeson.Parser (TxOut CtxTx era)
549+
reconcileConway w top@(TxOut addr v dat r) babbageDatum mBabRefScript = do
506550
-- We check for conflicting datums
507551
finalDat <- case (dat, babbageDatum) of
508552
(TxOutDatumNone, bDatum) -> return bDatum
@@ -519,7 +563,7 @@ instance IsShelleyBasedEra era => FromJSON (TxOut CtxTx era) where
519563
finalRefScript <- case mBabRefScript of
520564
Nothing -> return r
521565
Just anyScript ->
522-
return $ ReferenceScript BabbageEraOnwardsConway anyScript
566+
return $ ReferenceScript (convert w) anyScript
523567
return $ TxOut addr v finalDat finalRefScript
524568

525569
alonzoTxOutParser
@@ -622,7 +666,32 @@ instance IsShelleyBasedEra era => FromJSON (TxOut CtxUTxO era) where
622666
-- We check for a reference script
623667
mReferenceScript <- o .:? "referenceScript"
624668

625-
reconcileConway alonzoTxOutInConway mInlineDatum mReferenceScript
669+
reconcileConway ConwayEraOnwardsConway alonzoTxOutInConway mInlineDatum mReferenceScript
670+
ShelleyBasedEraDijkstra -> do
671+
alonzoTxOutInConway <- alonzoTxOutParser AlonzoEraOnwardsDijkstra o
672+
673+
-- We check for the existence of inline datums
674+
inlineDatumHash <- o .:? "inlineDatumhash"
675+
inlineDatum <- o .:? "inlineDatum"
676+
mInlineDatum <-
677+
case (inlineDatum, inlineDatumHash) of
678+
(Just dVal, Just h) ->
679+
case scriptDataFromJson ScriptDataJsonDetailedSchema dVal of
680+
Left err ->
681+
fail $ "Error parsing TxOut JSON: " <> displayError err
682+
Right sData ->
683+
if hashScriptDataBytes sData /= h
684+
then fail "Inline datum not equivalent to inline datum hash"
685+
else return $ TxOutDatumInline BabbageEraOnwardsDijkstra sData
686+
(Nothing, Nothing) -> return TxOutDatumNone
687+
(_, _) ->
688+
fail
689+
"Should not be possible to create a tx output with either an inline datum hash or an inline datum"
690+
691+
-- We check for a reference script
692+
mReferenceScript <- o .:? "referenceScript"
693+
694+
reconcileConway ConwayEraOnwardsDijkstra alonzoTxOutInConway mInlineDatum mReferenceScript
626695
where
627696
reconcileBabbage
628697
:: TxOut CtxUTxO BabbageEra
@@ -645,13 +714,14 @@ instance IsShelleyBasedEra era => FromJSON (TxOut CtxUTxO era) where
645714
return $ TxOut addr v finalDat finalRefScript
646715

647716
reconcileConway
648-
:: TxOut CtxUTxO ConwayEra
717+
:: ConwayEraOnwards era
718+
-> TxOut CtxUTxO era
649719
-- \^ Alonzo era datum in Conway era
650-
-> TxOutDatum CtxUTxO ConwayEra
720+
-> TxOutDatum CtxUTxO era
651721
-- \^ Babbage inline datum
652722
-> Maybe ScriptInAnyLang
653-
-> Aeson.Parser (TxOut CtxUTxO ConwayEra)
654-
reconcileConway (TxOut addr v dat r) babbageDatum mBabRefScript = do
723+
-> Aeson.Parser (TxOut CtxUTxO era)
724+
reconcileConway w (TxOut addr v dat r) babbageDatum mBabRefScript = do
655725
-- We check for conflicting datums
656726
finalDat <- case (dat, babbageDatum) of
657727
(TxOutDatumNone, bDatum) -> return bDatum
@@ -660,7 +730,7 @@ instance IsShelleyBasedEra era => FromJSON (TxOut CtxUTxO era) where
660730
finalRefScript <- case mBabRefScript of
661731
Nothing -> return r
662732
Just anyScript ->
663-
return $ ReferenceScript BabbageEraOnwardsConway anyScript
733+
return $ ReferenceScript (convert w) anyScript
664734

665735
return $ TxOut addr v finalDat finalRefScript
666736

@@ -723,6 +793,12 @@ toShelleyTxOut sbe = shelleyBasedEraConstraints sbe $ \case
723793
.~ toBabbageTxOutDatumUTxO txoutdata
724794
& L.referenceScriptTxOutL
725795
.~ refScriptToShelleyScript sbe refScript
796+
AlonzoEraOnwardsDijkstra ->
797+
L.mkBasicTxOut (toShelleyAddr addr) value
798+
& L.datumTxOutL
799+
.~ toBabbageTxOutDatumUTxO txoutdata
800+
& L.referenceScriptTxOutL
801+
.~ refScriptToShelleyScript sbe refScript
726802
)
727803
sbe
728804

@@ -757,6 +833,12 @@ toShelleyTxOutAny sbe = shelleyBasedEraConstraints sbe $ \case
757833
.~ toBabbageTxOutDatum txoutdata
758834
& L.referenceScriptTxOutL
759835
.~ refScriptToShelleyScript sbe refScript
836+
AlonzoEraOnwardsDijkstra ->
837+
L.mkBasicTxOut (toShelleyAddr addr) value
838+
& L.datumTxOutL
839+
.~ toBabbageTxOutDatum txoutdata
840+
& L.referenceScriptTxOutL
841+
.~ refScriptToShelleyScript sbe refScript
760842
)
761843
sbe
762844

@@ -819,6 +901,23 @@ fromShelleyTxOut sbe ledgerTxOut = shelleyBasedEraConstraints sbe $ do
819901
where
820902
datum = ledgerTxOut ^. L.datumTxOutL
821903
mRefScript = ledgerTxOut ^. L.referenceScriptTxOutL
904+
ShelleyBasedEraDijkstra ->
905+
TxOut
906+
addressInEra
907+
txOutValue
908+
( fromBabbageTxOutDatum
909+
AlonzoEraOnwardsDijkstra
910+
BabbageEraOnwardsDijkstra
911+
datum
912+
)
913+
( case mRefScript of
914+
SNothing -> ReferenceScriptNone
915+
SJust refScript ->
916+
fromShelleyScriptToReferenceScript ShelleyBasedEraDijkstra refScript
917+
)
918+
where
919+
datum = ledgerTxOut ^. L.datumTxOutL
920+
mRefScript = ledgerTxOut ^. L.referenceScriptTxOutL
822921

823922
-- ----------------------------------------------------------------------------
824923
-- Transaction output values (era-dependent)
@@ -1026,6 +1125,8 @@ binaryDataToScriptData BabbageEraOnwardsBabbage d =
10261125
fromAlonzoData $ L.binaryDataToData d
10271126
binaryDataToScriptData BabbageEraOnwardsConway d =
10281127
fromAlonzoData $ L.binaryDataToData d
1128+
binaryDataToScriptData BabbageEraOnwardsDijkstra d =
1129+
fromAlonzoData $ L.binaryDataToData d
10291130

10301131
data TxOutputError
10311132
= TxOutputNegative !Quantity !TxOutInAnyEra

0 commit comments

Comments
 (0)