Skip to content

Commit d2c137c

Browse files
committed
Fix reading pool state for new ledger version, add dijkstra script purposes to ToJSON instances
1 parent 38ce31a commit d2c137c

File tree

3 files changed

+70
-60
lines changed

3 files changed

+70
-60
lines changed

cardano-cli/src/Cardano/CLI/Compatible/Json/Friendly.hs

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ data EraIndependentPlutusScriptPurpose
274274
| Rewarding
275275
| Voting
276276
| Proposing
277+
| Guarding
277278

278279
getScriptWitnessDetails
279280
:: forall era. Exp.Era era -> TxBody era -> [Aeson.Pair]
@@ -345,29 +346,35 @@ getScriptWitnessDetails era tb =
345346
Ledger.ConwayRewarding (L.AsIxItem _ rp) -> addLabelToPurpose Rewarding rp
346347
Ledger.ConwayVoting (L.AsIxItem _ vp) -> addLabelToPurpose Voting vp
347348
Ledger.ConwayProposing (L.AsIxItem _ pp) -> addLabelToPurpose Proposing pp
348-
friendlyPurpose AlonzoEraOnwardsDijkstra purpose =
349-
alonzoEraOnwardsConstraints AlonzoEraOnwardsDijkstra $
350-
error "TODO Dijkstra"
351-
-- case purpose of
352-
-- Ledger.ConwaySpending (L.AsIxItem _ sp) -> addLabelToPurpose Spending (friendlyInput sp)
353-
-- Ledger.ConwayMinting (L.AsIxItem _ mp) -> addLabelToPurpose Minting mp
354-
-- Ledger.ConwayCertifying (L.AsIxItem _ cp) -> addLabelToPurpose Certifying cp
355-
-- Ledger.ConwayRewarding (L.AsIxItem _ rp) -> addLabelToPurpose Rewarding rp
356-
-- Ledger.ConwayVoting (L.AsIxItem _ vp) -> addLabelToPurpose Voting vp
357-
-- Ledger.ConwayProposing (L.AsIxItem _ pp) -> addLabelToPurpose Proposing pp
349+
friendlyPurpose AlonzoEraOnwardsDijkstra purpose = do
350+
let era' = fromJust $ forEraMaybeEon (convert era)
351+
obtainCommonConstraints era' $
352+
case purpose of
353+
Ledger.DijkstraSpending (L.AsIxItem _ sp) -> addLabelToPurpose Spending (friendlyInput sp)
354+
Ledger.DijkstraMinting (L.AsIxItem _ mp) -> addLabelToPurpose Minting mp
355+
Ledger.DijkstraCertifying (L.AsIxItem _ cp) -> addLabelToPurpose Certifying cp
356+
Ledger.DijkstraRewarding (L.AsIxItem _ rp) -> addLabelToPurpose Rewarding rp
357+
Ledger.DijkstraVoting (L.AsIxItem _ vp) -> addLabelToPurpose Voting vp
358+
Ledger.DijkstraProposing (L.AsIxItem _ pp) -> addLabelToPurpose Proposing pp
359+
Ledger.DijkstraGuarding (L.AsIxItem _ pp) -> addLabelToPurpose Guarding pp
358360
friendlyInput :: Ledger.TxIn -> Aeson.Value
359361
friendlyInput (Ledger.TxIn (Ledger.TxId txidHash) ix) =
360362
Aeson.String $
361363
T.pack $
362364
T.unpack (hashToTextAsHex (extractHash txidHash)) ++ "#" ++ show (Ledger.txIxToInt ix)
363365

364-
addLabelToPurpose :: ToJSON v => EraIndependentPlutusScriptPurpose -> v -> Aeson.Value
366+
addLabelToPurpose
367+
:: ToJSON v
368+
=> EraIndependentPlutusScriptPurpose
369+
-> v
370+
-> Aeson.Value
365371
addLabelToPurpose Spending sp = Aeson.object ["spending script witnessed input" .= sp]
366372
addLabelToPurpose Minting mp = Aeson.object ["minting currency with policy id" .= mp]
367373
addLabelToPurpose Certifying cp = Aeson.object ["validating certificate with script credentials" .= cp]
368374
addLabelToPurpose Rewarding rp = Aeson.object ["withdrawing reward from script address" .= rp]
369375
addLabelToPurpose Voting vp = Aeson.object ["voting using script protected voter credentials" .= vp]
370376
addLabelToPurpose Proposing pp = Aeson.object ["submitting a proposal following proposal policy" .= pp]
377+
addLabelToPurpose Guarding _ = error "TODO Dijkstra"
371378

372379
friendlyScriptData :: Ledger.Tx (ShelleyLedgerEra era) -> Aeson.Value
373380
friendlyScriptData tx =
@@ -651,7 +658,7 @@ renderCertificate sbe = \case
651658
[ "pot" .= friendlyMirPot pot
652659
, friendlyMirTarget sbe target
653660
]
654-
ConwayCertificate w cert ->
661+
ConwayCertificate w@ConwayEraOnwardsConway (cert :: L.ConwayTxCert (ShelleyLedgerEra ConwayEra)) ->
655662
conwayEraOnwardsConstraints w $
656663
case cert of
657664
L.RegDRepTxCert credential coin mAnchor ->
@@ -747,9 +754,10 @@ renderCertificate sbe = \case
747754
[ "Drep credential" .= drepCredential
748755
, "anchor " .= mbAnchor
749756
]
750-
-- TODO: Dijkstra
751-
-- Pattern is complete for Conway, we're missing COMPLETE pragma for Dijkstra in ledger to remove this error
752-
_ -> error "renderCertificate: Dijkstra"
757+
-- TODO Dijkstra: What's missing here?
758+
_ -> error "renderCertificate: TODO Dijkstra impossible"
759+
ConwayCertificate ConwayEraOnwardsDijkstra _ ->
760+
error "renderCertificate: TODO Dijkstra era not supported"
753761
where
754762
conwayToObject
755763
:: ()

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

Lines changed: 15 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -658,7 +658,7 @@ runQueryPoolStateCmd
658658
Only poolIds -> Just $ fromList poolIds
659659

660660
result <- easyRunQuery (queryPoolState beo poolFilter)
661-
hoist liftIO $ obtainCommonConstraints era (writePoolState outputFormat) mOutFile result
661+
hoist liftIO $ writePoolState era outputFormat mOutFile result
662662
)
663663
& fromEitherCIOCli
664664

@@ -1183,38 +1183,18 @@ writeStakeSnapshots outputFormat mOutFile qState = do
11831183
-- | This function obtains the pool parameters, equivalent to the following jq query on the output of query ledger-state
11841184
-- .nesEs.esLState.lsDPState.dpsPState.psStakePoolParams.<pool_id>
11851185
writePoolState
1186-
:: Vary [FormatJson, FormatYaml]
1186+
:: Exp.Era era
1187+
-> Vary [FormatJson, FormatYaml]
11871188
-> Maybe (File () Out)
11881189
-> SerialisedPoolState
11891190
-> ExceptT QueryCmdError IO ()
1190-
writePoolState outputFormat mOutFile serialisedCurrentEpochState = do
1191-
-- PoolState poolState <-
1192-
-- pure (decodePoolState serialisedCurrentEpochState)
1193-
-- & onLeft (left . QueryCmdPoolStateDecodeError)
1194-
let poolState = error "TODO Dijkstra"
1195-
1196-
let hks :: [L.KeyHash L.StakePool]
1197-
hks =
1198-
toList $
1199-
Map.keysSet (L.psStakePools poolState)
1200-
<> Map.keysSet (L.psFutureStakePools poolState)
1201-
<> Map.keysSet (L.psRetiring poolState)
1202-
1203-
let poolStates :: Map (L.KeyHash 'L.StakePool) Params
1204-
poolStates =
1205-
fromList $
1206-
hks
1207-
<&> ( \hk ->
1208-
( hk
1209-
, Params
1210-
{ poolParameters = Map.lookup hk (L.psStakePools poolState)
1211-
, futurePoolParameters = Map.lookup hk (L.psFutureStakePools poolState)
1212-
, retiringEpoch = Map.lookup hk (L.psRetiring poolState)
1213-
}
1214-
)
1215-
)
1191+
writePoolState era outputFormat mOutFile serialisedCurrentEpochState = do
1192+
poolState <-
1193+
liftEither . first QueryCmdPoolStateDecodeError $
1194+
decodePoolState (convert era) serialisedCurrentEpochState
12161195

1217-
let output =
1196+
let poolStates = mkPoolStates poolState :: Map (L.KeyHash L.StakePool) PoolParams
1197+
output =
12181198
outputFormat
12191199
& ( id
12201200
. Vary.on (\FormatJson -> Json.encodeJson)
@@ -1823,22 +1803,17 @@ runQuerySPOStakeDistribution
18231803

18241804
let poolIds :: Set (Hash StakePoolKey) = Set.fromList $ map StakePoolKeyHash $ Map.keys spoStakeDistribution
18251805

1826-
serialisedPoolState :: SerialisedPoolState <-
1806+
serialisedPoolState <-
18271807
fromExceptTCli $ runQuery nodeConnInfo target $ queryPoolState beo (Just poolIds)
18281808

1829-
-- PoolState (poolState :: L.PState (ShelleyLedgerEra era)) <-
1830-
-- fromEitherCli $ decodePoolState (convert eon) serialisedPoolState
1831-
let poolState = error "TODO Dijkstra"
1809+
PoolState poolStateResult <-
1810+
fromEitherCli $ decodePoolState (convert eon) serialisedPoolState
18321811

18331812
let spoToRewardCred :: Map (L.KeyHash L.StakePool) (L.Credential 'L.Staking)
18341813
spoToRewardCred =
1835-
Map.mapWithKey
1836-
( \k ->
1837-
L.raCredential
1838-
. L.ppRewardAccount
1839-
. L.stakePoolStateToPoolParams k
1840-
)
1841-
(L.psStakePools poolState)
1814+
Map.map
1815+
(L.raCredential . L.ppRewardAccount)
1816+
(L.qpsrStakePoolParams poolStateResult)
18421817

18431818
allRewardCreds :: Set StakeCredential
18441819
allRewardCreds = Set.fromList $ map fromShelleyStakeCredential $ Map.elems spoToRewardCred

cardano-cli/src/Cardano/CLI/Type/Common.hs

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
{-# LANGUAGE DerivingStrategies #-}
44
{-# LANGUAGE GADTs #-}
55
{-# LANGUAGE GeneralisedNewtypeDeriving #-}
6+
{-# LANGUAGE NamedFieldPuns #-}
67
{-# LANGUAGE RankNTypes #-}
78

89
module Cardano.CLI.Type.Common
@@ -50,7 +51,8 @@ module Cardano.CLI.Type.Common
5051
, OpCertNodeStateCounter (..)
5152
, OpCertOnDiskCounter (..)
5253
, OpCertStartingKesPeriod (..)
53-
, Params (..)
54+
, PoolParams (..)
55+
, mkPoolStates
5456
, ParserFileDirection (..)
5557
, PrivKeyFile (..)
5658
, ProposalBinary
@@ -102,10 +104,15 @@ where
102104

103105
import Cardano.Api hiding (Script)
104106
import Cardano.Api.Ledger qualified as L
107+
108+
import Cardano.Ledger.Api.State.Query qualified as L
109+
import Cardano.Ledger.Compactible qualified as L
105110
import Cardano.Ledger.State qualified as L
106111

107112
import Data.Aeson (object, pairs, (.=))
108113
import Data.Aeson qualified as Aeson
114+
import Data.Map.Strict (Map)
115+
import Data.Map.Strict qualified as Map
109116
import Data.String (IsString)
110117
import Data.Text (Text)
111118
import Data.Text qualified as Text
@@ -348,23 +355,43 @@ data AllOrOnly a = All | Only [a] deriving (Eq, Show)
348355
-- | This data structure is used to allow nicely formatted output in the query pool-params command.
349356
-- params are the current pool parameter settings, futureparams are new parameters, retiringEpoch is the
350357
-- epoch that has been set for pool retirement. Any of these may be Nothing.
351-
data Params = Params
358+
data PoolParams = PoolParams
352359
{ poolParameters :: Maybe L.StakePoolState
353360
, futurePoolParameters :: Maybe L.StakePoolState
354361
, retiringEpoch :: Maybe EpochNo
355362
}
356363
deriving Show
357364

365+
mkPoolStates :: PoolState era -> Map (L.KeyHash L.StakePool) PoolParams
366+
mkPoolStates
367+
( PoolState
368+
( L.QueryPoolStateResult
369+
{ L.qpsrStakePoolParams
370+
, L.qpsrFutureStakePoolParams
371+
, L.qpsrRetiring
372+
, L.qpsrDeposits
373+
}
374+
)
375+
) = (`Map.mapWithKey` qpsrStakePoolParams) $ \kh pp -> do
376+
let mDeposit = L.toCompact =<< Map.lookup kh qpsrDeposits
377+
PoolParams
378+
{ poolParameters = (`L.mkStakePoolState` pp) <$> mDeposit
379+
, futurePoolParameters = do
380+
futurePp <- Map.lookup kh qpsrFutureStakePoolParams
381+
(`L.mkStakePoolState` futurePp) <$> mDeposit
382+
, retiringEpoch = Map.lookup kh qpsrRetiring
383+
}
384+
358385
-- | Pretty printing for pool parameters
359-
instance ToJSON Params where
360-
toJSON (Params p fp r) =
386+
instance ToJSON PoolParams where
387+
toJSON (PoolParams p fp r) =
361388
object
362389
[ "poolParams" .= p
363390
, "futurePoolParams" .= fp
364391
, "retiring" .= r
365392
]
366393

367-
toEncoding (Params p fp r) =
394+
toEncoding (PoolParams p fp r) =
368395
pairs $
369396
mconcat
370397
[ "poolParams" .= p

0 commit comments

Comments
 (0)