Skip to content

Commit 8370c8e

Browse files
Create tests for CurrentPeriodIsVacant state
1 parent 891bd78 commit 8370c8e

2 files changed

Lines changed: 135 additions & 4 deletions

File tree

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.28;
3+
4+
import {UniversalTest} from "./UniversalTest.t.sol";
5+
import {LibProvingPeriod} from "src/libs/LibProvingPeriod.sol";
6+
import {BaseProverManager} from "src/protocol/BaseProverManager.sol";
7+
import {IProverManager} from "src/protocol/IProverManager.sol";
8+
import {IInbox} from "src/protocol/IInbox.sol";
9+
10+
/// Represents states where the current period is open and has no prover
11+
abstract contract CurrentPeriodIsVacant is UniversalTest {
12+
// This is a sanity check to ensure we're in the expected state
13+
function test_CurrentPeriodIsVacant_confirmPreconditions() public view {
14+
LibProvingPeriod.Period memory period = proverManager.getPeriod(proverManager.currentPeriodId());
15+
assertEq(period.end, 0, "Period is not open");
16+
assertEq(period.prover, address(0), "Period has prover");
17+
// this is not part of the definition of "vacant" but it should be impossible to get into a situation
18+
// where there is a fee and no prover
19+
assertEq(period.fee, 0, "Period has non-zero fee");
20+
}
21+
22+
function test_CurrentPeriodIsVacant_payPublicationFee_shouldChargeNoRegularFee() public {
23+
uint256 balanceBefore = proverManager.balances(proposer);
24+
vm.prank(address(inbox));
25+
proverManager.payPublicationFee(proposer, false);
26+
uint256 balanceAfter = proverManager.balances(proposer);
27+
28+
assertEq(balanceBefore, balanceAfter, "Proposer balance changed");
29+
}
30+
31+
function test_CurrentPeriodIsVacant_payPublicationFee_shouldChargeNoDelayedFee() public {
32+
uint256 balanceBefore = proverManager.balances(proposer);
33+
vm.prank(address(inbox));
34+
proverManager.payPublicationFee(proposer, true);
35+
uint256 balanceAfter = proverManager.balances(proposer);
36+
37+
assertEq(balanceBefore, balanceAfter, "Proposer balance changed");
38+
}
39+
40+
function test_CurrentPeriodIsVacant_bid_shouldRevertOnZeroBid() public {
41+
_deposit(proverA, DEPOSIT_AMOUNT);
42+
vm.prank(proverA);
43+
vm.expectRevert(BaseProverManager.OfferedFeeTooHigh.selector);
44+
proverManager.bid(0);
45+
}
46+
47+
function test_CurrentPeriodIsVacant_evictProver_shouldRevert() public {
48+
IInbox.PublicationHeader memory header;
49+
header.timestamp = vm.getBlockTimestamp() - proverManager.livenessWindow() - 1;
50+
header.id = checkpointTracker.LAST_PROVEN_ID() + 1;
51+
52+
vm.prank(evictor);
53+
vm.expectRevert(BaseProverManager.PeriodNotInitialized.selector);
54+
proverManager.evictProver(header);
55+
}
56+
57+
function test_CurrentPeriodIsVacant_claimProvingVacancy_shouldClosePeriod() public {
58+
_deposit(proverA, DEPOSIT_AMOUNT);
59+
vm.prank(proverA);
60+
proverManager.claimProvingVacancy(initialFee);
61+
62+
LibProvingPeriod.Period memory period = proverManager.getPeriod(proverManager.currentPeriodId());
63+
assertEq(period.end, vm.getBlockTimestamp(), "End timestamp set incorrectly");
64+
assertEq(period.deadline, period.end, "Proving deadline does not match end timestamp");
65+
}
66+
67+
function test_CurrentPeriodIsVacant_claimProvingVacancy_shouldLeaveOtherFieldsUnchanged() public {
68+
_deposit(proverA, DEPOSIT_AMOUNT);
69+
uint256 periodId = proverManager.currentPeriodId();
70+
LibProvingPeriod.Period memory periodBefore = proverManager.getPeriod(periodId);
71+
72+
vm.prank(proverA);
73+
proverManager.claimProvingVacancy(initialFee);
74+
75+
LibProvingPeriod.Period memory periodAfter = proverManager.getPeriod(periodId);
76+
77+
assertEq(periodBefore.prover, periodAfter.prover, "Prover changed");
78+
assertEq(periodBefore.stake, periodAfter.stake, "Stake changed");
79+
assertEq(periodBefore.fee, periodAfter.fee, "Fee changed");
80+
assertEq(periodBefore.delayedFeePercentage, periodAfter.delayedFeePercentage, "Delayed fee changed");
81+
assertEq(periodBefore.pastDeadline, false, "Period had missed deadline");
82+
assertEq(periodAfter.pastDeadline, false, "Period has missed deadline");
83+
}
84+
85+
function test_CurrentPeriodIsVacant_claimProvingVacancy_shouldDeductLivenessBond() public {
86+
_deposit(proverA, DEPOSIT_AMOUNT);
87+
uint256 balanceBefore = proverManager.balances(proverA);
88+
89+
vm.prank(proverA);
90+
proverManager.claimProvingVacancy(initialFee);
91+
92+
uint256 balanceAfter = proverManager.balances(proverA);
93+
assertEq(balanceAfter, balanceBefore - proverManager.livenessBond(), "Balance deducted incorrectly");
94+
}
95+
96+
function test_CurrentPeriodIsVacant_claimProvingVacancy_shouldInitializeNextPeriod() public {
97+
_deposit(proverA, DEPOSIT_AMOUNT);
98+
vm.prank(proverA);
99+
proverManager.claimProvingVacancy(initialFee);
100+
101+
LibProvingPeriod.Period memory period = proverManager.getPeriod(proverManager.currentPeriodId() + 1);
102+
assertEq(period.prover, proverA, "Prover set incorrectly");
103+
assertEq(period.stake, proverManager.livenessBond(), "Stake set incorrectly");
104+
assertEq(period.fee, initialFee, "Fee set incorrectly");
105+
assertEq(period.delayedFeePercentage, proverManager.delayedFeePercentage(), "Delayed fee set incorrectly");
106+
assertEq(period.end, 0, "Next period is closed");
107+
assertEq(period.deadline, 0, "Next period has deadline");
108+
assertEq(period.pastDeadline, false, "Next period has missed deadline");
109+
}
110+
111+
function test_CurrentPeriodIsVacant_claimProvingVacancy_shouldEmitEvent() public {
112+
_deposit(proverA, DEPOSIT_AMOUNT);
113+
uint256 nextPeriodId = proverManager.currentPeriodId() + 1;
114+
uint96 bond = proverManager.livenessBond();
115+
116+
vm.prank(proverA);
117+
vm.expectEmit();
118+
emit IProverManager.ProverVacancyClaimed(proverA, nextPeriodId, initialFee, bond);
119+
proverManager.claimProvingVacancy(initialFee);
120+
}
121+
122+
function test_CurrentPeriodIsVacant_claimProvingVacancy_shouldAllowZeroFee() public {
123+
_deposit(proverA, DEPOSIT_AMOUNT);
124+
vm.prank(proverA);
125+
proverManager.claimProvingVacancy(0);
126+
127+
LibProvingPeriod.Period memory period = proverManager.getPeriod(proverManager.currentPeriodId() + 1);
128+
assertEq(period.prover, proverA, "Prover set incorrectly");
129+
assertEq(period.fee, 0, "Fee set incorrectly");
130+
}
131+
}

test/ProverManager/PeriodScenario.t.sol

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {CurrentPeriodIsActiveTest} from "./CurrentPeriodIsActiveTest.t.sol";
77

88
import {CurrentPeriodIsOpenTest} from "./CurrentPeriodIsOpenTest.t.sol";
99
import {CurrentPeriodIsOverTest} from "./CurrentPeriodIsOverTest.t.sol";
10-
10+
import {CurrentPeriodIsVacant} from "./CurrentPeriodIsVacant.t.sol";
1111
import {InitialState} from "./InitialState.t.sol";
1212
import {InitialStateTest} from "./InitialStateTest.t.sol";
1313
import {NextPeriodHasBidTest} from "./NextPeriodHasBidTest.t.sol";
@@ -154,14 +154,14 @@ contract PeriodTwoIsActive_ERC20 is PeriodTwoIsActive, CurrentPeriodIsOpenTest,
154154
}
155155
}
156156

157-
contract PeriodTwoIsVacant_ETH is PeriodTwoIsVacant, ETHCurrency {
157+
contract PeriodTwoIsVacant_ETH is PeriodTwoIsVacant, CurrentPeriodIsVacant, ETHCurrency {
158158
function setUp() public virtual override(PeriodTwoIsVacant, InitialState) {
159159
PeriodTwoIsVacant.setUp();
160160
}
161161
}
162162

163-
contract PeriodTwoIsVacant_ERC20 is PeriodTwoIsVacant, ERC20Currency {
164-
function setUp() public virtual override(PeriodTwoIsVacant, ERC20Currency) {
163+
contract PeriodTwoIsVacant_ERC20 is PeriodTwoIsVacant, CurrentPeriodIsVacant, ERC20Currency {
164+
function setUp() public virtual override(PeriodTwoIsVacant, InitialState, ERC20Currency) {
165165
ERC20Currency.setUp();
166166
PeriodTwoIsVacant.setUp();
167167
}

0 commit comments

Comments
 (0)