async def record_trade(contract, event_name, event): block_number = coerce_to_int(event["blockNumber"]) log_index = coerce_to_int(event["logIndex"]) date = datetime.fromtimestamp(block_timestamp(App().web3, event["blockNumber"]), tz=None) insert_args = (block_number, Web3.toBytes(hexstr=event["transactionHash"]), log_index, Web3.toBytes(hexstr=event["args"]["tokenGive"]), event["args"]["amountGive"], Web3.toBytes(hexstr=event["args"]["tokenGet"]), event["args"]["amountGet"], Web3.toBytes(hexstr=event["args"]["give"]), Web3.toBytes(hexstr=event["args"]["get"]), date) async with App().db.acquire_connection() as connection: insert_retval = await connection.execute(INSERT_TRADE_STMT, *insert_args) _, _, did_insert = parse_insert_status(insert_retval) if did_insert: logger.debug("recorded trade txid=%s, logidx=%i", event["transactionHash"], log_index) return bool(did_insert)
async def process_trade(contract, event_name, event): logger.debug("received trade txid=%s", event["transactionHash"]) did_insert = await record_trade(contract, event_name, event) if did_insert: logger.info("recorded trade txid=%s, logidx=%i", event["transactionHash"], coerce_to_int(event["logIndex"])) ## # Dispatch a background job to update potentially affected orders # # Potentially affected orders include orders by the maker and the taker, # on both tokenGive and tokenGet sides of the trade. block_number = coerce_to_int(event["blockNumber"]) trade_parties = set([ # Order maker side is recorded in `get` event["args"]["get"], # Taker side is recorded in `give` event["args"]["give"], ]) traded_tokens = set([ event["args"]["tokenGet"], event["args"]["tokenGive"], ]) for trade_party in trade_parties: update_orders_by_maker_and_tokens(trade_party, traded_tokens, block_number) else: logger.debug("duplicate trade txid=%s", event["transactionHash"])
async def record_deposit(contract, event_name, event): did_insert = await record_transfer("DEPOSIT", event) if did_insert: enqueue_order_update_for_transfer(event) logger.info("recorded deposit txid=%s, logidx=%i", event["transactionHash"], coerce_to_int(event["logIndex"])) return did_insert
async def record_withdraw(contract, event_name, event): did_insert = await record_transfer("WITHDRAW", event) if did_insert: enqueue_order_update_for_transfer(event) logger.info("recorded withdraw txid=%s, logidx=%i", event["transactionHash"], coerce_to_int(event["logIndex"])) return did_insert
async def record_transfer(transfer_direction, event): block_number = coerce_to_int(event["blockNumber"]) log_index = coerce_to_int(event["logIndex"]) date = datetime.fromtimestamp(block_timestamp(App().web3, block_number), tz=None) insert_args = (block_number, Web3.toBytes(hexstr=event["transactionHash"]), log_index, transfer_direction, Web3.toBytes(hexstr=event["args"]["token"]), Web3.toBytes(hexstr=event["args"]["user"]), event["args"]["amount"], event["args"]["balance"], date) async with App().db.acquire_connection() as connection: insert_retval = await connection.execute(INSERT_TRANSFER_STMT, *insert_args) _, _, did_insert = parse_insert_status(insert_retval) return bool(did_insert)
def enqueue_order_update_for_transfer(event): """ Enqueues a task to update orders' fill / available volume when a Deposit/Withdraw event occurs. """ user_addr = event["args"]["user"] token_addr = event["args"]["token"] block_number = coerce_to_int(event["blockNumber"]) update_orders_by_maker_and_token(user_addr, token_addr, block_number)
async def process_trade(contract, event_name, event): logger.debug("received trade txid=%s", event["transactionHash"]) did_insert = await record_trade(contract, event_name, event) if did_insert: logger.info("recorded trade txid=%s, logidx=%i", event["transactionHash"], coerce_to_int(event["logIndex"])) ## # Dispatch a background job to update potentially affected orders block_number = coerce_to_int(event["blockNumber"]) # Order maker side is recorded in `get` order_maker = event["args"]["get"] if event["args"]["tokenGive"] != ZERO_ADDR: coin_addr = event["args"]["tokenGive"] else: coin_addr = event["args"]["tokenGet"] update_orders_by_maker_and_token(order_maker, coin_addr, block_number) else: logger.debug("duplicate trade txid=%s", event["transactionHash"])