From 35eac0411c600c43b343d5c06e9ed9bc7ef1a64a Mon Sep 17 00:00:00 2001 From: Carl Hammann Date: Mon, 13 Nov 2023 18:42:29 +0100 Subject: [PATCH 1/2] Add vote delegatee to 'stake-address-info' output --- .../src/Cardano/CLI/EraBased/Run/Query.hs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs b/cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs index 805b86bf8a..00dbafdd33 100644 --- a/cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs +++ b/cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs @@ -40,6 +40,7 @@ module Cardano.CLI.EraBased.Run.Query import Cardano.Api hiding (QueryInShelleyBasedEra (..)) import qualified Cardano.Api as Api import Cardano.Api.Byron hiding (QueryInShelleyBasedEra (..)) +import qualified Cardano.Api.Ledger as L import qualified Cardano.Api.Ledger as Ledger import Cardano.Api.Pretty import Cardano.Api.Shelley hiding (QueryInShelleyBasedEra (..)) @@ -812,11 +813,16 @@ runQueryStakeAddressInfoCmd & onLeft (left . QueryCmdUnsupportedNtcVersion) & onLeft (left . QueryCmdLocalStateQueryError . EraMismatchError) + stakeVoteDelegatees <- lift (queryStakeVoteDelegatees sbe stakeAddr) + & onLeft (left . QueryCmdUnsupportedNtcVersion) + & onLeft (left . QueryCmdLocalStateQueryError . EraMismatchError) + return $ do writeStakeAddressInfo mOutFile (DelegationsAndRewards (stakeRewardAccountBalances, stakePools)) (Map.mapKeys (makeStakeAddress networkId) stakeDelegDeposits) + (Map.mapKeys (makeStakeAddress networkId) stakeVoteDelegatees) ) & onLeft (left . QueryCmdAcquireFailure) & onLeft left @@ -827,37 +833,42 @@ writeStakeAddressInfo :: Maybe (File () Out) -> DelegationsAndRewards -> Map StakeAddress Lovelace -- ^ deposits + -> Map StakeAddress (L.DRep L.StandardCrypto) -- ^ vote delegatees -> ExceptT QueryCmdError IO () writeStakeAddressInfo mOutFile (DelegationsAndRewards (stakeAccountBalances, stakePools)) - stakeDelegDeposits = + stakeDelegDeposits + voteDelegatees = firstExceptT QueryCmdWriteFileError . newExceptT $ writeLazyByteStringOutput mOutFile (encodePretty jsonInfo) where jsonInfo :: [Aeson.Value] jsonInfo = map - (\(addr, mBalance, mPoolId, mDeposit) -> + (\(addr, mBalance, mPoolId, mDRep, mDeposit) -> Aeson.object [ "address" .= addr , "delegation" .= mPoolId + , "voteDelegation" .= mDRep , "rewardAccountBalance" .= mBalance , "delegationDeposit" .= mDeposit ] ) merged - merged :: [(StakeAddress, Maybe Lovelace, Maybe PoolId, Maybe Lovelace)] + merged :: [(StakeAddress, Maybe Lovelace, Maybe PoolId, Maybe (L.DRep L.StandardCrypto), Maybe Lovelace)] merged = - [ (addr, mBalance, mPoolId, mDeposit) + [ (addr, mBalance, mPoolId, mDRep, mDeposit) | addr <- Set.toList (Set.unions [ Map.keysSet stakeAccountBalances , Map.keysSet stakePools , Map.keysSet stakeDelegDeposits + , Map.keysSet voteDelegatees ]) , let mBalance = Map.lookup addr stakeAccountBalances mPoolId = Map.lookup addr stakePools mDeposit = Map.lookup addr stakeDelegDeposits + mDRep = Map.lookup addr voteDelegatees ] writeLedgerState :: forall era ledgerera. From 1b21c7e3b54597d5c552c13aeb8a54985d1c2844 Mon Sep 17 00:00:00 2001 From: Carl Hammann Date: Tue, 21 Nov 2023 12:34:35 +0100 Subject: [PATCH 2/2] Friendlier printing of delegations --- cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs b/cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs index 00dbafdd33..018ea4f725 100644 --- a/cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs +++ b/cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs @@ -58,6 +58,7 @@ import Cardano.Crypto.Hash (hashToBytesAsHex) import qualified Cardano.Crypto.Hash.Blake2b as Blake2b import qualified Cardano.Ledger.BaseTypes as L import qualified Cardano.Ledger.Core as Core +import qualified Cardano.Ledger.Credential as L import qualified Cardano.Ledger.Crypto as Crypto import Cardano.Ledger.Keys (KeyHash (..), KeyRole (..)) import Cardano.Ledger.SafeHash (SafeHash) @@ -849,14 +850,20 @@ writeStakeAddressInfo (\(addr, mBalance, mPoolId, mDRep, mDeposit) -> Aeson.object [ "address" .= addr - , "delegation" .= mPoolId - , "voteDelegation" .= mDRep + , "stakeDelegation" .= mPoolId + , "voteDelegation" .= fmap friendlyDRep mDRep , "rewardAccountBalance" .= mBalance , "delegationDeposit" .= mDeposit ] ) merged + friendlyDRep :: L.DRep L.StandardCrypto -> Text + friendlyDRep L.DRepAlwaysAbstain = "alwaysAbstain" + friendlyDRep L.DRepAlwaysNoConfidence = "alwaysNoConfidence" + friendlyDRep (L.DRepCredential cred) = + L.credToText cred -- this will pring "keyHash-..." or "scriptHash-...", depending on the type of credential + merged :: [(StakeAddress, Maybe Lovelace, Maybe PoolId, Maybe (L.DRep L.StandardCrypto), Maybe Lovelace)] merged = [ (addr, mBalance, mPoolId, mDRep, mDeposit)