88{-# LANGUAGE TypeApplications #-}
99{-# LANGUAGE TypeFamilies #-}
1010
11- module Test.Cardano.Ledger.Conway.Imp.UtxoSpec (spec ) where
11+ module Test.Cardano.Ledger.Conway.Imp.UtxoSpec (
12+ spec ,
13+ shelleyCertsSpec ,
14+ ) where
1215
1316import Cardano.Ledger.Address
1417import Cardano.Ledger.Alonzo.Plutus.Context (EraPlutusContext (.. ))
@@ -45,7 +48,6 @@ import Test.Cardano.Ledger.Plutus.Examples (alwaysSucceedsNoDatum, inputsOverlap
4548spec ::
4649 forall era .
4750 ( ConwayEraImp era
48- , ShelleyEraTxCert era
4951 , InjectRuleFailure " LEDGER" BabbageUtxoPredFailure era
5052 , InjectRuleFailure " LEDGER" AlonzoUtxosPredFailure era
5153 , Inject (ConwayContextError era ) (ContextError era )
@@ -73,14 +75,16 @@ spec = do
7375 mkBasicTx mkBasicTxBody
7476 & bodyTxL . certsTxBodyL
7577 .~ SSeq. fromList
78+ -- NOTE: we might not want to do all this again,
79+ -- as we already do it for all eras pre-dijkstra in `shelleyCertsSpec`
7680 [ RegPoolTxCert poolParams
7781 , RegDRepTxCert dRepCred dRepDeposit anchor
7882 , RegDepositDelegTxCert cred0 delegatee accountDeposit
79- , RegTxCert cred1
83+ , RegDepositTxCert cred1 accountDeposit
8084 , RegDepositTxCert cred2 accountDeposit
8185 , RegDepositTxCert cred3 accountDeposit
82- , UnRegTxCert cred2
8386 , UnRegDepositTxCert cred1 accountDeposit
87+ , UnRegDepositTxCert cred2 accountDeposit
8488 , RegDepositTxCert cred4 accountDeposit
8589 ]
8690 utxoAfterRegister <- getUTxO
@@ -107,7 +111,7 @@ spec = do
107111 .~ SSeq. fromList
108112 [ RetirePoolTxCert poolId (succ curEpochNo)
109113 , UnRegDRepTxCert dRepCred dRepDeposit
110- , UnRegTxCert cred3
114+ , UnRegDepositTxCert cred3 accountDeposit
111115 , UnRegDepositTxCert cred4 accountDeposit
112116 ]
113117 utxoAfterUnRegister <- getUTxO
@@ -179,3 +183,79 @@ spec = do
179183 [ injectFailure $
180184 CollectErrors [BadTranslation . inject $ ReferenceInputsNotDisjointFromInputs @ era [txIn]]
181185 ]
186+
187+ shelleyCertsSpec ::
188+ forall era .
189+ ( ConwayEraImp era
190+ , ShelleyEraTxCert era
191+ ) =>
192+ SpecWith (ImpInit (LedgerSpec era ))
193+ shelleyCertsSpec = do
194+ describe " Certificates" $ do
195+ it " Reg/UnReg collect and refund correct amounts" $ do
196+ utxoStart <- getUTxO
197+ accountDeposit <- getsPParams ppKeyDepositL
198+ stakePoolDeposit <- getsPParams ppPoolDepositL
199+ dRepDeposit <- getsPParams ppDRepDepositL
200+ cred0 <- KeyHashObj <$> freshKeyHash @ 'Staking
201+ cred1 <- KeyHashObj <$> freshKeyHash @ 'Staking
202+ cred2 <- KeyHashObj <$> freshKeyHash @ 'Staking
203+ cred3 <- KeyHashObj <$> freshKeyHash @ 'Staking
204+ cred4 <- KeyHashObj <$> freshKeyHash @ 'Staking
205+ poolId <- freshKeyHash
206+ poolParams <- freshPoolParams poolId (RewardAccount Testnet cred0)
207+ dRepCred <- KeyHashObj <$> freshKeyHash @ 'DRepRole
208+ let delegatee = DelegStakeVote poolId (DRepCredential dRepCred)
209+ anchor <- arbitrary
210+ txRegister <-
211+ submitTx $
212+ mkBasicTx mkBasicTxBody
213+ & bodyTxL . certsTxBodyL
214+ .~ SSeq. fromList
215+ [ RegPoolTxCert poolParams
216+ , RegDRepTxCert dRepCred dRepDeposit anchor
217+ , RegDepositDelegTxCert cred0 delegatee accountDeposit
218+ , RegTxCert cred1
219+ , RegDepositTxCert cred2 accountDeposit
220+ , RegDepositTxCert cred3 accountDeposit
221+ , UnRegTxCert cred2
222+ , UnRegDepositTxCert cred1 accountDeposit
223+ , RegDepositTxCert cred4 accountDeposit
224+ ]
225+ utxoAfterRegister <- getUTxO
226+ -- Overwrite deposit protocol parameters in order to ensure they does not affect refunds
227+ modifyPParams
228+ ( \ pp ->
229+ pp
230+ & ppKeyDepositL .~ Coin 1
231+ & ppPoolDepositL .~ Coin 2
232+ & ppDRepDepositL .~ Coin 3
233+ )
234+ (sumUTxO utxoStart <-> sumUTxO utxoAfterRegister)
235+ `shouldBe` inject
236+ ( (txRegister ^. bodyTxL . feeTxBodyL)
237+ <+> ((3 :: Int ) <×> accountDeposit) -- Only three accounts retained that are still registered
238+ <+> stakePoolDeposit
239+ <+> dRepDeposit
240+ )
241+ curEpochNo <- getsNES nesELL
242+ txUnRegister <-
243+ submitTx $
244+ mkBasicTx mkBasicTxBody
245+ & bodyTxL . certsTxBodyL
246+ .~ SSeq. fromList
247+ [ RetirePoolTxCert poolId (succ curEpochNo)
248+ , UnRegDRepTxCert dRepCred dRepDeposit
249+ , UnRegTxCert cred3
250+ , UnRegDepositTxCert cred4 accountDeposit
251+ ]
252+ utxoAfterUnRegister <- getUTxO
253+ let totalFees = (txRegister ^. bodyTxL . feeTxBodyL) <+> (txUnRegister ^. bodyTxL . feeTxBodyL)
254+ fees <- getsNES (nesEsL . esLStateL . lsUTxOStateL . utxosFeesL)
255+ totalFees `shouldBe` fees
256+ -- only deposits for stake pool and its account are not refunded at this point
257+ (sumUTxO utxoStart <-> sumUTxO utxoAfterUnRegister)
258+ `shouldBe` inject (totalFees <+> stakePoolDeposit <+> accountDeposit)
259+ passEpoch
260+ -- Check for successfull pool refund
261+ getReward cred0 `shouldReturn` stakePoolDeposit
0 commit comments