🤔 Got questions? Schedule an office hours session.
Virtual TestNets
Develop
Working with timestamps

Working with time on Virtual TestNets

For certain types of tests it’s useful to skip through time. This is possible by relying on 2 Admin RPC methods available on Virtual TestNets: evm_setNextBlockTimestamp and evm_setNextBlockTimestamp.

Getting the correct time

During execution of a transaction or eth_call accesses block.timestamp within a contract, the value will depend on whether the target block (latest or pending) block:

  • For pending block: block.timestamp == time.now() + adjustment_offset. This represents the current time adjusted by the time-adjustment methods.
  • For latest block: block.timestamp == latest_block.timestamp. This is the timestamp of the most recently mined block.

The adjustment_offset comes from time-adjustment methods:

  1. evm_setNextBlockTimestamp: Skips time to the timestamp for the next block: adjustment_offset = timestamp - time.now().

  2. evm_increaseTime: Advances time by a relative amount. adjustment_offset += increase_value

Examples

Increase time by an offset

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"

Set timestamp for pending block

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"