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 ()
876877runQueryStakeAddressInfoCmd
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
924954writeStakeAddressInfo
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 ()
933959writeStakeAddressInfo
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
16621741runQueryCommitteeMembersState
16631742 :: Cmd. QueryCommitteeMembersStateCmdArgs era
@@ -1870,7 +1949,8 @@ easyRunQuerySystemStart = lift querySystemStart & onLeft (left . QueryCmdUnsuppo
18701949easyRunQuery
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
18741954easyRunQuery q =
18751955 lift q
18761956 & onLeft (left . QueryCmdUnsupportedNtcVersion )
0 commit comments