mirror of
https://github.com/status-im/nim-dagger.git
synced 2025-02-28 14:20:36 +00:00
* chore(deps): bump ethers to propagate cancellations Ethers was swallowing canellations and turning them into EthersErrors, which was causing the sales statemachine to error when it should have been simply cancelling the current state's run. Hopefully fixes the intermittently failing marketplace integration test. * Add missing errors in async raises pragma * bump to version of ethers that supports cancellations --------- Co-authored-by: Arnaud <arnaud@status.im>
83 lines
2.6 KiB
Nim
83 lines
2.6 KiB
Nim
import std/strutils
|
|
import std/tables
|
|
|
|
import pkg/ethers/provider
|
|
from codex/clock import SecondsSince1970
|
|
|
|
export provider.Block
|
|
|
|
type MockProvider* = ref object of Provider
|
|
blocks: OrderedTableRef[int, Block]
|
|
earliest: ?int
|
|
latest: ?int
|
|
|
|
method getBlock*(
|
|
provider: MockProvider, tag: BlockTag
|
|
): Future[?Block] {.async: (raises: [ProviderError, CancelledError]).} =
|
|
try:
|
|
if tag == BlockTag.latest:
|
|
if latestBlock =? provider.latest:
|
|
if provider.blocks.hasKey(latestBlock):
|
|
return provider.blocks[latestBlock].some
|
|
elif tag == BlockTag.earliest:
|
|
if earliestBlock =? provider.earliest:
|
|
if provider.blocks.hasKey(earliestBlock):
|
|
return provider.blocks[earliestBlock].some
|
|
elif tag == BlockTag.pending:
|
|
raiseAssert "MockProvider does not yet support BlockTag.pending"
|
|
else:
|
|
let blockNumber = parseHexInt($tag)
|
|
if provider.blocks.hasKey(blockNumber):
|
|
return provider.blocks[blockNumber].some
|
|
return Block.none
|
|
except:
|
|
return Block.none
|
|
|
|
proc updateEarliestAndLatest(provider: MockProvider, blockNumber: int) =
|
|
if provider.earliest.isNone:
|
|
provider.earliest = blockNumber.some
|
|
provider.latest = blockNumber.some
|
|
|
|
proc addBlocks*(provider: MockProvider, blocks: OrderedTableRef[int, Block]) =
|
|
for number, blk in blocks.pairs:
|
|
if provider.blocks.hasKey(number):
|
|
continue
|
|
provider.updateEarliestAndLatest(number)
|
|
provider.blocks[number] = blk
|
|
|
|
proc addBlock*(provider: MockProvider, number: int, blk: Block) =
|
|
if not provider.blocks.hasKey(number):
|
|
provider.updateEarliestAndLatest(number)
|
|
provider.blocks[number] = blk
|
|
|
|
proc newMockProvider*(): MockProvider =
|
|
MockProvider(
|
|
blocks: newOrderedTable[int, Block](), earliest: int.none, latest: int.none
|
|
)
|
|
|
|
proc newMockProvider*(blocks: OrderedTableRef[int, Block]): MockProvider =
|
|
let provider = newMockProvider()
|
|
provider.addBlocks(blocks)
|
|
provider
|
|
|
|
proc newMockProvider*(
|
|
numberOfBlocks: int,
|
|
earliestBlockNumber: int,
|
|
earliestBlockTimestamp: SecondsSince1970,
|
|
timeIntervalBetweenBlocks: SecondsSince1970,
|
|
): MockProvider =
|
|
var blocks = newOrderedTable[int, provider.Block]()
|
|
var blockNumber = earliestBlockNumber
|
|
var blockTime = earliestBlockTimestamp
|
|
for i in 0 ..< numberOfBlocks:
|
|
blocks[blockNumber] = provider.Block(
|
|
number: blockNumber.u256.some, timestamp: blockTime.u256, hash: BlockHash.none
|
|
)
|
|
inc blockNumber
|
|
inc blockTime, timeIntervalBetweenBlocks.int
|
|
MockProvider(
|
|
blocks: blocks,
|
|
earliest: earliestBlockNumber.some,
|
|
latest: (earliestBlockNumber + numberOfBlocks - 1).some,
|
|
)
|