0/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 September 19, 2025
Duration: 2h 58min
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 September 19, 2025