4
4
{-# LANGUAGE FlexibleContexts #-}
5
5
{-# LANGUAGE FlexibleInstances #-}
6
6
{-# LANGUAGE GADTs #-}
7
+ {-# LANGUAGE LambdaCase #-}
7
8
{-# LANGUAGE RankNTypes #-}
8
9
{-# LANGUAGE ScopedTypeVariables #-}
9
10
{-# LANGUAGE TypeApplications #-}
@@ -130,6 +131,7 @@ data ShelleyQueryCmdError
130
131
-- ^ Operational certificate of the unknown stake pool.
131
132
| ShelleyQueryCmdPoolStateDecodeError DecoderError
132
133
| ShelleyQueryCmdStakeSnapshotDecodeError DecoderError
134
+ | ShelleyQueryCmdUnsupportedNtcVersion ! UnsupportedNtcVersionError
133
135
134
136
deriving Show
135
137
@@ -169,6 +171,10 @@ renderShelleyQueryCmdError err =
169
171
" Failed to decode PoolState. Error: " <> Text. pack (show decoderError)
170
172
ShelleyQueryCmdStakeSnapshotDecodeError decoderError ->
171
173
" Failed to decode StakeSnapshot. Error: " <> Text. pack (show decoderError)
174
+ ShelleyQueryCmdUnsupportedNtcVersion (UnsupportedNtcVersionError minNtcVersion ntcVersion) ->
175
+ " Unsupported feature for the node-to-client protocol version.\n " <>
176
+ " This query requires at least " <> show minNtcVersion <> " but the node negotiated " <> show ntcVersion <> " .\n " <>
177
+ " Later node versions support later protocol versions (but development protocol versions are not enabled in the node by default)."
172
178
173
179
runQueryCmd :: QueryCmd -> ExceptT ShelleyQueryCmdError IO ()
174
180
runQueryCmd cmd =
@@ -211,7 +217,11 @@ runQueryProtocolParameters (AnyConsensusModeParams cModeParams) network mOutFile
211
217
let localNodeConnInfo = LocalNodeConnectInfo cModeParams network sockPath
212
218
213
219
result <- liftIO $ executeLocalStateQueryExpr localNodeConnInfo Nothing $ runExceptT $ do
214
- anyE@ (AnyCardanoEra era) <- lift $ determineEraExpr cModeParams
220
+ eraResult <- lift $ determineEraExpr cModeParams
221
+
222
+ anyE@ (AnyCardanoEra era) <- case eraResult of
223
+ Right a -> pure a
224
+ Left e -> throwE $ ShelleyQueryCmdUnsupportedNtcVersion e
215
225
216
226
case cardanoEraStyle era of
217
227
LegacyByronEra -> left ShelleyQueryCmdByronEra
@@ -223,7 +233,10 @@ runQueryProtocolParameters (AnyConsensusModeParams cModeParams) network mOutFile
223
233
224
234
ppResult <- lift . queryExpr $ QueryInEra eInMode $ QueryInShelleyBasedEra sbe QueryProtocolParameters
225
235
226
- except ppResult & firstExceptT ShelleyQueryCmdEraMismatch
236
+ case ppResult of
237
+ Right (Right a) -> pure a
238
+ Right (Left e) -> throwE $ ShelleyQueryCmdEraMismatch e
239
+ Left e -> throwE $ ShelleyQueryCmdUnsupportedNtcVersion e
227
240
228
241
writeProtocolParameters mOutFile =<< except (join (first ShelleyQueryCmdAcquireFailure result))
229
242
where
@@ -285,26 +298,24 @@ runQueryTip (AnyConsensusModeParams cModeParams) network mOutFile = do
285
298
CardanoMode -> do
286
299
let localNodeConnInfo = LocalNodeConnectInfo cModeParams network sockPath
287
300
288
- eLocalState <- liftIO $ executeLocalStateQueryExpr localNodeConnInfo Nothing $ do
289
- ntcVersion <- ask
290
- era <- queryExpr (QueryCurrentEra CardanoModeIsMultiEra )
291
- eraHistory <- queryExpr (QueryEraHistory CardanoModeIsMultiEra )
292
- mChainBlockNo <- if ntcVersion >= NodeToClientV_10
293
- then Just <$> queryExpr QueryChainBlockNo
294
- else return Nothing
295
- mChainPoint <- if ntcVersion >= NodeToClientV_10
296
- then Just <$> queryExpr (QueryChainPoint CardanoMode )
297
- else return Nothing
298
- mSystemStart <- if ntcVersion >= NodeToClientV_9
299
- then Just <$> queryExpr QuerySystemStart
300
- else return Nothing
301
-
302
- return O. QueryTipLocalState
303
- { O. era = era
304
- , O. eraHistory = eraHistory
305
- , O. mSystemStart = mSystemStart
306
- , O. mChainTip = makeChainTip <$> mChainBlockNo <*> mChainPoint
307
- }
301
+ eLocalState <- ExceptT $ fmap sequence $
302
+ executeLocalStateQueryExpr localNodeConnInfo Nothing $ runExceptT $ do
303
+ era <- ExceptT $ fmap (first ShelleyQueryCmdUnsupportedNtcVersion ) $
304
+ queryExpr (QueryCurrentEra CardanoModeIsMultiEra )
305
+
306
+ eraHistory <- ExceptT $ fmap (first ShelleyQueryCmdUnsupportedNtcVersion ) $
307
+ queryExpr (QueryEraHistory CardanoModeIsMultiEra )
308
+
309
+ mChainBlockNo <- fmap Just $ ExceptT $ fmap (first ShelleyQueryCmdUnsupportedNtcVersion ) $ queryExpr QueryChainBlockNo
310
+ mChainPoint <- fmap Just $ ExceptT $ fmap (first ShelleyQueryCmdUnsupportedNtcVersion ) $ queryExpr (QueryChainPoint CardanoMode )
311
+ mSystemStart <- fmap Just $ ExceptT $ fmap (first ShelleyQueryCmdUnsupportedNtcVersion ) $ queryExpr QuerySystemStart
312
+
313
+ return O. QueryTipLocalState
314
+ { O. era = era
315
+ , O. eraHistory = eraHistory
316
+ , O. mSystemStart = mSystemStart
317
+ , O. mChainTip = makeChainTip <$> mChainBlockNo <*> mChainPoint
318
+ }
308
319
309
320
mLocalState <- hushM (first ShelleyQueryCmdAcquireFailure eLocalState) $ \ e ->
310
321
liftIO . T. hPutStrLn IO. stderr $ " Warning: Local state unavailable: " <> renderShelleyQueryCmdError e
@@ -1036,16 +1047,20 @@ runQueryStakePools (AnyConsensusModeParams cModeParams)
1036
1047
anyE@ (AnyCardanoEra era) <- case consensusModeOnly cModeParams of
1037
1048
ByronMode -> return $ AnyCardanoEra ByronEra
1038
1049
ShelleyMode -> return $ AnyCardanoEra ShelleyEra
1039
- CardanoMode -> lift . queryExpr $ QueryCurrentEra CardanoModeIsMultiEra
1050
+ CardanoMode -> ExceptT $ fmap (first ShelleyQueryCmdUnsupportedNtcVersion ) $ queryExpr $ QueryCurrentEra CardanoModeIsMultiEra
1040
1051
1041
1052
let cMode = consensusModeOnly cModeParams
1042
1053
1043
1054
case toEraInMode era cMode of
1044
1055
Just eInMode -> do
1045
1056
sbe <- getSbe $ cardanoEraStyle era
1046
1057
1047
- firstExceptT ShelleyQueryCmdEraMismatch . ExceptT $
1048
- queryExpr . QueryInEra eInMode . QueryInShelleyBasedEra sbe $ QueryStakePools
1058
+ r <- ExceptT $ fmap (first ShelleyQueryCmdUnsupportedNtcVersion ) $ queryExpr $
1059
+ QueryInEra eInMode $ QueryInShelleyBasedEra sbe $ QueryStakePools
1060
+
1061
+ case r of
1062
+ Right a -> pure a
1063
+ Left e -> throwE (ShelleyQueryCmdEraMismatch e)
1049
1064
1050
1065
Nothing -> left $ ShelleyQueryCmdEraConsensusModeMismatch (AnyConsensusMode cMode) anyE
1051
1066
0 commit comments