Skip to content

Commit b6ed6df

Browse files
committed
Reinstate certificates with deposits
1 parent 7118877 commit b6ed6df

File tree

2 files changed

+73
-24
lines changed

2 files changed

+73
-24
lines changed

eras/dijkstra/src/Cardano/Ledger/Dijkstra/Rules/Cert.hs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
module Cardano.Ledger.Dijkstra.Rules.Cert () where
1414

15-
import Cardano.Ledger.BaseTypes (ShelleyBase)
15+
import Cardano.Ledger.BaseTypes (ShelleyBase, StrictMaybe (..))
1616
import Cardano.Ledger.Conway.Rules (
1717
CertEnv (..),
1818
ConwayCertEvent,
@@ -99,9 +99,13 @@ certTransition = do
9999
certPState = certState ^. certPStateL
100100
pools = psStakePoolParams certPState
101101
case c of
102-
DijkstraTxCertDeleg (DijkstraRegDelegCert sc d coin) -> do
103-
trans @(EraRule "DELEG" era) $
104-
TRC (ConwayDelegEnv pp pools, certState, ConwayRegDelegCert sc d coin)
102+
DijkstraTxCertDeleg delegCert ->
103+
let conwayDelegCert = case delegCert of
104+
DijkstraRegCert cred coin -> ConwayRegCert cred (SJust coin)
105+
DijkstraUnRegCert cred coin -> ConwayUnRegCert cred (SJust coin)
106+
DijkstraRegDelegCert sc d coin -> ConwayRegDelegCert sc d coin
107+
in trans @(EraRule "DELEG" era) $
108+
TRC (ConwayDelegEnv pp pools, certState, conwayDelegCert)
105109
DijkstraTxCertPool poolCert -> do
106110
newPState <- trans @(EraRule "POOL" era) $ TRC (PoolEnv currentEpoch pp, certPState, poolCert)
107111
pure $ certState & certPStateL .~ newPState

eras/dijkstra/src/Cardano/Ledger/Dijkstra/TxCert.hs

Lines changed: 65 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -79,26 +79,39 @@ import Data.Aeson (KeyValue ((.=)), ToJSON (..))
7979
import GHC.Generics (Generic)
8080
import NoThunks.Class (NoThunks)
8181

82-
data DijkstraDelegCert = DijkstraRegDelegCert !StakeCredential !Delegatee !Coin
82+
data DijkstraDelegCert
83+
= DijkstraRegCert !StakeCredential !Coin
84+
| DijkstraUnRegCert !StakeCredential !Coin
85+
| DijkstraRegDelegCert !StakeCredential !Delegatee !Coin
8386
deriving (Show, Generic, Eq, Ord)
8487

8588
instance EncCBOR DijkstraDelegCert where
8689
encCBOR = \case
90+
DijkstraRegCert cred deposit ->
91+
encodeListLen 3
92+
<> encodeWord8 19
93+
<> encCBOR cred
94+
<> encCBOR deposit
95+
DijkstraUnRegCert cred deposit ->
96+
encodeListLen 3
97+
<> encodeWord8 20
98+
<> encCBOR cred
99+
<> encCBOR deposit
87100
DijkstraRegDelegCert cred (DelegStake poolId) deposit ->
88101
encodeListLen 4
89-
<> encodeWord8 19
102+
<> encodeWord8 21
90103
<> encCBOR cred
91104
<> encCBOR poolId
92105
<> encCBOR deposit
93106
DijkstraRegDelegCert cred (DelegVote drep) deposit ->
94107
encodeListLen 4
95-
<> encodeWord8 20
108+
<> encodeWord8 22
96109
<> encCBOR cred
97110
<> encCBOR drep
98111
<> encCBOR deposit
99112
DijkstraRegDelegCert cred (DelegStakeVote poolId dRep) deposit ->
100113
encodeListLen 5
101-
<> encodeWord8 21
114+
<> encodeWord8 23
102115
<> encCBOR cred
103116
<> encCBOR poolId
104117
<> encCBOR dRep
@@ -110,8 +123,21 @@ instance NoThunks DijkstraDelegCert
110123

111124
instance ToJSON DijkstraDelegCert where
112125
toJSON = \case
126+
DijkstraRegCert cred deposit ->
127+
kindObject
128+
"RegCert"
129+
[ "credential" .= toJSON cred
130+
, "deposit" .= toJSON deposit
131+
]
132+
DijkstraUnRegCert cred refund ->
133+
kindObject
134+
"UnRegCert"
135+
[ "credential" .= toJSON cred
136+
, "refund" .= toJSON refund
137+
]
113138
DijkstraRegDelegCert cred delegatee deposit ->
114-
kindObject "RegDelegCert" $
139+
kindObject
140+
"RegDelegCert"
115141
[ "credential" .= toJSON cred
116142
, "delegatee" .= toJSON delegatee
117143
, "deposit" .= toJSON deposit
@@ -126,8 +152,6 @@ data DijkstraTxCert era
126152
data DijkstraTxCertUpgradeError
127153
= RegTxCertExpunged
128154
| UnRegTxCertExpunged
129-
| RegDepositTxCertExpunged
130-
| UnRegDepositTxCertExpunged
131155
| DelegTxCertExpunged
132156
deriving (Eq, Show)
133157

@@ -157,20 +181,29 @@ instance
157181
where
158182
decCBOR = decodeRecordSum "DijkstraTxCert" $ \case
159183
t
160-
| 0 <= t && t < 3 -> fail "Shelley certificates are no longer supported"
184+
| 0 <= t && t < 3 -> fail "Certificates without deposits are no longer supported"
161185
| 3 <= t && t < 5 -> poolTxCertDecoder t
162186
| t == 5 -> fail "Genesis delegation certificates are no longer supported"
163187
| t == 6 -> fail "MIR certificates are no longer supported"
164-
| 7 <= t && t < 11 -> fail "Certificates without deposits are no longer supported"
188+
| 7 <= t && t < 9 -> conwayTxCertDelegDecoder t
189+
| 9 <= t && t < 11 -> fail "Certificates without deposits are no longer supported"
165190
| 11 <= t && t < 19 -> conwayTxCertDelegDecoder t
166191
| 19 <= t -> dijkstraTxCertDelegDecoder t
167192
t -> invalidKey t
168193

169194
dijkstraTxCertDelegDecoder :: ConwayEraTxCert era => Word -> Decoder s (Int, TxCert era)
170195
dijkstraTxCertDelegDecoder = \case
171-
19 -> regDelegCertDecoder 4 (DelegStake <$> decCBOR)
172-
20 -> regDelegCertDecoder 4 (DelegVote <$> decCBOR)
173-
21 -> regDelegCertDecoder 5 (DelegStakeVote <$> decCBOR <*> decCBOR)
196+
19 -> do
197+
cred <- decCBOR
198+
deposit <- decCBOR
199+
pure (3, RegDepositTxCert cred deposit)
200+
20 -> do
201+
cred <- decCBOR
202+
deposit <- decCBOR
203+
pure (3, UnRegDepositTxCert cred deposit)
204+
21 -> regDelegCertDecoder 4 (DelegStake <$> decCBOR)
205+
22 -> regDelegCertDecoder 4 (DelegVote <$> decCBOR)
206+
23 -> regDelegCertDecoder 5 (DelegStakeVote <$> decCBOR <*> decCBOR)
174207
k -> invalidKey k
175208
where
176209
regDelegCertDecoder n decodeDelegatee = do
@@ -200,8 +233,8 @@ instance EraTxCert DijkstraEra where
200233
RetirePoolTxCert poolId epochNo -> Right $ RetirePoolTxCert poolId epochNo
201234
RegTxCert _ -> Left RegTxCertExpunged
202235
UnRegTxCert _ -> Left UnRegTxCertExpunged
203-
RegDepositTxCert _ _ -> Left RegDepositTxCertExpunged
204-
UnRegDepositTxCert _ _ -> Left UnRegDepositTxCertExpunged
236+
RegDepositTxCert cred c -> Right $ RegDepositTxCert cred c
237+
UnRegDepositTxCert cred c -> Right $ UnRegDepositTxCert cred c
205238
RegDepositDelegTxCert cred d c -> Right $ RegDepositDelegTxCert cred d c
206239
AuthCommitteeHotKeyTxCert ck hk -> Right $ AuthCommitteeHotKeyTxCert ck hk
207240
ResignCommitteeColdTxCert ck a -> Right $ ResignCommitteeColdTxCert ck a
@@ -242,7 +275,11 @@ instance EraTxCert DijkstraEra where
242275

243276
getScriptWitnessDijkstraTxCert :: DijkstraTxCert era -> Maybe ScriptHash
244277
getScriptWitnessDijkstraTxCert = \case
245-
DijkstraTxCertDeleg (DijkstraRegDelegCert cred _ _) -> credScriptHash cred
278+
DijkstraTxCertDeleg delegCert ->
279+
case delegCert of
280+
DijkstraRegCert cred _ -> credScriptHash cred
281+
DijkstraUnRegCert cred _ -> credScriptHash cred
282+
DijkstraRegDelegCert cred _ _ -> credScriptHash cred
246283
DijkstraTxCertPool {} -> Nothing
247284
DijkstraTxCertGov govCert -> govWitness govCert
248285
where
@@ -257,7 +294,11 @@ getScriptWitnessDijkstraTxCert = \case
257294

258295
getVKeyWitnessDijkstraTxCert :: DijkstraTxCert era -> Maybe (KeyHash 'Witness)
259296
getVKeyWitnessDijkstraTxCert = \case
260-
DijkstraTxCertDeleg (DijkstraRegDelegCert cred _ _) -> credKeyHashWitness cred
297+
DijkstraTxCertDeleg delegCert ->
298+
case delegCert of
299+
DijkstraRegCert cred _ -> credKeyHashWitness cred
300+
DijkstraUnRegCert cred _ -> credKeyHashWitness cred
301+
DijkstraRegDelegCert cred _ _ -> credKeyHashWitness cred
261302
DijkstraTxCertPool poolCert -> Just $ poolCertKeyHashWitness poolCert
262303
DijkstraTxCertGov govCert -> govWitness govCert
263304
where
@@ -287,11 +328,15 @@ instance ShelleyEraTxCert DijkstraEra where
287328
getMirTxCert = const Nothing
288329

289330
instance ConwayEraTxCert DijkstraEra where
290-
mkRegDepositTxCert = notSupportedInThisEra
291-
getRegDepositTxCert = const Nothing
331+
mkRegDepositTxCert cred c = DijkstraTxCertDeleg $ DijkstraRegCert cred c
332+
333+
getRegDepositTxCert (DijkstraTxCertDeleg (DijkstraRegCert cred c)) = Just (cred, c)
334+
getRegDepositTxCert _ = Nothing
335+
336+
mkUnRegDepositTxCert cred c = DijkstraTxCertDeleg $ DijkstraUnRegCert cred c
292337

293-
mkUnRegDepositTxCert = notSupportedInThisEra
294-
getUnRegDepositTxCert = const Nothing
338+
getUnRegDepositTxCert (DijkstraTxCertDeleg (DijkstraUnRegCert cred c)) = Just (cred, c)
339+
getUnRegDepositTxCert _ = Nothing
295340

296341
mkDelegTxCert = notSupportedInThisEra
297342
getDelegTxCert = const Nothing

0 commit comments

Comments
 (0)