@@ -11,6 +11,7 @@ module Hydra.Node where
1111import Hydra.Prelude
1212
1313import Blockfrost.Client qualified as Blockfrost
14+ import Cardano.Api.Consensus (EraMismatch (.. ))
1415import Conduit (MonadUnliftIO , ZipSink (.. ), foldMapC , foldlC , mapC , mapM_C , runConduitRes , (.|) )
1516import Control.Concurrent.Class.MonadSTM (
1617 MonadLabelledSTM ,
@@ -20,9 +21,29 @@ import Control.Concurrent.Class.MonadSTM (
2021 writeTVar ,
2122 )
2223import Control.Monad.Trans.Writer (execWriter , tell )
24+ import Data.Time.Clock.POSIX (posixSecondsToUTCTime )
2325import Hydra.API.ClientInput (ClientInput )
2426import Hydra.API.Server (Server , sendMessage )
25- import Hydra.Cardano.Api (AsType (AsPaymentKey , AsSigningKey , AsVerificationKey ), GenesisParameters , NetworkId , ShelleyEra , TxId , getVerificationKey )
27+ import Hydra.Cardano.Api (
28+ Address ,
29+ AnyCardanoEra (AnyCardanoEra ),
30+ AsType (AsPaymentKey , AsSigningKey , AsVerificationKey ),
31+ CardanoEra (.. ),
32+ ChainPoint ,
33+ EraHistory ,
34+ GenesisParameters ,
35+ LedgerEra ,
36+ NetworkId ,
37+ PParams ,
38+ QueryInShelleyBasedEra (QueryProtocolParameters ),
39+ ShelleyAddr ,
40+ ShelleyEra ,
41+ SystemStart (.. ),
42+ TxId ,
43+ UTxO ,
44+ getVerificationKey ,
45+ shelleyBasedEra ,
46+ )
2647import Hydra.Chain (
2748 Chain (.. ),
2849 ChainEvent (.. ),
@@ -438,6 +459,11 @@ class BackendOps a where
438459 queryGenesisParameters :: (MonadIO m , MonadThrow m ) => a -> m (GenesisParameters ShelleyEra )
439460 queryScriptRegistry :: (MonadIO m , MonadThrow m ) => a -> [TxId ] -> m ScriptRegistry
440461 queryNetworkId :: (MonadIO m , MonadThrow m ) => a -> m NetworkId
462+ queryTip :: (MonadIO m , MonadThrow m ) => a -> m ChainPoint
463+ queryUTxO :: (MonadIO m , MonadThrow m ) => a -> [Address ShelleyAddr ] -> m UTxO
464+ queryEraHistory :: (MonadIO m , MonadThrow m ) => a -> CardanoClient. QueryPoint -> m EraHistory
465+ querySystemStart :: (MonadIO m , MonadThrow m ) => a -> CardanoClient. QueryPoint -> m SystemStart
466+ queryProtocolParameters :: (MonadIO m , MonadThrow m ) => a -> CardanoClient. QueryPoint -> m (PParams LedgerEra )
441467
442468-- TODO: Perhaps use Reader monad for fetching configuration?
443469instance BackendOps ChainBackend where
@@ -461,3 +487,42 @@ instance BackendOps ChainBackend where
461487 -- TODO: This calls to queryGenesisParameters again, but we only need the network magic
462488 Blockfrost. Genesis {_genesisNetworkMagic} <- Blockfrost. runBlockfrostM prj Blockfrost. queryGenesisParameters
463489 pure $ Blockfrost. toCardanoNetworkId _genesisNetworkMagic
490+ queryTip = \ case
491+ DirectBackend {networkId, nodeSocket} ->
492+ liftIO $ CardanoClient. queryTip networkId nodeSocket
493+ BlockfrostBackend {projectPath} -> do
494+ prj <- liftIO $ Blockfrost. projectFromFile projectPath
495+ Blockfrost. runBlockfrostM prj Blockfrost. queryTip
496+ queryUTxO backend addresses =
497+ case backend of
498+ DirectBackend {networkId, nodeSocket} ->
499+ liftIO $ CardanoClient. queryUTxO networkId nodeSocket CardanoClient. QueryTip addresses
500+ BlockfrostBackend {projectPath} -> do
501+ prj <- liftIO $ Blockfrost. projectFromFile projectPath
502+ Blockfrost. runBlockfrostM prj $ Blockfrost. queryUTxO addresses
503+ queryEraHistory backend queryPoint =
504+ case backend of
505+ DirectBackend {networkId, nodeSocket} ->
506+ liftIO $ CardanoClient. queryEraHistory networkId nodeSocket queryPoint
507+ BlockfrostBackend {projectPath} -> do
508+ prj <- liftIO $ Blockfrost. projectFromFile projectPath
509+ Blockfrost. runBlockfrostM prj Blockfrost. queryEraHistory
510+ querySystemStart backend queryPoint =
511+ case backend of
512+ DirectBackend {networkId, nodeSocket} ->
513+ liftIO $ CardanoClient. querySystemStart networkId nodeSocket queryPoint
514+ BlockfrostBackend {projectPath} -> do
515+ prj <- liftIO $ Blockfrost. projectFromFile projectPath
516+ Blockfrost. Genesis {_genesisSystemStart} <- Blockfrost. runBlockfrostM prj Blockfrost. queryGenesisParameters
517+ pure $ SystemStart $ posixSecondsToUTCTime _genesisSystemStart
518+ queryProtocolParameters backend queryPoint =
519+ case backend of
520+ DirectBackend {networkId, nodeSocket} ->
521+ liftIO $ CardanoClient. runQueryExpr networkId nodeSocket queryPoint $ do
522+ AnyCardanoEra era <- CardanoClient. queryCurrentEraExpr
523+ case era of
524+ ConwayEra {} -> CardanoClient. queryInShelleyBasedEraExpr shelleyBasedEra QueryProtocolParameters
525+ _ -> liftIO . throwIO $ CardanoClient. QueryEraMismatchException EraMismatch {ledgerEraName = show era, otherEraName = " Conway" }
526+ BlockfrostBackend {projectPath} -> do
527+ prj <- liftIO $ Blockfrost. projectFromFile projectPath
528+ Blockfrost. runBlockfrostM prj Blockfrost. queryProtocolParameters
0 commit comments