Beispiel #1
0
def _decode_logs(logs: List) -> Union["EventDict", List[None]]:
    if not logs:
        return []

    idx = 0
    events: List = []
    while True:
        address = logs[idx]["address"]
        try:
            new_idx = logs.index(
                next(i for i in logs[idx:] if i["address"] != address))
            log_slice = logs[idx:new_idx]
            idx = new_idx
        except StopIteration:
            log_slice = logs[idx:]

        topics_map = _deployment_topics.get(address, _topics)
        events.extend(
            eth_event.decode_logs(log_slice, topics_map, allow_undecoded=True))

        if log_slice[-1] == logs[-1]:
            break

    events = [format_event(i) for i in events]
    return EventDict(events)
Beispiel #2
0
def _decode_logs(logs: List, contracts: Optional[Dict] = None) -> EventDict:
    if not logs:
        return EventDict()

    idx = 0
    events: List = []
    while True:
        address = logs[idx]["address"]
        try:
            new_idx = logs.index(next(i for i in logs[idx:] if i["address"] != address))
            log_slice = logs[idx:new_idx]
            idx = new_idx
        except StopIteration:
            log_slice = logs[idx:]

        topics_map = _deployment_topics.get(address, _topics)
        for item in log_slice:
            if contracts and contracts[item.address]:
                note = _decode_ds_note(item, contracts[item.address])
                if note:
                    events.append(note)
                    continue
            try:
                events.extend(eth_event.decode_logs([item], topics_map, allow_undecoded=True))
            except EventError as exc:
                warnings.warn(f"{address}: {exc}")

        if log_slice[-1] == logs[-1]:
            break

    events = [format_event(i) for i in events]
    return EventDict(events)
Beispiel #3
0
def _decode_logs(logs: List) -> EventDict:
    if not logs:
        return EventDict()

    idx = 0
    events: List = []
    while True:
        address = logs[idx]["address"]
        try:
            new_idx = logs.index(
                next(i for i in logs[idx:] if i["address"] != address))
            log_slice = logs[idx:new_idx]
            idx = new_idx
        except StopIteration:
            log_slice = logs[idx:]

        topics_map = _deployment_topics.get(address, _topics)
        for item in log_slice:
            try:
                events.extend(
                    eth_event.decode_logs([item],
                                          topics_map,
                                          allow_undecoded=True))
            except EventError as exc:
                warnings.warn(str(exc))

        if log_slice[-1] == logs[-1]:
            break

    events = [format_event(i) for i in events]
    return EventDict(events)
Beispiel #4
0
def _decode_logs(logs: List) -> Union["EventDict", List[None]]:
    if not logs:
        return []
    events: List = []
    for value in logs:
        try:
            events += eth_event.decode_logs([value], _topics)
        except KeyError:
            pass
    events = [format_event(i) for i in events]
    return EventDict(events)
def decode_log(tx, contract, event_name):
    """
    Get transaction logs for specific event name
    :param tx: transaction object
    :param contract: Contract object
    :param event_name: name of the event
    :return: EventDict with the events parsed
    """
    topic_map = eth_event.get_topic_map(contract.abi)
    logs = eth_event.decode_logs(tx.logs, topic_map, True)
    events = list(filter(lambda tx_: tx_['name'] == event_name, logs))
    return EventDict([format_event(i) for i in events])[event_name]
Beispiel #6
0
def test_decode_logs_no_topic(anon_a_log, topic_map):
    logs = [anon_a_log]
    event = decode_logs(logs, topic_map, allow_undecoded=True)

    assert event == [
        {
            "name": None,
            "address": "0x3194cBDC3dbcd3E11a07892e7bA5c3394048Cc87",
            "data": "0x00000000000000000000000066ab6d9362d4f35596279692f0251db635165871",
            "topics": [],
            "decoded": False,
        }
    ]
Beispiel #7
0
 def _await_confirm(self, silent, callback):
     while True:
         tx = web3.eth.getTransaction(self.txid)
         if tx:
             break
         time.sleep(0.5)
     if not self.sender:
         self.sender = tx['from']
     self.__dict__.update({
         'receiver': tx['to'],
         'value': tx['value'],
         'gas_price': tx['gasPrice'],
         'gas_limit': tx['gas'],
         'input': tx['input'],
         'nonce': tx['nonce'],
     })
     if not tx['blockNumber'] and CONFIG['logging']['tx'] and not silent:
         print("Waiting for confirmation...")
     receipt = web3.eth.waitForTransactionReceipt(self.txid, None)
     self.__dict__.update({
         'block_number': receipt['blockNumber'],
         'txindex': receipt['transactionIndex'],
         'gas_used': receipt['gasUsed'],
         'contract_address': receipt['contractAddress'],
         'logs': receipt['logs'],
         'status': receipt['status']
     })
     try:
         self.events = eth_event.decode_logs(receipt['logs'], topics())
     except:
         pass
     if self.fn_name and config.ARGV['gas']:
         _profile_gas(self.fn_name, receipt['gasUsed'])
     if not silent:
         if CONFIG['logging']['tx'] >= 2:
             self.info()
         elif CONFIG['logging']['tx']:
             color.print_colors(
                 "{} confirmed {}- block: {}   gas used: {} ({:.2%})".
                 format(
                     self.fn_name or "Transaction",
                     "" if self.status else "({0[error]}{1}{0}) ".format(
                         color, self.revert_msg or "reverted"),
                     self.block_number, self.gas_used,
                     self.gas_used / self.gas_limit))
             if receipt['contractAddress']:
                 color.print_colors("{} deployed at: {}".format(
                     self.fn_name.split('.')[0],
                     receipt['contractAddress']))
     if callback:
         callback(self)
def parse_swap(log):
    addr_pair = log['address']
    [(t0_balance, t0_address), (t1_balance, t1_address),
     amount_lp] = web3_utils.get_lp_value(uni_wrapper, addr_pair)
    t0_info = web3_utils.get_token_info(uni_wrapper, t0_address)
    t0_info = TokenInfo(addr=t0_address,
                        name=t0_info['name'],
                        symbol=t0_info['symbol'],
                        decimals=t0_info['decimals'])
    t1_info = web3_utils.get_token_info(uni_wrapper, t1_address)
    t1_info = TokenInfo(addr=t1_address,
                        name=t1_info['name'],
                        symbol=t1_info['symbol'],
                        decimals=t1_info['decimals'])
    topic_map = eth_event.get_topic_map(abi_pair)
    swap = eth_event.decode_logs([log], topic_map)
    # pprint(swap)
    (amount0In, amount1Out, amount1In, amount0Out, to,
     sender) = (None, None, None, None, None, None)
    for value in swap[0]['data']:
        # pprint(value)
        if value['name'] == 'sender':
            sender = value['value']
        elif value['name'] == 'to':
            to = value['value']
        elif value['name'] == 'amount0In':
            amount0In = int(value['value'])
        elif value['name'] == 'amount0Out':
            amount0Out = int(value['value'])
        elif value['name'] == 'amount1In':
            amount1In = int(value['value'])
        elif value['name'] == 'amount1Out':
            amount1Out = int(value['value'])
    if None in [amount0In, amount1Out, amount1In, amount0Out, to, sender]:
        return None
    if amount0In > 0:
        return Swap((t1_info, amount1Out), (t0_info, amount0In),
                    sender=to,
                    to=sender)
    else:
        return Swap((t0_info, amount0Out), (t1_info, amount1In),
                    sender=sender,
                    to=to)
Beispiel #9
0
def decode_logs(logs):
    if not logs:
        return []
    events = eth_event.decode_logs(logs, _topics)
    events = [format_event(i) for i in events]
    return EventDict(events)
Beispiel #10
0
def _decode_logs(logs: List) -> Union["EventDict", List[None]]:
    if not logs:
        return []
    events = eth_event.decode_logs(logs, _topics)
    events = [_format_event(i) for i in events]
    return EventDict(events)
Beispiel #11
0
def decode_logs(logs):
    try:
        return eth_event.decode_logs(logs, _topics)
    except Exception:
        return []
Beispiel #12
0
def test_decode_logs_not_allow_undecoded(anon_a_log, topic_map):
    logs = [anon_a_log]
    with pytest.raises(UnknownEvent):
        decode_logs(logs, topic_map, allow_undecoded=False)
Beispiel #13
0
def test_decode_logs_allow_undecoded(anon_a_log, anon_b_log, complex_log, topic_map):
    logs = [anon_a_log, complex_log, anon_b_log]
    events = decode_logs(logs, topic_map, allow_undecoded=True)

    assert len(events) == 3
    assert len([i for i in events if i["decoded"]]) == 1
Beispiel #14
0
def test_decode_logs(log, complex_log, topic_map):
    decode_logs([log, complex_log], topic_map)