5/5
_Follow along with this video:_ --- ### vm.roll and vm.wrap In lesson 19, we skipped testing one of the four steps of `enterRaffle`: ```2. We check if the `RaffleState` is `OPEN`;``` To rephrase it, a user should not be able to enter if the `RaffleState` is `CALCULATING`. ```solidity function testDontAllowPlayersToEnterWhileRaffleIsCalculating() public { // Arrange vm.prank(PLAYER); raffle.enterRaffle{value: entranceFee}(); vm.warp(block.timestamp + interval + 1); vm.roll(block.number + 1); raffle.performUpkeep(""); // Act / Assert vm.expectRevert(Raffle.Raffle__RaffleNotOpen.selector); vm.prank(PLAYER); raffle.enterRaffle{value: entranceFee}(); } ``` We start our test exactly like the others. We `prank` the `PLAYER` and we call `enterRaffle` specifying the appropriate `msg.value` so our user registers properly. The following step involves calling two new cheatcodes: - [vm.warp](https://book.getfoundry.sh/cheatcodes/warp?highlight=warp#warp) which sets the `block.timestamp`; - [vm.roll](https://book.getfoundry.sh/cheatcodes/roll?highlight=roll#roll) which sets the `block.number`; Even though we don't use them here it's important to know that there are other `block.timestamp` manipulation cheatcodes that you'll encounter in your development/security path. - [skip](https://book.getfoundry.sh/reference/forge-std/skip) which skips forward the `block.timestamp` by the specified number of seconds; - [rewind](https://book.getfoundry.sh/reference/forge-std/rewind) which is the antonym of `skip`, i.e. it rewinds the `block.timestamp` by a specified number of seconds; So we use the `vm.warp` and `vm.roll` to push the `block.timestamp` and `block.number` in the future. We call `performUpkeep` to change the `RaffleState` to `CALCULATING`. Following that we call the `vm.expectRevert` cheatcode, expecting to revert the next call with the `Raffle__RaffleNotOpen` error. The last step is pranking the `PLAYER` again and calling `enterRaffle` to check if it reverts as it should. Run the test using `forge test --mt testDontAllowPlayersToEnterWhileRaffleIsCalculating` ``` Ran 1 test for test/unit/RaffleTest.t.sol:RaffleTest [FAIL. Reason: InvalidConsumer()] testDontAllowPlayersToEnterWhileRaffleIsCalculating() (gas: 101956) Suite result: FAILED. 0 passed; 1 failed; 0 skipped; finished in 2.70ms (206.20µs CPU time) ``` OH NO! `[FAIL. Reason: InvalidConsumer()]` ... we gonna fix this one soon, I promise!
Follow along with this video:
In lesson 19, we skipped testing one of the four steps of enterRaffle
: 2. We check if the `RaffleState` is `OPEN`;
To rephrase it, a user should not be able to enter if the RaffleState
is CALCULATING
.
We start our test exactly like the others. We prank
the PLAYER
and we call enterRaffle
specifying the appropriate msg.value
so our user registers properly.
The following step involves calling two new cheatcodes:
Even though we don't use them here it's important to know that there are other block.timestamp
manipulation cheatcodes that you'll encounter in your development/security path.
skip which skips forward the block.timestamp
by the specified number of seconds;
rewind which is the antonym of skip
, i.e. it rewinds the block.timestamp
by a specified number of seconds;
So we use the vm.warp
and vm.roll
to push the block.timestamp
and block.number
in the future.
We call performUpkeep
to change the RaffleState
to CALCULATING
.
Following that we call the vm.expectRevert
cheatcode, expecting to revert the next call with the Raffle__RaffleNotOpen
error.
The last step is pranking the PLAYER
again and calling enterRaffle
to check if it reverts as it should.
Run the test using forge test --mt testDontAllowPlayersToEnterWhileRaffleIsCalculating
OH NO! [FAIL. Reason: InvalidConsumer()]
... we gonna fix this one soon, I promise!
A cheatcode-driven guide to Testing State Transitions with vm.warp and vm.roll - Learn to manipulate block time and number using `vm.warp` and `vm.roll` in Foundry tests. Verify contract behavior in specific states, like preventing actions during a `CALCULATING` phase, using `vm.expectRevert`.
Previous lesson
Previous
Next lesson
Next
Give us feedback
Course Overview
About the course
Foundryup, Foundry Forge, and Anvil
Blockchain Oracles
How to create local Blockchain testnets
How to verify a smart contract
How to write and run smart contract tests
Security researcher
$49,999 - $120,000 (avg. salary)
Smart Contract Engineer
$100,000 - $150,000 (avg. salary)
Web3 developer
$60,000 - $150,000 (avg. salary)
Web3 Developer Relations
$85,000 - $125,000 (avg. salary)
Smart Contract Auditor
$100,000 - $200,000 (avg. salary)
Guest lecturers:
Last updated on June 10, 2025
Duration: 2h 55min
Duration: 2h 56min
Duration: 26min
Duration: 5h 22min
Course Overview
About the course
Foundryup, Foundry Forge, and Anvil
Blockchain Oracles
How to create local Blockchain testnets
How to verify a smart contract
How to write and run smart contract tests
Security researcher
$49,999 - $120,000 (avg. salary)
Smart Contract Engineer
$100,000 - $150,000 (avg. salary)
Web3 developer
$60,000 - $150,000 (avg. salary)
Web3 Developer Relations
$85,000 - $125,000 (avg. salary)
Smart Contract Auditor
$100,000 - $200,000 (avg. salary)
Guest lecturers:
Last updated on June 10, 2025