Перейти к основному содержанию
Для определённых типов тестов удобно перепрыгивать во времени. Это возможно за счёт двух методов Admin RPC, доступных в Virtual Environments: evm_setNextBlockTimestamp и evm_setNextBlockTimestamp.

Получение правильного времени

Во время выполнения транзакции или eth_call при обращении к block.timestamp внутри контракта значение будет зависеть от того, целевой ли блок latest или pending:
  • Для блока pending: block.timestamp == time.now() + adjustment_offset. Это текущее время, скорректированное методами настройки времени.
  • Для блока latest: block.timestamp == latest_block.timestamp. Это временная метка самого последнего майнинга блока.
adjustment_offset формируется методами настройки времени:
  1. evm_setNextBlockTimestamp: Перепрыгивает время до временной метки следующего блока: adjustment_offset = timestamp - time.now().
  2. evm_increaseTime: Продвигает время на относительную величину. adjustment_offset += increase_value

Примеры

Увеличение времени на смещение

showLineNumbers
VIRTUAL_TESTNET_RPC=https://YOUR-RPC-URL-HERE
curl -s -X POST \
  -H "Content-Type: application/json" \
  --data '{
    "jsonrpc": "2.0",
    "method": "evm_increaseTime",
    "params": ["0xe10"],
    "id": 2
  }' "$VIRTUAL_TESTNET_RPC"

Установка временной метки для pending-блока

showLineNumbers
VIRTUAL_TESTNET_RPC=https://YOUR-RPC-URL-HERE

# Get the current date in Unix timestamp format
current_date=$(date +%s)

# Use evm_setTime to set the block time to today (current timestamp)
curl -s -X POST \
  -H "Content-Type: application/json" \
  --data '{
    "jsonrpc": "2.0",
    "method": "evm_setNextBlockTimestamp",
    "params": ["'"$current_date"'"],
    "id": 3
  }' "$VIRTUAL_TESTNET_RPC"