diff --git a/requirements.txt b/requirements.txt index facc3d7..edda26c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,5 +15,6 @@ async-lru eth-bloom python-dateutil eth_abi +eth_utils pdpyras # pagerduty numpy diff --git a/src/dexorder/blocks.py b/src/dexorder/blocks.py index 6cd228a..c2b723c 100644 --- a/src/dexorder/blocks.py +++ b/src/dexorder/blocks.py @@ -149,7 +149,10 @@ def promotion_height(chain: Blockchain=None, latest_height: int=None): if chain is None: chain = current_chain.get() if latest_height is None: - latest_height = latest_block.get(chain.id).height + block = latest_block.get(chain.id) + if block is None: + return 0 + latest_height = block.height if latest_height is None: return 0 confirm_offset = config.confirms if config.confirms is not None else chain.confirms diff --git a/src/dexorder/configuration/schema.py b/src/dexorder/configuration/schema.py index fc56f3f..9feecb6 100644 --- a/src/dexorder/configuration/schema.py +++ b/src/dexorder/configuration/schema.py @@ -26,7 +26,7 @@ class Config: concurrent_rpc_connections: int = 4 parallel_logevent_queries: bool = True polling: float = 0 # seconds between queries for a new block. 0 disables polling and uses a websocket subscription on ws_url instead - backfill: int = 0 # if not 0, then runner will initialize an empty database by backfilling from the given block height + backfill: int = 0 # if not 0, then runner will initialize an empty database by backfilling from the given block height. Use negative numbers to indicate a number of blocks before the present. account: Optional[str] = None # may be a private key or an account alias accounts: Optional[dict[str,str]] = field(default_factory=dict) # account aliases diff --git a/src/dexorder/runner.py b/src/dexorder/runner.py index d1b4685..1e9a352 100644 --- a/src/dexorder/runner.py +++ b/src/dexorder/runner.py @@ -17,6 +17,7 @@ from dexorder.blockstate import BlockState, current_blockstate from dexorder.blockstate.branch import Branch from dexorder.blockstate.diff import DiffEntryItem from dexorder.blockstate.fork import current_fork, Fork +from dexorder.contract.dexorder import get_dexorder_contract, get_factory_contract, get_vault_init_code_hash from dexorder.progressor import BlockProgressor from dexorder.transactions import create_and_send_transactions from dexorder.util import hexstr, hexbytes @@ -217,9 +218,29 @@ class BlockStateRunner(BlockProgressor): w3 = current_w3.get() chain = current_chain.get() assert chain.id == await w3.eth.chain_id + + log.info(f''' + Chain {chain} + Factory {get_factory_contract().address} + Dexorder {get_dexorder_contract().address} + VICH {hexstr(get_vault_init_code_hash())}''') + + # backfill + if self.state is None and config.backfill != 0: + if config.backfill > 0: + height = config.backfill + else: + cur = await w3.eth.get_block_number() + height = cur + config.backfill if config.backfill < 0 else cur + block = await get_block(height) + self.set_latest_block(block) + self.new_head_event.set() + log.info(f'Backfilling from block {block}') + + # main run loop while self.running: try: - await asyncio.wait_for(self.new_head_event.wait(), timeout=1) # todo configure + await asyncio.wait_for(self.new_head_event.wait(), timeout=1) except TimeoutError: # DISABLED. See note on handle_time_tick() # if fork is not None: