mirror of
https://github.com/status-im/nim-dagger.git
synced 2025-01-28 15:36:37 +00:00
df6b9c6760
* Workaround for Hardhat timestamp bug Likely due to a Hardhat bug in which the callbacks for subscription events are called and awaited before updating its local understanding of the last block time, Hardhat will report a block time in the `newHeads` event that is generally 1 second before the time reported from `getLatestBlock.timestamp`. This was causing issues with the OnChainClock's offset and therefore the `now()` used by the `OnChainClock` would sometimes be off by a second (or more), causing tests to fail. This commit introduce a `codex_use_hardhat` compilation flag, that when set, will always get the latest block timestamp from Hardhat via the `getLatestBlock.timestamp` RPC call for `OnChainClock.now` calls. Otherwise, the last block timestamp reported in the `newHeads` event will be used. Update the docker dist tests compilation flag for simulated proof failures (it was not correct), and explicitly add the `codex_use_hardhat=false` for clarity. * enable simulated proof failures for coverage * comment out failing test on linux -- will be replaced * bump codex contracts eth * add back clock offset for non-hardhat cases * bump codex-contracts-eth increases pointer by 67 blocks each period increase * Add `codex_use_hardhat` flag to coverage tests
47 lines
1.4 KiB
Nim
47 lines
1.4 KiB
Nim
import std/times
|
|
import pkg/chronos
|
|
import codex/contracts/clock
|
|
import codex/utils/json
|
|
import ../ethertest
|
|
|
|
ethersuite "On-Chain Clock":
|
|
var clock: OnChainClock
|
|
|
|
setup:
|
|
clock = OnChainClock.new(ethProvider)
|
|
await clock.start()
|
|
|
|
teardown:
|
|
await clock.stop()
|
|
|
|
test "returns the current time of the EVM":
|
|
let latestBlock = (!await ethProvider.getBlock(BlockTag.latest))
|
|
let timestamp = latestBlock.timestamp.truncate(int64)
|
|
check clock.now() == timestamp
|
|
|
|
test "updates time with timestamp of new blocks":
|
|
let future = (getTime() + 42.years).toUnix
|
|
discard await ethProvider.send("evm_setNextBlockTimestamp", @[%future])
|
|
discard await ethProvider.send("evm_mine")
|
|
check clock.now() == future
|
|
|
|
test "can wait until a certain time is reached by the chain":
|
|
let future = clock.now() + 42 # seconds
|
|
let waiting = clock.waitUntil(future)
|
|
discard await ethProvider.send("evm_setNextBlockTimestamp", @[%future])
|
|
discard await ethProvider.send("evm_mine")
|
|
check await waiting.withTimeout(chronos.milliseconds(100))
|
|
|
|
test "can wait until a certain time is reached by the wall-clock":
|
|
let future = clock.now() + 1 # seconds
|
|
let waiting = clock.waitUntil(future)
|
|
check await waiting.withTimeout(chronos.seconds(2))
|
|
|
|
test "handles starting multiple times":
|
|
await clock.start()
|
|
await clock.start()
|
|
|
|
test "handles stopping multiple times":
|
|
await clock.stop()
|
|
await clock.stop()
|