Skip to content

Commit 4984495

Browse files
ch1bolocallycompact
authored andcommitted
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 f4da36c commit 4984495

File tree

2 files changed

+36
-32
lines changed

2 files changed

+36
-32
lines changed

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

+33-29
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ 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.Ledger.Babbage ()
1415
import Data.Bifunctor (second)
1516
import Data.Coerce (coerce)
1617
import Data.List qualified as List
@@ -87,35 +88,38 @@ min = UTxO . uncurry Map.singleton . Map.findMin . toMap
8788
-- * Type Conversions
8889

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

120124
toApi :: UTxO -> Cardano.Api.UTxO Era
121125
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)