From 8f0e20c30dc893785dad5add5dccd928a0101469 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Thu, 10 Oct 2024 06:22:10 +0200 Subject: [PATCH] Adds more logging and makes testing earliest block boundary more reliable --- codex/contracts/market.nim | 21 ++++++++++++--------- codex/market.nim | 2 +- tests/contracts/testMarket.nim | 18 ++++++++---------- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/codex/contracts/market.nim b/codex/contracts/market.nim index 7ff13ba6..ebff0aa2 100644 --- a/codex/contracts/market.nim +++ b/codex/contracts/market.nim @@ -1,7 +1,4 @@ -# import std/sequtils import std/strutils -import std/strformat -# import std/sugar import pkg/ethers import pkg/upraises import pkg/questionable @@ -461,14 +458,17 @@ proc binarySearchBlockNumberForEpoch*(provider: Provider, debug "[binarySearchBlockNumberForEpoch]:", low = low, high = high while low <= high: - let mid = (low + high) div 2.u256 + if low == 0 and high == 0: + return low + let mid = (low + high) div 2 + debug "[binarySearchBlockNumberForEpoch]:", low = low, mid = mid, high = high let (midBlockNumber, midBlockTimestamp) = await provider.blockNumberAndTimestamp(BlockTag.init(mid)) if midBlockTimestamp < epochTime: - low = mid + 1.u256 + low = mid + 1 elif midBlockTimestamp > epochTime: - high = mid - 1.u256 + high = mid - 1 else: return midBlockNumber # NOTICE that by how the binaty search is implemented, when it finishes @@ -477,10 +477,11 @@ proc binarySearchBlockNumberForEpoch*(provider: Provider, await provider.binarySearchFindClosestBlock( epochTime.truncate(int), low=high, high=low) -proc blockNumberForEpoch*(provider: Provider, epochTime: int64): Future[UInt256] - {.async.} = +proc blockNumberForEpoch*(provider: Provider, + epochTime: SecondsSince1970): Future[UInt256] {.async.} = let avgBlockTime = await provider.estimateAverageBlockTime() debug "[blockNumberForEpoch]:", avgBlockTime = avgBlockTime + debug "[blockNumberForEpoch]:", epochTime = epochTime let epochTimeUInt256 = epochTime.u256 let (latestBlockNumber, latestBlockTimestamp) = await provider.blockNumberAndTimestamp(BlockTag.latest) @@ -495,6 +496,8 @@ proc blockNumberForEpoch*(provider: Provider, epochTime: int64): Future[UInt256] let timeDiff = latestBlockTimestamp - epochTimeUInt256 let blockDiff = timeDiff div avgBlockTime + debug "[blockNumberForEpoch]:", timeDiff = timeDiff, blockDiff = blockDiff + if blockDiff >= latestBlockNumber - earliestBlockNumber: return earliestBlockNumber @@ -522,7 +525,7 @@ method queryPastSlotFilledEvents*( method queryPastSlotFilledEvents*( market: OnChainMarket, - fromTime: int64): Future[seq[SlotFilled]] {.async.} = + fromTime: SecondsSince1970): Future[seq[SlotFilled]] {.async.} = convertEthersError: let fromBlock = diff --git a/codex/market.nim b/codex/market.nim index e3124984..b9a417b7 100644 --- a/codex/market.nim +++ b/codex/market.nim @@ -265,5 +265,5 @@ method queryPastStorageRequestedEvents*( method queryPastSlotFilledEvents*( market: Market, - fromTime: int64): Future[seq[SlotFilled]] {.base, async.} = + fromTime: SecondsSince1970): Future[seq[SlotFilled]] {.base, async.} = raiseAssert("not implemented") diff --git a/tests/contracts/testMarket.nim b/tests/contracts/testMarket.nim index 2595a403..fa93c378 100644 --- a/tests/contracts/testMarket.nim +++ b/tests/contracts/testMarket.nim @@ -464,7 +464,7 @@ ethersuite "On-Chain Market": await market.fillSlot(request.id, 2.u256, proof, request.ask.collateral) let events = await market.queryPastSlotFilledEvents( - fromTime = fromTime.truncate(int64)) + fromTime = fromTime.truncate(SecondsSince1970)) check events == @[ SlotFilled(requestId: request.id, slotIndex: 1.u256), @@ -484,7 +484,7 @@ ethersuite "On-Chain Market": await ethProvider.blockNumberAndTimestamp(BlockTag.latest) let events = await market.queryPastSlotFilledEvents( - fromTime = fromTime.truncate(int64)) + fromTime = fromTime.truncate(SecondsSince1970)) check events.len == 0 @@ -508,8 +508,10 @@ ethersuite "On-Chain Market": test "blockNumberForEpoch returns the earliest block when retained history " & "is shorter than the given epoch time": - # create predictable conditions for computing average block time - let averageBlockTime = 10.u256 + # create predictable conditions + # we keep minimal resultion of 1s so that we are sure that + # we will land before the earliest (genesis in our case) block + let averageBlockTime = 1.u256 await ethProvider.mineNBlocks(1) await ethProvider.advanceTime(averageBlockTime) let (earliestBlockNumber, earliestTimestamp) = @@ -518,12 +520,8 @@ ethersuite "On-Chain Market": let fromTime = earliestTimestamp - 1 let actual = await ethProvider.blockNumberForEpoch( - fromTime.truncate(int64)) + fromTime.truncate(SecondsSince1970)) - # Notice this could fail in a network where "earliest" block is - # not the genesis block - we run the tests agains local network - # so we know the earliest block is the same as genesis block - # earliestBlockNumber is 0.u256 in our case. check actual == earliestBlockNumber test "blockNumberForEpoch finds closest blockNumber for given epoch time": @@ -609,7 +607,7 @@ ethersuite "On-Chain Market": debug "Validating", epochTime = epochTime, expectedBlockNumber = expectedBlockNumber let actualBlockNumber = await ethProvider.blockNumberForEpoch( - epochTime.truncate(int64)) + epochTime.truncate(SecondsSince1970)) check actualBlockNumber == expectedBlockNumber test "past event query can specify negative `blocksAgo` parameter":