コード例 #1
0
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)
コード例 #2
0
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"])
コード例 #3
0
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
コード例 #4
0
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
コード例 #5
0
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)
コード例 #6
0
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)
コード例 #7
0
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"])