@@ -36,7 +36,7 @@ import Cardano.Api.Shelley
36
36
37
37
import Control.Monad.Trans.Except (except )
38
38
import Control.Monad.Trans.Except.Extra (firstExceptT , handleIOExceptT , hoistEither ,
39
- hoistMaybe , left , newExceptT )
39
+ hoistMaybe , left , newExceptT , onLeft , onNothing )
40
40
import Data.Aeson as Aeson
41
41
import Data.Aeson.Encode.Pretty (encodePretty )
42
42
import Data.Aeson.Types as Aeson
@@ -89,7 +89,7 @@ import Cardano.Slotting.EpochInfo (EpochInfo (..), epochInfoSlotToUTCT
89
89
import Ouroboros.Consensus.BlockchainTime.WallClock.Types (RelativeTime (.. ),
90
90
toRelativeTime )
91
91
import Ouroboros.Consensus.Cardano.Block as Consensus (EraMismatch (.. ))
92
- import Ouroboros.Consensus.Protocol.TPraos ( StandardCrypto )
92
+ import Ouroboros.Consensus.Protocol.TPraos (StandardCrypto )
93
93
import Ouroboros.Network.Block (Serialised (.. ))
94
94
95
95
import qualified Ouroboros.Consensus.HardFork.History as Consensus
@@ -129,6 +129,7 @@ data ShelleyQueryCmdError
129
129
-- ^ Operational certificate of the unknown stake pool.
130
130
| ShelleyQueryCmdPoolStateDecodeError DecoderError
131
131
| ShelleyQueryCmdStakeSnapshotDecodeError DecoderError
132
+ | ShelleyQueryCmdUnsupportedNtcVersion ! UnsupportedNtcVersionError
132
133
133
134
deriving Show
134
135
@@ -168,6 +169,10 @@ renderShelleyQueryCmdError err =
168
169
" Failed to decode PoolState. Error: " <> Text. pack (show decoderError)
169
170
ShelleyQueryCmdStakeSnapshotDecodeError decoderError ->
170
171
" Failed to decode StakeSnapshot. Error: " <> Text. pack (show decoderError)
172
+ ShelleyQueryCmdUnsupportedNtcVersion (UnsupportedNtcVersionError minNtcVersion ntcVersion) ->
173
+ " Unsupported feature for the node-to-client protocol version.\n " <>
174
+ " This query requires at least " <> show minNtcVersion <> " but the node negotiated " <> show ntcVersion <> " .\n " <>
175
+ " Later node versions support later protocol versions (but development protocol versions are not enabled in the node by default)."
171
176
172
177
runQueryCmd :: QueryCmd -> ExceptT ShelleyQueryCmdError IO ()
173
178
runQueryCmd cmd =
@@ -210,7 +215,8 @@ runQueryProtocolParameters (AnyConsensusModeParams cModeParams) network mOutFile
210
215
let localNodeConnInfo = LocalNodeConnectInfo cModeParams network sockPath
211
216
212
217
result <- liftIO $ executeLocalStateQueryExpr localNodeConnInfo Nothing $ runExceptT $ do
213
- anyE@ (AnyCardanoEra era) <- lift $ determineEraExpr cModeParams
218
+ anyE@ (AnyCardanoEra era) <- lift (determineEraExpr cModeParams)
219
+ & onLeft (left . ShelleyQueryCmdUnsupportedNtcVersion )
214
220
215
221
case cardanoEraStyle era of
216
222
LegacyByronEra -> left ShelleyQueryCmdByronEra
@@ -220,11 +226,12 @@ runQueryProtocolParameters (AnyConsensusModeParams cModeParams) network mOutFile
220
226
eInMode <- toEraInMode era cMode
221
227
& hoistMaybe (ShelleyQueryCmdEraConsensusModeMismatch (AnyConsensusMode cMode) anyE)
222
228
223
- ppResult <- lift . queryExpr $ QueryInEra eInMode $ QueryInShelleyBasedEra sbe QueryProtocolParameters
224
-
225
- except ppResult & firstExceptT ShelleyQueryCmdEraMismatch
229
+ lift ( queryExpr $ QueryInEra eInMode $ QueryInShelleyBasedEra sbe QueryProtocolParameters )
230
+ & onLeft (left . ShelleyQueryCmdUnsupportedNtcVersion )
231
+ & onLeft (left . ShelleyQueryCmdEraMismatch )
226
232
227
233
writeProtocolParameters mOutFile =<< except (join (first ShelleyQueryCmdAcquireFailure result))
234
+
228
235
where
229
236
writeProtocolParameters
230
237
:: Maybe OutputFile
@@ -277,45 +284,36 @@ runQueryTip
277
284
-> Maybe OutputFile
278
285
-> ExceptT ShelleyQueryCmdError IO ()
279
286
runQueryTip (AnyConsensusModeParams cModeParams) network mOutFile = do
280
- SocketPath sockPath <- firstExceptT ShelleyQueryCmdEnvVarSocketErr
281
- $ newExceptT readEnvSocketPath
287
+ SocketPath sockPath <- lift readEnvSocketPath & onLeft (left . ShelleyQueryCmdEnvVarSocketErr )
282
288
283
289
case consensusModeOnly cModeParams of
284
290
CardanoMode -> do
285
291
let localNodeConnInfo = LocalNodeConnectInfo cModeParams network sockPath
286
292
287
- eLocalState <- liftIO $ executeLocalStateQueryExpr localNodeConnInfo Nothing $ do
288
- ntcVersion <- ask
289
- era <- queryExpr (QueryCurrentEra CardanoModeIsMultiEra )
290
- eraHistory <- queryExpr (QueryEraHistory CardanoModeIsMultiEra )
291
- mChainBlockNo <- if ntcVersion >= NodeToClientV_10
292
- then Just <$> queryExpr QueryChainBlockNo
293
- else return Nothing
294
- mChainPoint <- if ntcVersion >= NodeToClientV_10
295
- then Just <$> queryExpr (QueryChainPoint CardanoMode )
296
- else return Nothing
297
- mSystemStart <- if ntcVersion >= NodeToClientV_9
298
- then Just <$> queryExpr QuerySystemStart
299
- else return Nothing
300
-
301
- return O. QueryTipLocalState
302
- { O. era = era
303
- , O. eraHistory = eraHistory
304
- , O. mSystemStart = mSystemStart
305
- , O. mChainTip = makeChainTip <$> mChainBlockNo <*> mChainPoint
306
- }
293
+ eLocalState <- ExceptT $ fmap sequence $
294
+ executeLocalStateQueryExpr localNodeConnInfo Nothing $ runExceptT $ do
295
+ era <- lift (queryExpr (QueryCurrentEra CardanoModeIsMultiEra )) & onLeft (left . ShelleyQueryCmdUnsupportedNtcVersion )
296
+ eraHistory <- lift (queryExpr (QueryEraHistory CardanoModeIsMultiEra )) & onLeft (left . ShelleyQueryCmdUnsupportedNtcVersion )
297
+ mChainBlockNo <- lift (queryExpr QueryChainBlockNo ) & onLeft (left . ShelleyQueryCmdUnsupportedNtcVersion ) & fmap Just
298
+ mChainPoint <- lift (queryExpr (QueryChainPoint CardanoMode )) & onLeft (left . ShelleyQueryCmdUnsupportedNtcVersion ) & fmap Just
299
+ mSystemStart <- lift (queryExpr QuerySystemStart ) & onLeft (left . ShelleyQueryCmdUnsupportedNtcVersion ) & fmap Just
300
+
301
+ return O. QueryTipLocalState
302
+ { O. era = era
303
+ , O. eraHistory = eraHistory
304
+ , O. mSystemStart = mSystemStart
305
+ , O. mChainTip = makeChainTip <$> mChainBlockNo <*> mChainPoint
306
+ }
307
307
308
308
mLocalState <- hushM (first ShelleyQueryCmdAcquireFailure eLocalState) $ \ e ->
309
309
liftIO . T. hPutStrLn IO. stderr $ " Warning: Local state unavailable: " <> renderShelleyQueryCmdError e
310
310
311
- chainTip <- case mLocalState >>= O. mChainTip of
312
- Just chainTip -> return chainTip
313
-
311
+ chainTip <- pure (mLocalState >>= O. mChainTip)
314
312
-- The chain tip is unavailable via local state query because we are connecting with an older
315
313
-- node to client protocol so we use chain sync instead which necessitates another connection.
316
314
-- At some point when we can stop supporting the older node to client protocols, this fallback
317
315
-- can be removed.
318
- Nothing -> queryChainTipViaChainSync localNodeConnInfo
316
+ & onNothing ( queryChainTipViaChainSync localNodeConnInfo)
319
317
320
318
let tipSlotNo :: SlotNo = case chainTip of
321
319
ChainTipAtGenesis -> 0
@@ -1018,30 +1016,33 @@ runQueryStakePools
1018
1016
-> ExceptT ShelleyQueryCmdError IO ()
1019
1017
runQueryStakePools (AnyConsensusModeParams cModeParams)
1020
1018
network mOutFile = do
1021
- SocketPath sockPath <- firstExceptT ShelleyQueryCmdEnvVarSocketErr
1022
- $ newExceptT readEnvSocketPath
1019
+ SocketPath sockPath <- lift readEnvSocketPath & onLeft (left . ShelleyQueryCmdEnvVarSocketErr )
1023
1020
1024
1021
let localNodeConnInfo = LocalNodeConnectInfo cModeParams network sockPath
1025
1022
1026
- result <- ExceptT . fmap (join . first ShelleyQueryCmdAcquireFailure ) $
1027
- executeLocalStateQueryExpr localNodeConnInfo Nothing $ runExceptT @ ShelleyQueryCmdError $ do
1028
- anyE@ (AnyCardanoEra era) <- case consensusModeOnly cModeParams of
1029
- ByronMode -> return $ AnyCardanoEra ByronEra
1030
- ShelleyMode -> return $ AnyCardanoEra ShelleyEra
1031
- CardanoMode -> lift . queryExpr $ QueryCurrentEra CardanoModeIsMultiEra
1023
+ poolIds <-
1024
+ ( lift $ executeLocalStateQueryExpr localNodeConnInfo Nothing $ runExceptT @ ShelleyQueryCmdError $ do
1025
+ anyE@ (AnyCardanoEra era) <- case consensusModeOnly cModeParams of
1026
+ ByronMode -> return $ AnyCardanoEra ByronEra
1027
+ ShelleyMode -> return $ AnyCardanoEra ShelleyEra
1028
+ CardanoMode ->
1029
+ lift (queryExpr $ QueryCurrentEra CardanoModeIsMultiEra )
1030
+ & onLeft (left . ShelleyQueryCmdUnsupportedNtcVersion )
1032
1031
1033
- let cMode = consensusModeOnly cModeParams
1032
+ let cMode = consensusModeOnly cModeParams
1034
1033
1035
- case toEraInMode era cMode of
1036
- Just eInMode -> do
1037
- sbe <- getSbe $ cardanoEraStyle era
1034
+ eInMode <- toEraInMode era cMode
1035
+ & hoistMaybe (ShelleyQueryCmdEraConsensusModeMismatch (AnyConsensusMode cMode) anyE)
1038
1036
1039
- firstExceptT ShelleyQueryCmdEraMismatch . ExceptT $
1040
- queryExpr . QueryInEra eInMode . QueryInShelleyBasedEra sbe $ QueryStakePools
1037
+ sbe <- getSbe $ cardanoEraStyle era
1041
1038
1042
- Nothing -> left $ ShelleyQueryCmdEraConsensusModeMismatch (AnyConsensusMode cMode) anyE
1039
+ lift (queryExpr (QueryInEra eInMode $ QueryInShelleyBasedEra sbe $ QueryStakePools ))
1040
+ & onLeft (left . ShelleyQueryCmdUnsupportedNtcVersion )
1041
+ & onLeft (left . ShelleyQueryCmdEraMismatch )
1042
+ ) & onLeft (left . ShelleyQueryCmdAcquireFailure )
1043
+ & onLeft left
1043
1044
1044
- writeStakePools mOutFile result
1045
+ writeStakePools mOutFile poolIds
1045
1046
1046
1047
writeStakePools
1047
1048
:: Maybe OutputFile
0 commit comments