eth-erc20/python/eth_erc20/runnable/util.py

72 lines
1.8 KiB
Python
Raw Normal View History

2021-06-15 11:01:20 +02:00
# external imports
from chainlib.eth.tx import (
unpack,
Tx,
)
from hexathon import (
strip_0x,
add_0x,
)
from chainlib.eth.constant import ZERO_ADDRESS
from chainlib.eth.runnable.util import decode_out
# local imports
from eth_erc20.erc20 import ERC20
sender_address = ZERO_ADDRESS
class Decoder:
def __init__(self, chain_spec):
self.chain_spec = chain_spec
def decode_transfer(self, tx, writer, rpc=None):
r = ERC20.parse_transfer_request(tx['data'])
token_value = r[1]
token_str = tx['to']
token_recipient = r[0]
if rpc != None:
c = ERC20(self.chain_spec)
o = c.symbol(tx['to'], sender_address=sender_address)
r = rpc.do(o)
symbol = c.parse_symbol(r)
o = c.name(tx['to'], sender_address=sender_address)
r = rpc.do(o)
name = c.parse_symbol(r)
o = c.decimals(tx['to'], sender_address=sender_address)
r = rpc.do(o)
decimals = c.parse_decimals(r)
token_str = '{} ({})'.format(name, symbol)
token_value = token_value / (10 ** decimals)
token_value_str = '{:.6f} ({} decimals)'.format(token_value, decimals)
writer.write("""to: {}
token: {}
value: {}
""".format(
token_recipient,
token_str,
token_value_str,
)
)
#writer.write('{}\n'.format(r))k
def decode_for_puny_humans(self, tx_raw, chain_spec, writer, method, rpc=None):
tx_raw = strip_0x(tx_raw)
tx_raw_bytes = bytes.fromhex(tx_raw)
tx_src = unpack(tx_raw_bytes, chain_spec)
tx = Tx.src_normalize(tx_src)
self.decode_transfer(tx, writer, rpc=rpc)
decode_out(tx_src, writer, skip_keys=['to'])
writer.write('src: {}\n'.format(add_0x(tx_raw)))