Skip to content

Commit e805e09

Browse files
Merge pull request #990 from IntersectMBO/smelc/hoops-augment-spo-stake-distribution
Augment of query spo-stake-distribution to include the DRep delegation choices of the Pool's rewards accounts
2 parents c4ab625 + 38f5132 commit e805e09

File tree

4 files changed

+126
-46
lines changed

4 files changed

+126
-46
lines changed

cabal.project

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ repository cardano-haskell-packages
1414
-- you need to run if you change them
1515
index-state:
1616
, hackage.haskell.org 2024-10-11T15:49:11Z
17-
, cardano-haskell-packages 2024-12-05T13:51:16Z
17+
, cardano-haskell-packages 2024-12-19T20:16:27Z
1818

1919
packages:
2020
cardano-cli

cardano-cli/cardano-cli.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ library
207207
binary,
208208
bytestring,
209209
canonical-json,
210-
cardano-api ^>=10.4,
210+
cardano-api ^>=10.5,
211211
cardano-binary,
212212
cardano-crypto,
213213
cardano-crypto-class ^>=2.1.2,

cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs

Lines changed: 121 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
{-# LANGUAGE NamedFieldPuns #-}
1111
{-# LANGUAGE RankNTypes #-}
1212
{-# LANGUAGE ScopedTypeVariables #-}
13+
{-# LANGUAGE TupleSections #-}
1314
{-# LANGUAGE TypeApplications #-}
1415
{-# LANGUAGE TypeOperators #-}
1516

@@ -565,7 +566,7 @@ runQueryKesPeriodInfoCmd
565566
case Map.lookup (coerce blockIssuerHash) opCertCounterMap of
566567
-- Operational certificate exists in the protocol state
567568
-- so our ondisk op cert counter must be greater than or
568-
-- equal to what is in the node state
569+
-- equal to what is in the node state.
569570
Just ptclStateCounter -> return (OpCertOnDiskCounter onDiskOpCertCount, Just $ OpCertNodeStateCounter ptclStateCounter)
570571
Nothing -> return (OpCertOnDiskCounter onDiskOpCertCount, Nothing)
571572

@@ -874,68 +875,96 @@ runQueryStakeAddressInfoCmd
874875
=> Cmd.QueryStakeAddressInfoCmdArgs
875876
-> ExceptT QueryCmdError IO ()
876877
runQueryStakeAddressInfoCmd
877-
Cmd.QueryStakeAddressInfoCmdArgs
878+
cmd@Cmd.QueryStakeAddressInfoCmdArgs
878879
{ Cmd.commons =
879880
Cmd.QueryCommons
880881
{ Cmd.nodeSocketPath
881882
, Cmd.consensusModeParams
882883
, Cmd.networkId
883884
, Cmd.target
884885
}
885-
, Cmd.addr = StakeAddress _ addr
886886
, Cmd.mOutFile
887887
} = do
888888
let localNodeConnInfo = LocalNodeConnectInfo consensusModeParams networkId nodeSocketPath
889+
AnyCardanoEra era <-
890+
firstExceptT
891+
QueryCmdAcquireFailure
892+
(newExceptT $ executeLocalStateQueryExpr localNodeConnInfo target queryCurrentEra)
893+
& onLeft (left . QueryCmdUnsupportedNtcVersion)
894+
sbe <- requireShelleyBasedEra era & onNothing (left QueryCmdByronEra)
889895

890-
join $
891-
lift
892-
( executeLocalStateQueryExpr localNodeConnInfo target $ runExceptT $ do
893-
AnyCardanoEra era <- easyRunQueryCurrentEra
896+
said <- callQueryStakeAddressInfoCmd cmd
894897

895-
sbe <-
896-
requireShelleyBasedEra era
897-
& onNothing (left QueryCmdByronEra)
898+
writeStakeAddressInfo sbe said mOutFile
898899

899-
let stakeAddr = Set.singleton $ fromShelleyStakeCredential addr
900+
-- | Container for data returned by 'callQueryStakeAddressInfoCmd'
901+
data StakeAddressInfoData = StakeAddressInfoData
902+
{ rewards :: DelegationsAndRewards
903+
, deposits :: Map StakeAddress Lovelace
904+
, delegatees :: Map StakeAddress (L.DRep L.StandardCrypto)
905+
}
900906

901-
(stakeRewardAccountBalances, stakePools) <-
902-
easyRunQuery (queryStakeAddresses sbe stakeAddr networkId)
907+
callQueryStakeAddressInfoCmd
908+
:: ()
909+
=> Cmd.QueryStakeAddressInfoCmdArgs
910+
-> ExceptT QueryCmdError IO StakeAddressInfoData
911+
callQueryStakeAddressInfoCmd
912+
Cmd.QueryStakeAddressInfoCmdArgs
913+
{ Cmd.commons =
914+
Cmd.QueryCommons
915+
{ Cmd.nodeSocketPath
916+
, Cmd.consensusModeParams
917+
, Cmd.networkId
918+
, Cmd.target
919+
}
920+
, Cmd.addr = StakeAddress _ addr
921+
} =
922+
do
923+
let localNodeConnInfo = LocalNodeConnectInfo consensusModeParams networkId nodeSocketPath
903924

904-
beo <- requireEon BabbageEra era
925+
lift $ executeLocalStateQueryExpr localNodeConnInfo target $ runExceptT $ do
926+
AnyCardanoEra era <- easyRunQueryCurrentEra
905927

906-
stakeDelegDeposits <- easyRunQuery (queryStakeDelegDeposits beo stakeAddr)
928+
sbe <-
929+
requireShelleyBasedEra era
930+
& onNothing (left QueryCmdByronEra)
907931

908-
stakeVoteDelegatees <- monoidForEraInEonA era $ \ceo ->
909-
easyRunQuery (queryStakeVoteDelegatees ceo stakeAddr)
932+
let stakeAddr = Set.singleton $ fromShelleyStakeCredential addr
910933

911-
return $ do
912-
writeStakeAddressInfo
913-
sbe
914-
mOutFile
915-
(DelegationsAndRewards (stakeRewardAccountBalances, stakePools))
916-
(Map.mapKeys (makeStakeAddress networkId) stakeDelegDeposits)
917-
(Map.mapKeys (makeStakeAddress networkId) stakeVoteDelegatees)
918-
)
919-
& onLeft (left . QueryCmdAcquireFailure)
920-
& onLeft left
934+
(stakeRewardAccountBalances, stakePools) <-
935+
easyRunQuery (queryStakeAddresses sbe stakeAddr networkId)
936+
937+
beo <- requireEon BabbageEra era
938+
939+
stakeDelegDeposits <- easyRunQuery (queryStakeDelegDeposits beo stakeAddr)
940+
941+
stakeVoteDelegatees <- monoidForEraInEonA era $ \ceo ->
942+
easyRunQuery (queryStakeVoteDelegatees ceo stakeAddr)
943+
944+
pure $
945+
StakeAddressInfoData
946+
(DelegationsAndRewards (stakeRewardAccountBalances, stakePools))
947+
(Map.mapKeys (makeStakeAddress networkId) stakeDelegDeposits)
948+
(Map.mapKeys (makeStakeAddress networkId) stakeVoteDelegatees)
949+
& onLeft (left . QueryCmdAcquireFailure)
950+
& onLeft left
921951

922952
-- -------------------------------------------------------------------------------------------------
923953

924954
writeStakeAddressInfo
925955
:: ShelleyBasedEra era
956+
-> StakeAddressInfoData
926957
-> Maybe (File () Out)
927-
-> DelegationsAndRewards
928-
-> Map StakeAddress Lovelace
929-
-- ^ deposits
930-
-> Map StakeAddress (L.DRep L.StandardCrypto)
931-
-- ^ vote delegatees
932958
-> ExceptT QueryCmdError IO ()
933959
writeStakeAddressInfo
934960
sbe
935-
mOutFile
936-
(DelegationsAndRewards (stakeAccountBalances, stakePools))
937-
stakeDelegDeposits
938-
voteDelegatees =
961+
( StakeAddressInfoData
962+
{ rewards = DelegationsAndRewards (stakeAccountBalances, stakePools)
963+
, deposits = stakeDelegDeposits
964+
, delegatees = voteDelegatees
965+
}
966+
)
967+
mOutFile =
939968
firstExceptT QueryCmdWriteFileError . newExceptT $
940969
writeLazyByteStringOutput mOutFile (encodePretty $ jsonInfo sbe)
941970
where
@@ -1638,7 +1667,7 @@ runQuerySPOStakeDistribution
16381667
Cmd.QuerySPOStakeDistributionCmdArgs
16391668
{ Cmd.eon
16401669
, Cmd.commons =
1641-
Cmd.QueryCommons
1670+
commons@Cmd.QueryCommons
16421671
{ Cmd.nodeSocketPath
16431672
, Cmd.consensusModeParams
16441673
, Cmd.networkId
@@ -1655,9 +1684,59 @@ runQuerySPOStakeDistribution
16551684

16561685
spos <- fromList <$> mapM spoFromSource spoHashSources
16571686

1658-
spoStakeDistribution <- runQuery localNodeConnInfo target $ querySPOStakeDistribution eon spos
1659-
writeOutput mOutFile $
1660-
Map.assocs spoStakeDistribution
1687+
let beo = convert eon
1688+
1689+
spoStakeDistribution :: Map (L.KeyHash L.StakePool StandardCrypto) L.Coin <-
1690+
runQuery localNodeConnInfo target $ querySPOStakeDistribution eon spos
1691+
let poolIds :: Set (Hash StakePoolKey) = Set.fromList $ map StakePoolKeyHash $ Map.keys spoStakeDistribution
1692+
1693+
serialisedPoolState :: SerialisedPoolState era <-
1694+
runQuery localNodeConnInfo target $ queryPoolState beo (Just poolIds)
1695+
1696+
PoolState (poolState :: L.PState (ShelleyLedgerEra era)) <-
1697+
pure (decodePoolState serialisedPoolState)
1698+
& onLeft (left . QueryCmdPoolStateDecodeError)
1699+
1700+
let addressesAndRewards
1701+
:: Map
1702+
StakeAddress
1703+
(L.KeyHash L.StakePool StandardCrypto) =
1704+
Map.fromList
1705+
[ ( makeStakeAddress networkId . fromShelleyStakeCredential . L.raCredential . L.ppRewardAccount $ addr
1706+
, keyHash
1707+
)
1708+
| (keyHash, addr) <- Map.toList $ L.psStakePoolParams poolState
1709+
]
1710+
1711+
mkQueryStakeAddressInfoCmdArgs addr =
1712+
Cmd.QueryStakeAddressInfoCmdArgs
1713+
{ Cmd.commons = commons
1714+
, addr
1715+
, mOutFile -- unused anyway. TODO tighten this by removing the field.
1716+
}
1717+
1718+
spoToDelegatee <-
1719+
Map.fromList . concat
1720+
<$> traverse
1721+
( \stakeAddr -> do
1722+
info <- callQueryStakeAddressInfoCmd $ mkQueryStakeAddressInfoCmdArgs stakeAddr
1723+
return $
1724+
[ (spo, delegatee)
1725+
| (Just spo, delegatee) <-
1726+
map (first (`Map.lookup` addressesAndRewards)) $ Map.toList $ delegatees info
1727+
]
1728+
)
1729+
(Map.keys addressesAndRewards)
1730+
1731+
let toWrite =
1732+
[ ( spo
1733+
, coin
1734+
, Map.lookup spo spoToDelegatee
1735+
)
1736+
| (spo, coin) <- Map.assocs spoStakeDistribution
1737+
]
1738+
1739+
writeOutput mOutFile toWrite
16611740

16621741
runQueryCommitteeMembersState
16631742
:: Cmd.QueryCommitteeMembersStateCmdArgs era
@@ -1870,7 +1949,8 @@ easyRunQuerySystemStart = lift querySystemStart & onLeft (left . QueryCmdUnsuppo
18701949
easyRunQuery
18711950
:: ()
18721951
=> Monad m
1873-
=> m (Either UnsupportedNtcVersionError (Either Consensus.EraMismatch a)) -> ExceptT QueryCmdError m a
1952+
=> m (Either UnsupportedNtcVersionError (Either Consensus.EraMismatch a))
1953+
-> ExceptT QueryCmdError m a
18741954
easyRunQuery q =
18751955
lift q
18761956
& onLeft (left . QueryCmdUnsupportedNtcVersion)

flake.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)