From 76a3d9fdc6247785ce3dbf8d47f789511dba09b1 Mon Sep 17 00:00:00 2001 From: John Ky Date: Thu, 28 Jul 2022 21:46:22 +1000 Subject: [PATCH] Add support for querying multiple stake pool. --- cardano-api/src/Cardano/Api/Orphans.hs | 22 +++++++++---------- cardano-api/src/Cardano/Api/Query.hs | 6 ++--- .../src/Cardano/CLI/Shelley/Commands.hs | 2 +- .../src/Cardano/CLI/Shelley/Parsers.hs | 2 +- .../src/Cardano/CLI/Shelley/Run/Query.hs | 16 +++++++------- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/cardano-api/src/Cardano/Api/Orphans.hs b/cardano-api/src/Cardano/Api/Orphans.hs index e769ab39bcb..315f932fbb4 100644 --- a/cardano-api/src/Cardano/Api/Orphans.hs +++ b/cardano-api/src/Cardano/Api/Orphans.hs @@ -691,27 +691,27 @@ instance Crypto.Crypto crypto => ToJSON (VMap VB VP (Shelley.Credential 'Shelley ----- -instance ToJSON (Consensus.StakeSnapshots crypto) where +instance Crypto.Crypto crypto => ToJSON (Consensus.StakeSnapshots crypto) where toJSON = object . stakeSnapshotsToPair toEncoding = pairs . mconcat . stakeSnapshotsToPair -stakeSnapshotsToPair :: Aeson.KeyValue a => Consensus.StakeSnapshots crypto -> [a] +stakeSnapshotsToPair :: (Aeson.KeyValue a, Crypto.Crypto crypto) => Consensus.StakeSnapshots crypto -> [a] stakeSnapshotsToPair Consensus.StakeSnapshots { Consensus.ssStakeSnapshots , Consensus.ssMarkTotal , Consensus.ssSetTotal , Consensus.ssGoTotal - } = mconcat - -- Only output the first pool in order to preserve backwards compatibility of the output - -- format. The output format will have to change to support multiple pools when that - -- functionality is added. - [ take 1 (Map.elems ssStakeSnapshots) >>= stakeSnapshotToPair - , [ "activeStakeMark" .= ssMarkTotal - , "activeStakeSet" .= ssSetTotal - , "activeStakeGo" .= ssGoTotal - ] + } = + [ "pools" .= ssStakeSnapshots + , "activeStakeMark" .= ssMarkTotal + , "activeStakeSet" .= ssSetTotal + , "activeStakeGo" .= ssGoTotal ] +instance ToJSON (Consensus.StakeSnapshot crypto) where + toJSON = object . stakeSnapshotToPair + toEncoding = pairs . mconcat . stakeSnapshotToPair + stakeSnapshotToPair :: Aeson.KeyValue a => Consensus.StakeSnapshot crypto -> [a] stakeSnapshotToPair Consensus.StakeSnapshot { Consensus.ssMarkPool diff --git a/cardano-api/src/Cardano/Api/Query.hs b/cardano-api/src/Cardano/Api/Query.hs index 72e2a391972..f64e45398b8 100644 --- a/cardano-api/src/Cardano/Api/Query.hs +++ b/cardano-api/src/Cardano/Api/Query.hs @@ -259,7 +259,7 @@ data QueryInShelleyBasedEra era result where -> QueryInShelleyBasedEra era (SerialisedPoolDistribution era) QueryStakeSnapshot - :: PoolId + :: Maybe (Set PoolId) -> QueryInShelleyBasedEra era (SerialisedStakeSnapshots era) deriving instance Show (QueryInShelleyBasedEra era result) @@ -630,8 +630,8 @@ toConsensusQueryShelleyBased erainmode QueryCurrentEpochState = toConsensusQueryShelleyBased erainmode (QueryPoolState poolIds) = Some (consensusQueryInEraInMode erainmode (Consensus.GetCBOR (Consensus.GetPoolState (Set.map unStakePoolKeyHash <$> poolIds)))) -toConsensusQueryShelleyBased erainmode (QueryStakeSnapshot poolId) = - Some (consensusQueryInEraInMode erainmode (Consensus.GetCBOR (Consensus.GetStakeSnapshots (Just (Set.singleton (unStakePoolKeyHash poolId)))))) +toConsensusQueryShelleyBased erainmode (QueryStakeSnapshot mPoolIds) = + Some (consensusQueryInEraInMode erainmode (Consensus.GetCBOR (Consensus.GetStakeSnapshots (fmap (Set.map unStakePoolKeyHash) mPoolIds)))) toConsensusQueryShelleyBased erainmode (QueryPoolDistribution poolIds) = Some (consensusQueryInEraInMode erainmode (Consensus.GetCBOR (Consensus.GetPoolDistr (getPoolIds <$> poolIds)))) diff --git a/cardano-cli/src/Cardano/CLI/Shelley/Commands.hs b/cardano-cli/src/Cardano/CLI/Shelley/Commands.hs index 58b4c862e69..c75326facf1 100644 --- a/cardano-cli/src/Cardano/CLI/Shelley/Commands.hs +++ b/cardano-cli/src/Cardano/CLI/Shelley/Commands.hs @@ -361,7 +361,7 @@ data QueryCmd = | QueryUTxO' AnyConsensusModeParams QueryUTxOFilter NetworkId (Maybe OutputFile) | QueryDebugLedgerState' AnyConsensusModeParams NetworkId (Maybe OutputFile) | QueryProtocolState' AnyConsensusModeParams NetworkId (Maybe OutputFile) - | QueryStakeSnapshot' AnyConsensusModeParams NetworkId (Hash StakePoolKey) + | QueryStakeSnapshot' AnyConsensusModeParams NetworkId [Hash StakePoolKey] | QueryKesPeriodInfo AnyConsensusModeParams NetworkId diff --git a/cardano-cli/src/Cardano/CLI/Shelley/Parsers.hs b/cardano-cli/src/Cardano/CLI/Shelley/Parsers.hs index a235daba8a2..5ea9a773ee5 100644 --- a/cardano-cli/src/Cardano/CLI/Shelley/Parsers.hs +++ b/cardano-cli/src/Cardano/CLI/Shelley/Parsers.hs @@ -994,7 +994,7 @@ pQueryCmd = pQueryStakeSnapshot = QueryStakeSnapshot' <$> pConsensusModeParams <*> pNetworkId - <*> pStakePoolVerificationKeyHash + <*> many pStakePoolVerificationKeyHash pQueryPoolState :: Parser QueryCmd pQueryPoolState = QueryPoolState' diff --git a/cardano-cli/src/Cardano/CLI/Shelley/Run/Query.hs b/cardano-cli/src/Cardano/CLI/Shelley/Run/Query.hs index 5cbce4b15f3..8f13f46182b 100644 --- a/cardano-cli/src/Cardano/CLI/Shelley/Run/Query.hs +++ b/cardano-cli/src/Cardano/CLI/Shelley/Run/Query.hs @@ -186,8 +186,8 @@ runQueryCmd cmd = runQueryStakeAddressInfo consensusModeParams addr network mOutFile QueryDebugLedgerState' consensusModeParams network mOutFile -> runQueryLedgerState consensusModeParams network mOutFile - QueryStakeSnapshot' consensusModeParams network poolid -> - runQueryStakeSnapshot consensusModeParams network poolid + QueryStakeSnapshot' consensusModeParams network mPoolIds -> + runQueryStakeSnapshot consensusModeParams network mPoolIds QueryProtocolState' consensusModeParams network mOutFile -> runQueryProtocolState consensusModeParams network mOutFile QueryUTxO' consensusModeParams qFilter networkId mOutFile -> @@ -670,9 +670,9 @@ runQueryTxMempool (AnyConsensusModeParams cModeParams) network query mOutFile = runQueryStakeSnapshot :: AnyConsensusModeParams -> NetworkId - -> Hash StakePoolKey + -> [Hash StakePoolKey] -> ExceptT ShelleyQueryCmdError IO () -runQueryStakeSnapshot (AnyConsensusModeParams cModeParams) network poolId = do +runQueryStakeSnapshot (AnyConsensusModeParams cModeParams) network mPoolIds = do SocketPath sockPath <- firstExceptT ShelleyQueryCmdEnvVarSocketErr $ newExceptT readEnvSocketPath let localNodeConnInfo = LocalNodeConnectInfo cModeParams network sockPath @@ -686,9 +686,9 @@ runQueryStakeSnapshot (AnyConsensusModeParams cModeParams) network poolId = do eInMode <- toEraInMode era cMode & hoistMaybe (ShelleyQueryCmdEraConsensusModeMismatch (AnyConsensusMode cMode) anyE) - let qInMode = QueryInEra eInMode . QueryInShelleyBasedEra sbe $ QueryStakeSnapshot poolId + let qInMode = QueryInEra eInMode . QueryInShelleyBasedEra sbe $ QueryStakeSnapshot $ Just $ Set.fromList mPoolIds result <- executeQuery era cModeParams localNodeConnInfo qInMode - obtainLedgerEraClassConstraints sbe writeStakeSnapshot result + obtainLedgerEraClassConstraints sbe writeStakeSnapshots result runQueryLedgerState @@ -849,12 +849,12 @@ writeLedgerState mOutFile qState@(SerialisedDebugLedgerState serLedgerState) = handleIOExceptT (ShelleyQueryCmdWriteFileError . FileIOError fpath) $ LBS.writeFile fpath $ unSerialised serLedgerState -writeStakeSnapshot :: forall era ledgerera. () +writeStakeSnapshots :: forall era ledgerera. () => ShelleyLedgerEra era ~ ledgerera => Era.Crypto ledgerera ~ StandardCrypto => SerialisedStakeSnapshots era -> ExceptT ShelleyQueryCmdError IO () -writeStakeSnapshot qState = +writeStakeSnapshots qState = case decodeStakeSnapshot qState of Left err -> left (ShelleyQueryCmdStakeSnapshotDecodeError err)