По мотивам обсуждения в чате зафиксирую полезные команды для evm в hardhat и не только (полезно в тестах).
Не забудьте сделать сначала:
import { network, ethers } from 'hardhat';*
await network.provider.send("evm_increaseTime", [timeInSeconds]); - поставит метку времени для следующего блока на значение "текущая метка времени + timeInSeconds". Обратите внимание, что майнинг следующего блока не произойдёт автоматически, то есть грубо говоря само по себе время не перескочит. Впрочем, подобная форма записи должна работать и для ethers тоже, то есть
ethers.provider.send. Для того, чтобы сделать майнинг вам нужен...
*
await network.provider.send('evm_mine'); - сделает майнинг пустого блока. Вот у него уже будет новое время, если перед evm_mine вы говорили evm_increaseTime. Но можно сделать и проще...
*
await network.provider.send('evm_mine', [newTimestamp]); - сразу сделать майнинг нового блока с новой меткой времени. Обратите внимание, что нужно передавать именно новую метку, а не просто кол-во секунд, на которое вы хотите увеличить время. Поэтому можно подойти подход вида
const blockNumBefore = await ethers.provider.getBlockNumber();
const blockBefore = await ethers.provider.getBlock(blockNumBefore);
await network.provider.send('evm_mine', [blockBefore.timestamp + 1200]); // увеличиваем на 1200 секунд
*
await network.provider.send("hardhat_reset") - сбросит локальный блокчейн. То есть сбросит совсем: текущий блок будет опять нулевым, время вернётся к текущему, данные потеряются. Можно засунуть в
beforeEach, чтобы перед каждым тестом получать девственно чистый блокчейн (впрочем, если в beforeEach вы делаете заново деплой, то контракты у вас и так будут свежие).
Отмотать время назад (типа decrease time), увы, не получится.