55

For Ganache, there are severalsolutions.

What about Hardhat? They implemented their own local blockchain, Hardhat Network, which is different to Ganache.

askedAug 11, 2020 at 21:02
Paul Razvan Berg's user avatar
3
  • 1
    The buidlerevm page says it supports ganache'sevm_increaseTime and additionally they haveevm_setNextBlockTimestamp.CommentedAug 12, 2020 at 0:16
  • @Ismael your comment is a legitimate answer. Feel free to post it :)CommentedAug 12, 2020 at 9:43
  • I can't test right now, but I'll add an answer when I've more time.CommentedAug 12, 2020 at 21:12

6 Answers6

88

Using Hardhat Network Helpers

The easiest way to do this is to use the time helpers inHardhat Network Helpers.

Install them with:

npm install @nomicfoundation/hardhat-network-helpers

And then you can use them like this:

import { time } from "@nomicfoundation/hardhat-network-helpers";async function main() {  // advance time by one hour and mine a new block  await helpers.time.increase(3600);  // mine a new block with timestamp `newTimestamp`  await helpers.time.increaseTo(newTimestamp);  // set the timestamp of the next block but don't mine a new block  await helpers.time.setNextBlockTimestamp(newTimestamp);}main();

You can check the referencehere.

Using raw JSON-RPC calls

There are two relevant RPC methods here:evm_increaseTime andevm_setNextBlockTimestamp. In both cases, they affect the next block but don't mine one.

evm_increaseTime receives a number of seconds that will be added to the timestamp of the latest block.evm_setNextBlockTimestamp receives an absolute UNIX timestamp (again, in seconds), and so it's not affected by the current block.

Examples

evm_increaseTime

// suppose the current block has a timestamp of 01:00 PMawait network.provider.send("evm_increaseTime", [3600])await network.provider.send("evm_mine") // this one will have 02:00 PM as its timestamp

evm_setNextBlockTimestamp

await network.provider.send("evm_setNextBlockTimestamp", [1625097600])await network.provider.send("evm_mine") // this one will have 2021-07-01 12:00 AM as its timestamp, no matter what the previous block has

Keep in mind that Hardhat Network validates that the new timestamp is bigger than the previous one, so you can't sendany value.

answeredJan 29, 2021 at 22:16
Franco Victorio's user avatar
5
  • When using this with hardhat I got this issue: Error: Transaction reverted and Hardhat couldn't infer the reason. Please report this to help us improve Hardhat.CommentedMar 7, 2021 at 17:16
  • Did anyone face the same issue ?CommentedMar 7, 2021 at 17:16
  • @Franco this way also works: await network.provider.send("evm_mine", [timestampInSeconds]);CommentedOct 1, 2021 at 9:27
  • What's the difference between usingethers.provider rather thannetwork.provider? I used both and they both seem to work.CommentedJan 31, 2022 at 19:51
  • For low-level JSON-RPC calls like these, they are the same.network.provider is "just" an EIP-1193 provider object.ethers.provider also implements that interface, but it has more functionality. I wrote about that at length here if you're interested:hackmd.io/@fvictorio/hardhat-networks-and-providersCommentedFeb 2, 2022 at 0:05
11

Anew update to Ganache has added a time parameter to theevm_mine command. Now the best way to move time is

await ethers.provider.send("evm_mine", [newTimestampInSeconds]);

It is better because you only make 1 RPC call instead of 2 in theaccepted solution.

Note that you can't move time backwards in Hardhat.

Pang's user avatar
Pang
3011 gold badge3 silver badges7 bronze badges
answeredNov 3, 2021 at 17:11
Arjun Nemani's user avatar
3
  • Thanks for your answer! But this question was about Hardhat, not Ganache.CommentedNov 3, 2021 at 20:06
  • 2
    My answer was written for hardhat in mind, I linked to the ganache update since hardhat docs forevm_mine just saysame as ganache which lead me to believe hardhat reuses some parts of ganache-cli. I am using the solution in my tests with hardhat, and they work perfectly :)hardhat.org/hardhat-network/reference/…CommentedNov 5, 2021 at 8:49
  • 1
    github.com/trufflesuite/ganache/pull/13/files Found the ticket from the active ganache repoCommentedDec 16, 2021 at 20:27
8
const { expect } = require("chai");const { ethers } = require('hardhat');const sevenDays = 7 * 24 * 60 * 60;const blockNumBefore = await ethers.provider.getBlockNumber();const blockBefore = await ethers.provider.getBlock(blockNumBefore);const timestampBefore = blockBefore.timestamp;await ethers.provider.send('evm_increaseTime', [sevenDays]);await ethers.provider.send('evm_mine');const blockNumAfter = await ethers.provider.getBlockNumber();const blockAfter = await ethers.provider.getBlock(blockNumAfter);const timestampAfter = blockAfter.timestamp;expect(blockNumAfter).to.be.equal(blockNumBefore + 1);expect(timestampAfter).to.be.equal(timestampBefore + sevenDays);
answeredAug 12, 2021 at 5:26
luckyyang's user avatar
1
  • this worked for me!CommentedMar 31, 2022 at 18:21
6

For any future wanderers:

Hardhat added a network-helpers library with convenient JS interface:

Among other things, there are functions to change network time:https://hardhat.org/hardhat-network-helpers/docs/reference#time-helpers.

Some examples copied from the reference:

// advance time by one hour and mine a new blockawait helpers.time.increase(3600);// advance time to specific timestamp and mine a new blockawait helpers.time.increaseTo(newTimestamp);// set the timestamp of the next block but don't mine a new blockawait helpers.time.setNextBlockTimestamp(newTimestamp);
answeredJul 19, 2022 at 10:13
Vsevolod's user avatar
3

What I've been using with typescript and hardhat:

import { ethers, waffle } from 'hardhat';const time = now + 86400await ethers.provider.send('evm_setNextBlockTimestamp', [now]); await ethers.provider.send('evm_mine');
answeredMay 12, 2021 at 9:22
Anton Cheng's user avatar
3
  • This doesn't seem to work for me in hardhat currently, if I log out the result of the first call, I get the new time I'm trying to set to, but further assertions down the line don't seem to respect that new time. Also, I had to add an empty array after theevm_mine argument since its required.Logging out thee result of theevm_mine call is 0x0CommentedMay 26, 2021 at 19:02
  • 1
    Is there a simple way to getnow instead of(await ethers.provider.getBlock(await ethers.provider.getBlockNumber())).timestamp?CommentedDec 18, 2021 at 9:22
  • @Martian just use "latest" instead of fetching the last block number. But other than that change, this is about as short as it gets.CommentedJan 24, 2022 at 20:54
-1

Adding to Franco's answer, there is a plugin that abstracts some of the complexities of handling time directly.

You can look its documentation inhttps://www.npmjs.com/package/@atixlabs/hardhat-time-n-mine

answeredAug 23, 2021 at 14:31
Gonzalo Petraglia's user avatar
3
  • Returns404. Is it moved to some different place? @GonzaloPetragliaCommentedDec 7, 2021 at 8:29
  • Fixed the link while thisPR is openCommentedJan 3, 2022 at 19:05
  • This is why answers w/ no content and just links are discouragedCommentedSep 9, 2022 at 2:17

Your Answer

Sign up orlog in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

By clicking “Post Your Answer”, you agree to ourterms of service and acknowledge you have read ourprivacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.