Skip to content

Commit c7c1321

Browse files
committed
Convert UTxO from supported eras to BabbageEra
This works as long as all shelley based eras use the 'MaryValue era' type from the cardano-ledger.
1 parent 8404d4d commit c7c1321

File tree

2 files changed

+38
-32
lines changed

2 files changed

+38
-32
lines changed

hydra-cardano-api/src/Cardano/Api/UTxO.hs

+35-29
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ module Cardano.Api.UTxO where
1111
import Cardano.Api hiding (UTxO, toLedgerUTxO)
1212
import Cardano.Api qualified
1313
import Cardano.Api.Shelley (ReferenceScript (..))
14+
import Cardano.Api.Value (lovelaceToCoin)
15+
import Cardano.Ledger.Babbage ()
16+
import Cardano.Ledger.Mary.Value (MaryValue (..))
1417
import Data.Bifunctor (second)
1518
import Data.Coerce (coerce)
1619
import Data.List qualified as List
@@ -87,35 +90,38 @@ min = UTxO . uncurry Map.singleton . Map.findMin . toMap
8790
-- * Type Conversions
8891

8992
-- | Transforms a UTxO containing tx outs from any era into Babbage era.
90-
fromApi :: forall era. ShelleyBasedEra era -> Cardano.Api.UTxO era -> UTxO
91-
fromApi sbe (Cardano.Api.UTxO eraUTxO) =
92-
let eraPairs = Map.toList eraUTxO
93-
babbagePairs = second (coerceOutputToEra sbe) <$> eraPairs
94-
in fromPairs babbagePairs
95-
96-
coerceOutputToEra :: forall era. ShelleyBasedEra era -> TxOut CtxUTxO era -> TxOut CtxUTxO Era
97-
coerceOutputToEra sbe (TxOut eraAddress eraValue eraDatum eraRefScript) =
98-
TxOut
99-
(coerceAddressToEra eraAddress)
100-
(coerceValueToEra sbe eraValue)
101-
(coerceDatumToEra eraDatum)
102-
(coerceRefScriptToEra eraRefScript)
103-
104-
coerceAddressToEra :: AddressInEra era -> AddressInEra Era
105-
coerceAddressToEra (AddressInEra _ eraAddress) = anyAddressInShelleyBasedEra ShelleyBasedEraBabbage (toAddressAny eraAddress)
106-
107-
coerceValueToEra :: forall era. ShelleyBasedEra era -> TxOutValue era -> TxOutValue Era
108-
coerceValueToEra _ (TxOutValueByron eraLovelace) = lovelaceToTxOutValue shelleyBasedEra eraLovelace
109-
coerceValueToEra sbe (TxOutValueShelleyBased _ value) = TxOutValueShelleyBased ShelleyBasedEraBabbage (toLedgerValue MaryEraOnwardsBabbage $ fromLedgerValue sbe value)
110-
111-
coerceDatumToEra :: TxOutDatum CtxUTxO era -> TxOutDatum CtxUTxO Era
112-
coerceDatumToEra TxOutDatumNone = TxOutDatumNone
113-
coerceDatumToEra (TxOutDatumHash _ hashScriptData) = TxOutDatumHash AlonzoEraOnwardsBabbage hashScriptData
114-
coerceDatumToEra (TxOutDatumInline _ hashableScriptData) = TxOutDatumInline BabbageEraOnwardsBabbage hashableScriptData
115-
116-
coerceRefScriptToEra :: ReferenceScript era -> ReferenceScript Era
117-
coerceRefScriptToEra ReferenceScriptNone = ReferenceScriptNone
118-
coerceRefScriptToEra (ReferenceScript _ scriptInAnyLang) = ReferenceScript BabbageEraOnwardsBabbage scriptInAnyLang
93+
fromApi :: Cardano.Api.UTxO era -> UTxO
94+
fromApi (Cardano.Api.UTxO eraUTxO) =
95+
fromPairs $ second convertOutputToEra <$> Map.toList eraUTxO
96+
where
97+
-- NOTE: At latest the TxOutValue is an existential where we need to case on
98+
-- the 'sbe' witness to get constraints on the contained 'value', but the
99+
-- 'cardano-api' does that already when allowing conversion of their
100+
-- (complicated) constrained types to the cardano-ledger types - so we just
101+
-- convert forth and back.
102+
convertOutputToEra :: TxOut CtxUTxO era -> TxOut CtxUTxO Era
103+
convertOutputToEra (TxOut eraAddress eraValue eraDatum eraRefScript) =
104+
TxOut
105+
(convertAddressToEra eraAddress)
106+
(convertValueToEra eraValue)
107+
(convertDatumToEra eraDatum)
108+
(convertRefScriptToEra eraRefScript)
109+
110+
convertAddressToEra :: AddressInEra era -> AddressInEra Era
111+
convertAddressToEra (AddressInEra _ eraAddress) = anyAddressInShelleyBasedEra ShelleyBasedEraBabbage (toAddressAny eraAddress)
112+
113+
convertValueToEra :: TxOutValue era -> TxOutValue Era
114+
convertValueToEra (TxOutValueByron lovelace) = lovelaceToTxOutValue lovelace
115+
convertValueToEra (TxOutValueShelleyBased sbe value) = TxOutValueShelleyBased shelleyBasedEra (toLedgerValue MaryEraOnwardsBabbage $ fromLedgerValue sbe value)
116+
117+
convertDatumToEra :: TxOutDatum CtxUTxO era -> TxOutDatum CtxUTxO Era
118+
convertDatumToEra TxOutDatumNone = TxOutDatumNone
119+
convertDatumToEra (TxOutDatumHash _ hashScriptData) = TxOutDatumHash AlonzoEraOnwardsBabbage hashScriptData
120+
convertDatumToEra (TxOutDatumInline _ hashableScriptData) = TxOutDatumInline BabbageEraOnwardsBabbage hashableScriptData
121+
122+
convertRefScriptToEra :: ReferenceScript era -> ReferenceScript Era
123+
convertRefScriptToEra ReferenceScriptNone = ReferenceScriptNone
124+
convertRefScriptToEra (ReferenceScript _ scriptInAnyLang) = ReferenceScript BabbageEraOnwardsBabbage scriptInAnyLang
119125

120126
toApi :: UTxO -> Cardano.Api.UTxO Era
121127
toApi = coerce

hydra-node/src/Hydra/Chain/CardanoClient.hs

+3-3
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ queryUTxO networkId socket queryPoint addresses =
321321
queryUTxOExpr :: ShelleyBasedEra era -> [Address ShelleyAddr] -> LocalStateQueryExpr b p QueryInMode r IO UTxO
322322
queryUTxOExpr sbe addresses = do
323323
eraUTxO <- queryInShelleyBasedEraExpr sbe $ QueryUTxO (QueryUTxOByAddress (Set.fromList $ map AddressShelley addresses))
324-
pure $ UTxO.fromApi sbe eraUTxO
324+
pure $ UTxO.fromApi eraUTxO
325325

326326
-- | Query UTxO for given tx inputs at given point.
327327
--
@@ -339,7 +339,7 @@ queryUTxOByTxIn networkId socket queryPoint inputs =
339339
(AnyCardanoEra era) <- queryCurrentEraExpr
340340
(sbe :: ShelleyBasedEra e) <- liftIO $ assumeShelleyBasedEraOrThrow era
341341
eraUTxO <- queryInShelleyBasedEraExpr sbe $ QueryUTxO (QueryUTxOByTxIn (Set.fromList inputs))
342-
pure $ UTxO.fromApi sbe eraUTxO
342+
pure $ UTxO.fromApi eraUTxO
343343

344344
assumeShelleyBasedEraOrThrow :: MonadThrow m => CardanoEra era -> m (ShelleyBasedEra era)
345345
assumeShelleyBasedEraOrThrow era = do
@@ -360,7 +360,7 @@ queryUTxOWhole ::
360360
QueryPoint ->
361361
IO UTxO
362362
queryUTxOWhole networkId socket queryPoint = do
363-
UTxO.fromApi ShelleyBasedEraBabbage <$> (runQuery networkId socket queryPoint query >>= throwOnEraMismatch)
363+
UTxO.fromApi <$> (runQuery networkId socket queryPoint query >>= throwOnEraMismatch)
364364
where
365365
query =
366366
QueryInEra

0 commit comments

Comments
 (0)