ethereum/signing: basic structure, first test passing

first commit based on the trezor-mcu repo
eth tokens added using the common ethereum_tokens-gen.py script
first device test passing
This commit is contained in:
Tomas Susanka 2017-12-18 16:33:26 +01:00
parent 8304e86bd7
commit dc02b322bf
6 changed files with 615 additions and 2 deletions

View File

@ -1,7 +1,7 @@
from trezor.wire import register, protobuf_workflow
from trezor.utils import unimport
from trezor.messages.wire_types import \
EthereumGetAddress
EthereumGetAddress, EthereumSignTx
@unimport
@ -10,5 +10,12 @@ def dispatch_EthereumGetAddress(*args, **kwargs):
return layout_ethereum_get_address(*args, **kwargs)
@unimport
def dispatch_EthereumSignTx(*args, **kwargs):
from .ethereum_sign_tx import ethereum_sign_tx
return ethereum_sign_tx(*args, **kwargs)
def boot():
register(EthereumGetAddress, protobuf_workflow, dispatch_EthereumGetAddress)
register(EthereumSignTx, protobuf_workflow, dispatch_EthereumSignTx)

View File

@ -0,0 +1,176 @@
from trezor import wire, ui
from trezor.utils import unimport
from trezor.messages.EthereumSignTx import EthereumSignTx
from trezor.messages.EthereumTxRequest import EthereumTxRequest
from trezor.messages import ButtonRequestType
from apps.common.confirm import confirm
from trezor.ui.text import Text
from trezor.crypto import rlp
from apps.ethereum import tokens
# maximum supported chain id
MAX_CHAIN_ID = 2147483630
@unimport
async def ethereum_sign_tx(ctx, msg):
from ..common import seed
from trezor.crypto.hashlib import sha3_256
from trezor.crypto.curve import secp256k1
msg = sanitize(msg)
check(msg)
# detect ERC - 20 token
token = None
if len(msg.to) == 20 and len(msg.value) == 0 and msg.data_length == 68 and len(msg.data_initial_chunk) == 68 \
and msg.data_initial_chunk[:16] == b'a9059cbb000000000000000000000000': #todo x?
token = tokens.token_by_chain_address(msg.chain_id, msg.to)
if token is not None:
# todo: await layout_ethereum_confirm_tx(msg->data_initial_chunk.bytes + 16, 20, msg->data_initial_chunk.bytes + 36, 32, token);
await layout_ethereum_confirm_tx(ctx, msg.to, msg.value, msg.chain_id, token)
else:
await layout_ethereum_confirm_tx(ctx, msg.to, msg.value, msg.chain_id, token)
# if token == None and msg.data_length > 0:
# layoutEthereumData(msg->data_initial_chunk.bytes, msg->data_initial_chunk.size, data_total);
# todo layoutEthereumFee
# todo eip 155 replay protection
# if chain_id != 0:
# hash v=chain_id, r=0, s=0
# hash_rlp_number(chain_id)
# hash_rlp_length(0, 0)
# hash_rlp_length(0, 0)
fields = [msg.nonce, msg.gas_price, msg.gas_limit, msg.to, msg.value, msg.data_initial_chunk]
rlp_encoded = rlp.encode(fields)
sha256 = sha3_256(rlp_encoded)
digest = sha256.digest(True)
address_n = msg.address_n or ()
node = await seed.get_root(ctx)
node.derive_path(address_n)
signature = secp256k1.sign(node.private_key(), digest, False)
req = EthereumTxRequest()
req.signature_v = signature[0]
if msg.chain_id:
req.signature_v += 2 * msg.chain_id + 8
req.signature_r = signature[1:33]
req.signature_s = signature[33:]
return req
def node_derive(root, address_n: list):
node = root.clone()
node.derive_path(address_n)
return node
def check(msg: EthereumSignTx):
if msg.chain_id < 0 or msg.chain_id > MAX_CHAIN_ID:
raise ValueError(FailureType.DataError, 'Chain id out of bounds')
if msg.data_length > 0:
if not msg.data_initial_chunk:
raise ValueError(Failure.DataError, 'Data length provided, but no initial chunk')
# Our encoding only supports transactions up to 2^24 bytes. To
# prevent exceeding the limit we use a stricter limit on data length.
if msg.data_length > 16000000:
raise ValueError(Failure.DataError, 'Data length exceeds limit')
if len(msg.data_initial_chunk) > msg.data_length:
raise ValueError(Failure.DataError, 'Invalid size of initial chunk')
# safety checks
if not check_gas(msg) or not check_to(msg):
raise ValueError(Failure.DataError, 'Safety check failed')
def check_gas(msg: EthereumSignTx) -> bool:
if msg.gas_price is None or msg.gas_limit is None:
return False
if len(msg.gas_price) + len(msg.gas_limit) > 30:
# sanity check that fee doesn't overflow
return False
return True
def check_to(msg: EthereumTxRequest) -> bool:
if msg.to == 0:
if msg.data_length == 0:
# sending transaction to address 0 (contract creation) without a data field
return False
else:
if len(msg.to) != 20:
return False
return True
def sanitize(msg):
if msg.value is None:
msg.value = b''
if msg.data_initial_chunk is None:
msg.data_initial_chunk = b''
if msg.data_length is None:
msg.data_length = 0
if msg.to is None:
msg.to = b''
if msg.nonce is None:
msg.nonce = b''
if msg.chain_id is None:
msg.chain_id = 0
return msg
@unimport
async def layout_ethereum_confirm_tx(ctx, to, value, chain_id, token=None):
content = Text('Confirm transaction', ui.ICON_RESET,
ui.BOLD, format_amount(value, token, chain_id),
ui.NORMAL, 'to',
ui.MONO, to)
return await confirm(ctx, content, ButtonRequestType.ConfirmOutput)
def format_amount(value, token, chain_id):
value = int.from_bytes(value, 'little')
if token:
suffix = token.ticker
decimals = token.decimals
elif value < 1e18:
suffix = " Wei"
decimals = 0
else:
decimals = 18
if chain_id == 1:
suffix = " ETH" # Ethereum Mainnet
elif chain_id == 61:
suffix = " ETC" # Ethereum Classic Mainnet
elif chain_id == 62:
suffix = " tETC" # Ethereum Classic Testnet
elif chain_id == 30:
suffix = " RSK" # Rootstock Mainnet
elif chain_id == 31:
suffix = " tRSK" # Rootstock Testnet
elif chain_id == 3:
suffix = " tETH" # Ethereum Testnet: Ropsten
elif chain_id == 4:
suffix = " tETH" # Ethereum Testnet: Rinkeby
elif chain_id == 42:
suffix = " tETH" # Ethereum Testnet: Kovan
elif chain_id == 2:
suffix = " EXP" # Expanse
elif chain_id == 8:
suffix = " UBQ" # UBIQ
else:
suffix = " UNKN" # unknown chain
return '%s%s' % (value // 10**decimals, suffix)

372
src/apps/ethereum/tokens.py Normal file
View File

@ -0,0 +1,372 @@
def token_by_chain_address(chain_id, address):
if not address:
return 0
for token in tokens:
if chain_id == token['chain_id'] and address == token['address']:
return token
return None
# generated using trezor-common/ethereum_tokens-gen.py
tokens = [
# eth
{'chain_id': 1, 'address': b'\x7d\xd7\xf5\x6d\x69\x7c\xc0\xf2\xb5\x2b\xd5\x5c\x05\x7f\x37\x8f\x1f\xe6\xab\x4b', 'symbol': '$TEAK', 'decimal': 18},
{'chain_id': 1, 'address': b'\xaf\x30\xd2\xa7\xe9\x0d\x7d\xc3\x61\xc8\xc4\x58\x5e\x9b\xb7\xd2\xf6\xf1\x5b\xc7', 'symbol': '1ST', 'decimal': 18},
{'chain_id': 1, 'address': b'\xfd\xbc\x1a\xdc\x26\xf0\xf8\xf8\x60\x6a\x5d\x63\xb7\xd3\xa3\xcd\x21\xc2\x2b\x23', 'symbol': '1WO', 'decimal': 8},
{'chain_id': 1, 'address': b'\xae\xc9\x8a\x70\x88\x10\x41\x48\x78\xc3\xbc\xdf\x46\xaa\xd3\x1d\xed\x4a\x45\x57', 'symbol': '300', 'decimal': 18},
{'chain_id': 1, 'address': b'\x13\xf1\xb7\xfd\xfb\xe1\xfc\x66\x67\x6d\x56\x48\x3e\x21\xb1\xec\xb4\x0b\x58\xe2', 'symbol': 'ACC', 'decimal': 18},
{'chain_id': 1, 'address': b'\x42\x28\x66\xa8\xf0\xb0\x32\xc5\xcf\x1d\xfb\xde\xf3\x1a\x20\xf4\x50\x95\x62\xb0', 'symbol': 'ADST', 'decimal': 0},
{'chain_id': 1, 'address': b'\xd0\xd6\xd6\xc5\xfe\x4a\x67\x7d\x34\x3c\xc4\x33\x53\x6b\xb7\x17\xba\xe1\x67\xdd', 'symbol': 'ADT', 'decimal': 9},
{'chain_id': 1, 'address': b'\x44\x70\xbb\x87\xd7\x7b\x96\x3a\x01\x3d\xb9\x39\xbe\x33\x2f\x92\x7f\x2b\x99\x2e', 'symbol': 'ADX', 'decimal': 4},
{'chain_id': 1, 'address': b'\x27\xdc\xe1\xec\x4d\x3f\x72\xc3\xe4\x57\xcc\x50\x35\x4f\x1f\x97\x5d\xde\xf4\x88', 'symbol': 'AIR', 'decimal': 8},
{'chain_id': 1, 'address': b'\x10\x63\xce\x52\x42\x65\xd5\xa3\xa6\x24\xf4\x91\x4a\xcd\x57\x3d\xd8\x9c\xe9\x88', 'symbol': 'AIX', 'decimal': 18},
{'chain_id': 1, 'address': b'\x18\x1a\x63\x74\x6d\x3a\xdc\xf3\x56\xcb\xc7\x3a\xce\x22\x83\x2f\xfb\xb1\xee\x5a', 'symbol': 'ALCO', 'decimal': 8},
{'chain_id': 1, 'address': b'\xea\x61\x0b\x11\x53\x47\x77\x20\x74\x8d\xc1\x3e\xd3\x78\x00\x39\x41\xd8\x4f\xab', 'symbol': 'ALIS', 'decimal': 18},
{'chain_id': 1, 'address': b'\x63\x8a\xc1\x49\xea\x8e\xf9\xa1\x28\x6c\x41\xb9\x77\x01\x7a\xa7\x35\x9e\x6c\xfa', 'symbol': 'ALTS', 'decimal': 18},
{'chain_id': 1, 'address': b'\x4d\xc3\x64\x3d\xbc\x64\x2b\x72\xc1\x58\xe7\xf3\xd2\xff\x23\x2d\xf6\x1c\xb6\xce', 'symbol': 'AMB', 'decimal': 18},
{'chain_id': 1, 'address': b'\x94\x9b\xed\x88\x6c\x73\x9f\x1a\x32\x73\x62\x9b\x33\x20\xdb\x0c\x50\x24\xc7\x19', 'symbol': 'AMIS', 'decimal': 9},
{'chain_id': 1, 'address': b'\x96\x0b\x23\x6a\x07\xcf\x12\x26\x63\xc4\x30\x33\x50\x60\x9a\x66\xa7\xb2\x88\xc0', 'symbol': 'ANT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x23\xae\x3c\x5b\x39\xb1\x2f\x06\x93\xe0\x54\x35\xee\xaa\x1e\x51\xd8\xc6\x15\x30', 'symbol': 'APT', 'decimal': 18},
{'chain_id': 1, 'address': b'\xac\x70\x9f\xcb\x44\xa4\x3c\x35\xf0\xda\x4e\x31\x63\xb1\x17\xa1\x7f\x37\x70\xf5', 'symbol': 'ARC', 'decimal': 18},
{'chain_id': 1, 'address': b'\x12\x45\xef\x80\xf4\xd9\xe0\x2e\xd9\x42\x53\x75\xe8\xf6\x49\xb9\x22\x1b\x31\xd8', 'symbol': 'ARCT', 'decimal': 8},
{'chain_id': 1, 'address': b'\xba\x5f\x11\xb1\x6b\x15\x57\x92\xcf\x3b\x2e\x68\x80\xe8\x70\x68\x59\xa8\xae\xb6', 'symbol': 'ARN', 'decimal': 8},
{'chain_id': 1, 'address': b'\xfe\xc0\xcf\x7f\xe0\x78\xa5\x00\xab\xf1\x5f\x12\x84\x95\x8f\x22\x04\x9c\x2c\x7e', 'symbol': 'ART', 'decimal': 18},
{'chain_id': 1, 'address': b'\x77\x05\xfa\xa3\x4b\x16\xeb\x6d\x77\xdf\xc7\x81\x2b\xe2\x36\x7b\xa6\xb0\x24\x8e', 'symbol': 'ARX', 'decimal': 8},
{'chain_id': 1, 'address': b'\x27\x05\x4b\x13\xb1\xb7\x98\xb3\x45\xb5\x91\xa4\xd2\x2e\x65\x62\xd4\x7e\xa7\x5a', 'symbol': 'AST', 'decimal': 4},
{'chain_id': 1, 'address': b'\x17\x05\x2d\x51\xe9\x54\x59\x2c\x10\x46\x32\x0c\x23\x71\xab\xab\x6c\x73\xef\x10', 'symbol': 'ATH', 'decimal': 18},
{'chain_id': 1, 'address': b'\x78\xb7\xfa\xda\x55\xa6\x4d\xd8\x95\xd8\xc8\xc3\x57\x79\xdd\x8b\x67\xfa\x8a\x05', 'symbol': 'ATL', 'decimal': 18},
{'chain_id': 1, 'address': b'\x88\x78\x34\xd3\xb8\xd4\x50\xb6\xba\xb1\x09\xc2\x52\xdf\x3d\xa2\x86\xd7\x3c\xe4', 'symbol': 'ATT', 'decimal': 18},
{'chain_id': 1, 'address': b'\xed\x24\x79\x80\x39\x6b\x10\x16\x9b\xb1\xd3\x6f\x6e\x27\x8e\xd1\x67\x00\xa6\x0f', 'symbol': 'AVA', 'decimal': 4},
{'chain_id': 1, 'address': b'\x0d\x88\xed\x6e\x74\xbb\xfd\x96\xb8\x31\x23\x16\x38\xb6\x6c\x05\x57\x1e\x82\x4f', 'symbol': 'AVT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x0d\x87\x75\xf6\x48\x43\x06\x79\xa7\x09\xe9\x8d\x2b\x0c\xb6\x25\x0d\x28\x87\xef', 'symbol': 'BAT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x1e\x79\x7c\xe9\x86\xc3\xcf\xf4\x47\x2f\x7d\x38\xd5\xc4\xab\xa5\x5d\xfe\xfe\x40', 'symbol': 'BCDN', 'decimal': 15},
{'chain_id': 1, 'address': b'\xbc\x12\x34\x55\x2e\xbe\xa3\x2b\x51\x21\x19\x03\x56\xbb\xa6\xd3\xbb\x22\x5b\xb5', 'symbol': 'BCL', 'decimal': 18},
{'chain_id': 1, 'address': b'\x1c\x44\x81\x75\x0d\xaa\x5f\xf5\x21\xa2\xa7\x49\x0d\x99\x81\xed\x46\x46\x5d\xbd', 'symbol': 'BCPT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x74\xc1\xe4\xb8\xca\xe5\x92\x69\xec\x1d\x85\xd3\xd4\xf3\x24\x39\x60\x48\xf4\xac', 'symbol': 'BEER', 'decimal': 0},
{'chain_id': 1, 'address': b'\x8a\xa3\x3a\x78\x99\xfc\xc8\xea\x5f\xbe\x6a\x60\x8a\x10\x9c\x38\x93\xa1\xb8\xb2', 'symbol': 'BET', 'decimal': 18},
{'chain_id': 1, 'address': b'\xb2\xbf\xeb\x70\xb9\x03\xf1\xba\xac\x7f\x2b\xa2\xc6\x29\x34\xc7\xe5\xb9\x74\xc4', 'symbol': 'BKB', 'decimal': 8},
{'chain_id': 1, 'address': b'\xce\x59\xd2\x9b\x09\xaa\xe5\x65\xfe\xee\xf8\xe5\x2f\x47\xc3\xcd\x53\x68\xc6\x63', 'symbol': 'BLX? Bullion Crypto', 'decimal': 18},
{'chain_id': 1, 'address': b'\xe5\xa7\xc1\x29\x72\xf3\xbb\xfe\x70\xed\x29\x52\x1c\x89\x49\xb8\xaf\x6a\x09\x70', 'symbol': 'BLX? Iconomi', 'decimal': 18},
{'chain_id': 1, 'address': b'\xdf\x6e\xf3\x43\x35\x07\x80\xbf\x8c\x34\x10\xbf\x06\x2e\x0c\x01\x5b\x1d\xd6\x71', 'symbol': 'BMC', 'decimal': 8},
{'chain_id': 1, 'address': b'\xf0\x28\xad\xee\x51\x53\x3b\x1b\x47\xbe\xaa\x89\x0f\xeb\x54\xa4\x57\xf5\x1e\x89', 'symbol': 'BMT', 'decimal': 18},
{'chain_id': 1, 'address': b'\xb8\xc7\x74\x82\xe4\x5f\x1f\x44\xde\x17\x45\xf5\x2c\x74\x42\x6c\x63\x1b\xdd\x52', 'symbol': 'BNB', 'decimal': 18},
{'chain_id': 1, 'address': b'\xdd\x6b\xf5\x6c\xa2\xad\xa2\x4c\x68\x3f\xac\x50\xe3\x77\x83\xe5\x5b\x57\xaf\x9f', 'symbol': 'BNC', 'decimal': 12},
{'chain_id': 1, 'address': b'\x1f\x57\x3d\x6f\xb3\xf1\x3d\x68\x9f\xf8\x44\xb4\xce\x37\x79\x4d\x79\xa7\xff\x1c', 'symbol': 'BNT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x7f\x1e\x2c\x7d\x6a\x69\xbf\x34\x82\x4d\x72\xc5\x3b\x45\x50\xe8\x95\xc0\xd8\xc2', 'symbol': 'BOP', 'decimal': 8},
{'chain_id': 1, 'address': b'\xc2\xc6\x3f\x23\xec\x5e\x97\xef\xbd\x75\x65\xdf\x9e\xc7\x64\xfd\xc7\xd4\xe9\x1d', 'symbol': 'BOU', 'decimal': 18},
{'chain_id': 1, 'address': b'\x5a\xf2\xbe\x19\x3a\x6a\xbc\xa9\xc8\x81\x70\x01\xf4\x57\x44\x77\x7d\xb3\x07\x56', 'symbol': 'BQX', 'decimal': 8},
{'chain_id': 1, 'address': b'\x9e\x77\xd5\xa1\x25\x1b\x6f\x7d\x45\x67\x22\xa6\xea\xc6\xd2\xd5\x98\x0b\xd8\x91', 'symbol': 'BRAT', 'decimal': 8},
{'chain_id': 1, 'address': b'\xf2\x6e\xf5\xe0\x54\x53\x84\xb7\xdc\xc0\xf2\x97\xf2\x67\x41\x89\x58\x68\x30\xdf', 'symbol': 'BSDC', 'decimal': 18},
{'chain_id': 1, 'address': b'\x73\xdd\x06\x9c\x29\x9a\x5d\x69\x1e\x98\x36\x24\x3b\xca\xec\x9c\x8c\x1d\x87\x34', 'symbol': 'BTE', 'decimal': 8},
{'chain_id': 1, 'address': b'\xfa\xd5\x72\xdb\x56\x6e\x52\x34\xac\x9f\xc3\xd5\x70\xc4\xed\xc0\x05\x0e\xaa\x92', 'symbol': 'BTH', 'decimal': 18},
{'chain_id': 1, 'address': b'\x2a\xcc\xab\x9c\xb7\xa4\x8c\x3e\x82\x28\x6f\x0b\x2f\x87\x98\xd2\x01\xf4\xec\x3f', 'symbol': 'BTL', 'decimal': 18},
{'chain_id': 1, 'address': b'\xcb\x97\xe6\x5f\x07\xda\x24\xd4\x6b\xcd\xd0\x78\xeb\xeb\xd7\xc6\xe6\xe3\xd7\x50', 'symbol': 'BTM', 'decimal': 8},
{'chain_id': 1, 'address': b'\x26\xe7\x53\x07\xfc\x0c\x02\x14\x72\xfe\xb8\xf7\x27\x83\x95\x31\xf1\x12\xf3\x17', 'symbol': 'C20', 'decimal': 18},
{'chain_id': 1, 'address': b'\x7d\x4b\x8c\xce\x05\x91\xc9\x04\x4a\x22\xee\x54\x35\x33\xb7\x2e\x97\x6e\x36\xc3', 'symbol': 'CAG', 'decimal': 18},
{'chain_id': 1, 'address': b'\x1d\x46\x24\x14\xfe\x14\xcf\x48\x9c\x7a\x21\xca\xc7\x85\x09\xf4\xbf\x8c\xd7\xc0', 'symbol': 'CAN', 'decimal': 6},
{'chain_id': 1, 'address': b'\x11\x11\x11\xf7\xe9\xb1\xfe\x07\x2a\xde\x43\x8f\x77\xe1\xce\x86\x1c\x7e\xe4\xe3', 'symbol': 'CAT (BitClave)', 'decimal': 18},
{'chain_id': 1, 'address': b'\x56\xba\x2e\xe7\x89\x04\x61\xf4\x63\xf7\xbe\x02\xaa\xc3\x09\x9f\x6d\x58\x11\xa8', 'symbol': 'CAT (Blockcat)', 'decimal': 18},
{'chain_id': 1, 'address': b'\x68\xe1\x4b\xb5\xa4\x5b\x96\x81\x32\x7e\x16\xe5\x28\x08\x4b\x9d\x96\x2c\x1a\x39', 'symbol': 'CATs (BitClave)', 'decimal': 18},
{'chain_id': 1, 'address': b'\x28\x57\x7a\x6d\x31\x55\x9b\xd2\x65\xce\x3a\xdb\x62\xd0\x45\x85\x50\xf7\xb8\xa7', 'symbol': 'CCC', 'decimal': 18},
{'chain_id': 1, 'address': b'\x8a\x95\xca\x44\x8a\x52\xc0\xad\xf0\x05\x4b\xb3\x40\x2d\xc5\xe0\x9c\xd6\xb2\x32', 'symbol': 'CDL', 'decimal': 18},
{'chain_id': 1, 'address': b'\x17\x7d\x39\xac\x67\x6e\xd1\xc6\x7a\x2b\x26\x8a\xd7\xf1\xe5\x88\x26\xe5\xb0\xaf', 'symbol': 'CDT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x6f\xff\x38\x06\xbb\xac\x52\xa2\x0e\x0d\x79\xbc\x53\x8d\x52\x7f\x6a\x22\xc9\x6b', 'symbol': 'CDX', 'decimal': 18},
{'chain_id': 1, 'address': b'\x12\xfe\xf5\xe5\x7b\xf4\x58\x73\xcd\x9b\x62\xe9\xdb\xd7\xbf\xb9\x9e\x32\xd7\x3e', 'symbol': 'CFI', 'decimal': 18},
{'chain_id': 1, 'address': b'\x06\x01\x2c\x8c\xf9\x7b\xea\xd5\xde\xae\x23\x70\x70\xf9\x58\x7f\x8e\x7a\x26\x6d', 'symbol': 'CK', 'decimal': 0},
{'chain_id': 1, 'address': b'\x7f\xce\x28\x56\x89\x9a\x68\x06\xee\xef\x70\x80\x79\x85\xfc\x75\x54\xc6\x63\x40', 'symbol': 'CLP', 'decimal': 9},
{'chain_id': 1, 'address': b'\x7e\x66\x75\x25\x52\x1c\xf6\x13\x52\xe2\xe0\x1b\x50\xfa\xaa\xe7\xdf\x39\x74\x9a', 'symbol': 'CMC', 'decimal': 18},
{'chain_id': 1, 'address': b'\xf8\x5f\xee\xa2\xfd\xd8\x1d\x51\x17\x7f\x6b\x8f\x35\xf0\xe6\x73\x4c\xe4\x5f\x5f', 'symbol': 'CMT', 'decimal': 18},
{'chain_id': 1, 'address': b'\xb2\xf7\xeb\x1f\x2c\x37\x64\x5b\xe6\x1d\x73\x95\x30\x35\x36\x0e\x76\x8d\x81\xe6', 'symbol': 'COB', 'decimal': 18},
{'chain_id': 1, 'address': b'\x65\x29\x2e\xea\xdf\x14\x26\xcd\x2d\xf1\xc4\x79\x3a\x3d\x75\x19\xf2\x53\x91\x3b', 'symbol': 'COSS', 'decimal': 18},
{'chain_id': 1, 'address': b'\xae\xf3\x8f\xbf\xbf\x93\x2d\x1a\xef\x3b\x80\x8b\xc8\xfb\xd8\xcd\x8e\x1f\x8b\xc5', 'symbol': 'CRB', 'decimal': 8},
{'chain_id': 1, 'address': b'\x67\x2a\x1a\xd4\xf6\x67\xfb\x18\xa3\x33\xaf\x13\x66\x7a\xa0\xaf\x1f\x5b\x5b\xdd', 'symbol': 'CRED', 'decimal': 18},
{'chain_id': 1, 'address': b'\x4e\x06\x03\xe2\xa2\x7a\x30\x48\x0e\x5e\x3a\x4f\xe5\x48\xe2\x9e\xf1\x2f\x64\xbe', 'symbol': 'CREDO', 'decimal': 18},
{'chain_id': 1, 'address': b'\xe4\xc9\x4d\x45\xf7\xae\xf7\x01\x8a\x5d\x66\xf4\x4a\xf7\x80\xec\x60\x23\x37\x8e', 'symbol': 'CCRB', 'decimal': 6},
{'chain_id': 1, 'address': b'\xbf\x4c\xfd\x7d\x1e\xde\xee\xa5\xf6\x60\x08\x27\x41\x1b\x41\xa2\x1e\xb0\x8a\xbd', 'symbol': 'CTL', 'decimal': 2},
{'chain_id': 1, 'address': b'\x66\x2a\xbc\xad\x0b\x7f\x34\x5a\xb7\xff\xb1\xb1\xfb\xb9\xdf\x78\x94\xf1\x8e\x66', 'symbol': 'CTX', 'decimal': 18},
{'chain_id': 1, 'address': b'\x41\xe5\x56\x00\x54\x82\x4e\xa6\xb0\x73\x2e\x65\x6e\x3a\xd6\x4e\x20\xe9\x4e\x45', 'symbol': 'CVC', 'decimal': 8},
{'chain_id': 1, 'address': b'\xda\xb0\xc3\x1b\xf3\x4c\x89\x7f\xb0\xfe\x90\xd1\x2e\xc9\x40\x1c\xaf\x5c\x36\xec', 'symbol': 'DAB', 'decimal': 0},
{'chain_id': 1, 'address': b'\x07\xd9\xe4\x9e\xa4\x02\x19\x4b\xf4\x8a\x82\x76\xda\xfb\x16\xe4\xed\x63\x33\x17', 'symbol': 'DALC', 'decimal': 8},
{'chain_id': 1, 'address': b'\xbb\x9b\xc2\x44\xd7\x98\x12\x3f\xde\x78\x3f\xcc\x1c\x72\xd3\xbb\x8c\x18\x94\x13', 'symbol': 'DAO', 'decimal': 16},
{'chain_id': 1, 'address': b'\x81\xc9\x15\x1d\xe0\xc8\xba\xfc\xd3\x25\xa5\x7e\x3d\xb5\xa5\xdf\x1c\xeb\xf7\x9c', 'symbol': 'DAT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x1b\x5f\x21\xee\x98\xee\xd4\x8d\x29\x2e\x8e\x2d\x3e\xd8\x2b\x40\xa9\x72\x8a\x22', 'symbol': 'DATA (DataBrokerDAO)', 'decimal': 18},
{'chain_id': 1, 'address': b'\x0c\xf0\xee\x63\x78\x8a\x08\x49\xfe\x52\x97\xf3\x40\x7f\x70\x1e\x12\x2c\xc0\x23', 'symbol': 'DATA (Streamr)', 'decimal': 18},
{'chain_id': 1, 'address': b'\x39\x9a\x0e\x6f\xbe\xb3\xd7\x4c\x85\x35\x74\x39\xf4\xc8\xae\xd9\x67\x8a\x5c\xbf', 'symbol': 'DCL', 'decimal': 3},
{'chain_id': 1, 'address': b'\xcc\x4e\xf9\xee\xaf\x65\x6a\xc1\xa2\xab\x88\x67\x43\xe9\x8e\x97\xe0\x90\xed\x38', 'symbol': 'DDF', 'decimal': 18},
{'chain_id': 1, 'address': b'\x35\x97\xbf\xd5\x33\xa9\x9c\x9a\xa0\x83\x58\x7b\x07\x44\x34\xe6\x1e\xb0\xa2\x58', 'symbol': 'DENT', 'decimal': 8},
{'chain_id': 1, 'address': b'\xe0\xb7\x92\x7c\x4a\xf2\x37\x65\xcb\x51\x31\x4a\x0e\x05\x21\xa9\x64\x5f\x0e\x2a', 'symbol': 'DGD', 'decimal': 9},
{'chain_id': 1, 'address': b'\x55\xb9\xa1\x1c\x2e\x83\x51\xb4\xff\xc7\xb1\x15\x61\x14\x8b\xfa\xc9\x97\x78\x55', 'symbol': 'DGX1', 'decimal': 9},
{'chain_id': 1, 'address': b'\x2e\x07\x1d\x29\x66\xaa\x7d\x8d\xec\xb1\x00\x58\x85\xba\x19\x77\xd6\x03\x8a\x65', 'symbol': 'DICE', 'decimal': 16},
{'chain_id': 1, 'address': b'\x13\xf1\x1c\x99\x05\xa0\x8c\xa7\x6e\x3e\x85\x3b\xe6\x3d\x4f\x09\x44\x32\x6c\x72', 'symbol': 'DIVX', 'decimal': 18},
{'chain_id': 1, 'address': b'\x07\xe3\xc7\x06\x53\x54\x8b\x04\xf0\xa7\x59\x70\xc1\xf8\x1b\x4c\xbb\xfb\x60\x6f', 'symbol': 'DLT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x0a\xbd\xac\xe7\x0d\x37\x90\x23\x5a\xf4\x48\xc8\x85\x47\x60\x3b\x94\x56\x04\xea', 'symbol': 'DNT', 'decimal': 18},
{'chain_id': 1, 'address': b'\xee\xf6\xe9\x00\x34\xee\xa8\x9e\x31\xeb\x4b\x8e\xac\xd3\x23\xf2\x8a\x92\xea\xe4', 'symbol': 'DOW', 'decimal': 18},
{'chain_id': 1, 'address': b'\x01\xb3\xec\x4a\xae\x1b\x87\x29\x52\x9b\xeb\x49\x65\xf2\x7d\x00\x87\x88\xb0\xeb', 'symbol': 'DPP', 'decimal': 18},
{'chain_id': 1, 'address': b'\x3c\x75\x22\x65\x55\xfc\x49\x61\x68\xd4\x8b\x88\xdf\x83\xb9\x5f\x16\x77\x1f\x37', 'symbol': 'DROP', 'decimal': 0},
{'chain_id': 1, 'address': b'\x62\x1d\x78\xf2\xef\x2f\xd9\x37\xbf\xca\x69\x6c\xab\xaf\x9a\x77\x9f\x59\xb3\xed', 'symbol': 'DRP', 'decimal': 2},
{'chain_id': 1, 'address': b'\xd2\x34\xbf\x24\x10\xa0\x00\x9d\xf9\xc3\xc6\x3b\x61\x0c\x09\x73\x8f\x18\xcc\xd7', 'symbol': 'DTR', 'decimal': 8},
{'chain_id': 1, 'address': b'\xaf\xc3\x97\x88\xc5\x1f\x0c\x1f\xf7\xb5\x53\x17\xf3\xe7\x02\x99\xe5\x21\xff\xf6', 'symbol': 'eBCH', 'decimal': 8},
{'chain_id': 1, 'address': b'\xeb\x7c\x20\x02\x71\x72\xe5\xd1\x43\xfb\x03\x0d\x50\xf9\x1c\xec\xe2\xd1\x48\x5d', 'symbol': 'eBTC', 'decimal': 8},
{'chain_id': 1, 'address': b'\xa5\x78\xac\xc0\xcb\x78\x75\x78\x1b\x78\x80\x90\x3f\x45\x94\xd1\x3c\xfa\x8b\x98', 'symbol': 'ECN', 'decimal': 2},
{'chain_id': 1, 'address': b'\x08\x71\x1d\x3b\x02\xc8\x75\x8f\x2f\xb3\xab\x4e\x80\x22\x84\x18\xa7\xf8\xe3\x9c', 'symbol': 'EDG', 'decimal': 0},
{'chain_id': 1, 'address': b'\xce\xd4\xe9\x31\x98\x73\x4d\xda\xff\x84\x92\xd5\x25\xbd\x25\x8d\x49\xeb\x38\x8e', 'symbol': 'EDO', 'decimal': 18},
{'chain_id': 1, 'address': b'\x5b\x26\xc5\xd0\x77\x2e\x5b\xba\xc8\xb3\x18\x2a\xe9\xa1\x3f\x9b\xb2\xd0\x37\x65', 'symbol': 'EDU', 'decimal': 8},
{'chain_id': 1, 'address': b'\xf9\xf0\xfc\x71\x67\xc3\x11\xdd\x2f\x1e\x21\xe9\x20\x4f\x87\xeb\xa9\x01\x2f\xb2', 'symbol': 'EHT', 'decimal': 8},
{'chain_id': 1, 'address': b'\xc8\xc6\xa3\x1a\x4a\x80\x6d\x37\x10\xa7\xb3\x8b\x7b\x29\x6d\x2f\xab\xcc\xdb\xa8', 'symbol': 'ELIX', 'decimal': 18},
{'chain_id': 1, 'address': b'\xb8\x02\xb2\x4e\x06\x37\xc2\xb8\x7d\x2e\x8b\x77\x84\xc0\x55\xbb\xe9\x21\x01\x1a', 'symbol': 'EMV', 'decimal': 2},
{'chain_id': 1, 'address': b'\xf6\x29\xcb\xd9\x4d\x37\x91\xc9\x25\x01\x52\xbd\x8d\xfb\xdf\x38\x0e\x2a\x3b\x9c', 'symbol': 'ENJ', 'decimal': 18},
{'chain_id': 1, 'address': b'\x86\xfa\x04\x98\x57\xe0\x20\x9a\xa7\xd9\xe6\x16\xf7\xeb\x3b\x3b\x78\xec\xfd\xb0', 'symbol': 'EOS', 'decimal': 18},
{'chain_id': 1, 'address': b'\x1b\x97\x43\xf5\x56\xd6\x5e\x75\x7c\x4c\x65\x0b\x45\x55\xba\xf3\x54\xcb\x8b\xd3', 'symbol': 'ETBS', 'decimal': 12},
{'chain_id': 1, 'address': b'\x3a\x26\x74\x6d\xdb\x79\xb1\xb8\xe4\x45\x0e\x3f\x4f\xfe\x32\x85\xa3\x07\x38\x7e', 'symbol': 'ETHB', 'decimal': 8},
{'chain_id': 1, 'address': b'\xf3\xdb\x5f\xa2\xc6\x6b\x7a\xf3\xeb\x0c\x0b\x78\x25\x10\x81\x6c\xbe\x48\x13\xb8', 'symbol': 'EVX', 'decimal': 4},
{'chain_id': 1, 'address': b'\xc9\x8e\x06\x39\xc6\xd2\xec\x03\x7a\x61\x53\x41\xc3\x69\x66\x6b\x11\x0e\x80\xe5', 'symbol': 'EXMR', 'decimal': 8},
{'chain_id': 1, 'address': b'\x19\x0e\x56\x9b\xe0\x71\xf4\x0c\x70\x4e\x15\x82\x5f\x28\x54\x81\xcb\x74\xb6\xcc', 'symbol': 'FAM', 'decimal': 12},
{'chain_id': 1, 'address': b'\xf0\x4a\x8a\xc5\x53\xfc\xed\xb5\xba\x99\xa6\x47\x99\x15\x58\x26\xc1\x36\xb0\xbe', 'symbol': 'FLIXX', 'decimal': 18},
{'chain_id': 1, 'address': b'\x0a\xbe\xfb\x76\x11\xcb\x3a\x01\xea\x3f\xad\x85\xf3\x3c\x3c\x93\x4f\x8e\x2c\xf4', 'symbol': 'FRD', 'decimal': 18},
{'chain_id': 1, 'address': b'\xe6\xf7\x4d\xcf\xa0\xe2\x08\x83\x00\x8d\x8c\x16\xb6\xd9\xa3\x29\x18\x9d\x0c\x30', 'symbol': 'FTC', 'decimal': 2},
{'chain_id': 1, 'address': b'\xea\x38\xea\xa3\xc8\x6c\x8f\x9b\x75\x15\x33\xba\x2e\x56\x2d\xeb\x9a\xcd\xed\x40', 'symbol': 'FUEL', 'decimal': 18},
{'chain_id': 1, 'address': b'\x41\x9d\x0d\x8b\xdd\x9a\xf5\xe6\x06\xae\x22\x32\xed\x28\x5a\xff\x19\x0e\x71\x1b', 'symbol': 'FUN', 'decimal': 8},
{'chain_id': 1, 'address': b'\x88\xfc\xfb\xc2\x2c\x6d\x3d\xba\xa2\x5a\xf4\x78\xc5\x78\x97\x83\x39\xbd\xe7\x7a', 'symbol': 'FYN', 'decimal': 18},
{'chain_id': 1, 'address': b'\x70\x88\x76\xf4\x86\xe4\x48\xee\x89\xeb\x33\x2b\xfb\xc8\xe5\x93\x55\x30\x58\xb9', 'symbol': 'GAVEL', 'decimal': 18},
{'chain_id': 1, 'address': b'\x75\x85\xf8\x35\xae\x2d\x52\x27\x22\xd2\x68\x43\x23\xa0\xba\x83\x40\x1f\x32\xf5', 'symbol': 'GBT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x4f\x4f\x0d\xb4\xde\x90\x3b\x88\xf2\xb1\xa2\x84\x79\x71\xe2\x31\xd5\x4f\x8f\xd3', 'symbol': 'GEE', 'decimal': 8},
{'chain_id': 1, 'address': b'\x24\x08\x3b\xb3\x00\x72\x64\x3c\x3b\xb9\x0b\x44\xb7\x28\x58\x60\xa7\x55\xe6\x87', 'symbol': 'GELD', 'decimal': 18},
{'chain_id': 1, 'address': b'\xae\x4f\x56\xf0\x72\xc3\x4c\x0a\x65\xb3\xae\x3e\x4d\xb7\x97\xd8\x31\x43\x9d\x93', 'symbol': 'GIM', 'decimal': 8},
{'chain_id': 1, 'address': b'\xb3\xbd\x49\xe2\x8f\x8f\x83\x2b\x8d\x1e\x24\x61\x06\x99\x1e\x54\x6c\x32\x35\x02', 'symbol': 'GMT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x68\x10\xe7\x76\x88\x0c\x02\x93\x3d\x47\xdb\x1b\x9f\xc0\x59\x08\xe5\x38\x6b\x96', 'symbol': 'GNO', 'decimal': 18},
{'chain_id': 1, 'address': b'\xa7\x44\x76\x44\x31\x19\xa9\x42\xde\x49\x85\x90\xfe\x1f\x24\x54\xd7\xd4\xac\x0d', 'symbol': 'GNT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x12\xb1\x9d\x3e\x2c\xcc\x14\xda\x04\xfa\xe3\x3e\x63\x65\x2c\xe4\x69\xb3\xf2\xfd', 'symbol': 'GRID', 'decimal': 12},
{'chain_id': 1, 'address': b'\xb7\x08\x35\xd7\x82\x2e\xbb\x94\x26\xb5\x65\x43\xe3\x91\x84\x6c\x10\x7b\xd3\x2c', 'symbol': 'GTC', 'decimal': 18},
{'chain_id': 1, 'address': b'\x02\x5a\xba\xd9\xe5\x18\x51\x6f\xda\xaf\xbd\xcd\xb9\x70\x1b\x37\xfb\x7e\xf0\xfa', 'symbol': 'GTKT', 'decimal': 0},
{'chain_id': 1, 'address': b'\xf7\xb0\x98\x29\x8f\x7c\x69\xfc\x14\x61\x0b\xf7\x1d\x5e\x02\xc6\x07\x92\x89\x4c', 'symbol': 'GUP', 'decimal': 3},
{'chain_id': 1, 'address': b'\x10\x3c\x3a\x20\x9d\xa5\x9d\x3e\x7c\x4a\x89\x30\x7e\x66\x52\x1e\x08\x1c\xfd\xf0', 'symbol': 'GVT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x58\xca\x30\x65\xc0\xf2\x4c\x7c\x96\xae\xe8\xd6\x05\x6b\x5b\x5d\xec\xf9\xc2\xf8', 'symbol': 'GXC', 'decimal': 10},
{'chain_id': 1, 'address': b'\x22\xf0\xaf\x8d\x78\x85\x1b\x72\xee\x79\x9e\x05\xf5\x4a\x77\x00\x15\x86\xb1\x8a', 'symbol': 'GXVC', 'decimal': 10},
{'chain_id': 1, 'address': b'\xfe\xed\x1a\x53\xbd\x53\xff\xe4\x53\xd2\x65\xfc\x6e\x70\xdd\x85\xf8\xe9\x93\xb6', 'symbol': 'H2O', 'decimal': 18},
{'chain_id': 1, 'address': b'\xff\xe8\x19\x6b\xc2\x59\xe8\xde\xdc\x54\x4d\x93\x57\x86\xaa\x47\x09\xec\x3e\x64', 'symbol': 'HDG', 'decimal': 18},
{'chain_id': 1, 'address': b'\xba\x21\x84\x52\x0a\x1c\xc4\x9a\x61\x59\xc5\x7e\x61\xe1\x84\x4e\x08\x56\x15\xb6', 'symbol': 'HGT', 'decimal': 8},
{'chain_id': 1, 'address': b'\xa9\x24\x0f\xbc\xac\x1f\x0b\x9a\x6a\xdf\xb0\x4a\x53\xc8\xe3\xb0\xcc\x1d\x14\x44', 'symbol': 'HIG', 'decimal': 18},
{'chain_id': 1, 'address': b'\x14\xf3\x7b\x57\x42\x42\xd3\x66\x55\x8d\xb6\x1f\x33\x35\x28\x9a\x50\x35\xc5\x06', 'symbol': 'HKG', 'decimal': 3},
{'chain_id': 1, 'address': b'\xcb\xcc\x0f\x03\x6e\xd4\x78\x8f\x63\xfc\x0f\xee\x32\x87\x3d\x6a\x74\x87\xb9\x08', 'symbol': 'HMQ', 'decimal': 8},
{'chain_id': 1, 'address': b'\x55\x4c\x20\xb7\xc4\x86\xbe\xee\x43\x92\x77\xb4\x54\x0a\x43\x45\x66\xdc\x4c\x02', 'symbol': 'HST', 'decimal': 18},
{'chain_id': 1, 'address': b'\x5a\x84\x96\x9b\xb6\x63\xfb\x64\xf6\xd0\x15\xdc\xf9\xf6\x22\xae\xdc\x79\x67\x50', 'symbol': 'ICE', 'decimal': 18},
{'chain_id': 1, 'address': b'\x88\x86\x66\xca\x69\xe0\xf1\x78\xde\xd6\xd7\x5b\x57\x26\xce\xe9\x9a\x87\xd6\x98', 'symbol': 'ICN', 'decimal': 18},
{'chain_id': 1, 'address': b'\xa3\x3e\x72\x9b\xf4\xfd\xeb\x86\x8b\x53\x4e\x1f\x20\x52\x34\x63\xd9\xc4\x6b\xee', 'symbol': 'ICO', 'decimal': 10},
{'chain_id': 1, 'address': b'\x01\x4b\x50\x46\x65\x90\x34\x0d\x41\x30\x7c\xc5\x4d\xce\xe9\x90\xc8\xd5\x8a\xa8', 'symbol': 'ICOS', 'decimal': 6},
{'chain_id': 1, 'address': b'\x81\x4c\xaf\xd4\x78\x2d\x2e\x72\x81\x70\xfd\xa6\x82\x57\x98\x3f\x03\x32\x1c\x58', 'symbol': 'IDEA', 'decimal': 0},
{'chain_id': 1, 'address': b'\x76\x54\x91\x5a\x1b\x82\xd6\xd2\xd0\xaf\xc3\x7c\x52\xaf\x55\x6e\xa8\x98\x3c\x7e', 'symbol': 'IFT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x16\x66\x2f\x73\xdf\x3e\x79\xe5\x4c\x6c\x59\x38\xb4\x31\x3f\x92\xc5\x24\xc1\x20', 'symbol': 'IIC', 'decimal': 18},
{'chain_id': 1, 'address': b'\x88\xae\x96\x84\x5e\x15\x75\x58\xef\x59\xe9\xff\x90\xe7\x66\xe2\x2e\x48\x03\x90', 'symbol': 'IKB', 'decimal': 0},
{'chain_id': 1, 'address': b'\xe3\x83\x1c\x5a\x98\x2b\x27\x9a\x19\x84\x56\xd5\x77\xcf\xb9\x04\x24\xcb\x63\x40', 'symbol': 'IMC', 'decimal': 6},
{'chain_id': 1, 'address': b'\x22\xe5\xf6\x2d\x0f\xa1\x99\x74\x74\x9f\xaa\x19\x4e\x3d\x3e\xf6\xd8\x9c\x08\xd7', 'symbol': 'IMT', 'decimal': 0},
{'chain_id': 1, 'address': b'\xf8\xe3\x86\xed\xa8\x57\x48\x4f\x5a\x12\xe4\xb5\xda\xa9\x98\x4e\x06\xe7\x37\x05', 'symbol': 'IND', 'decimal': 18},
{'chain_id': 1, 'address': b'\x5b\x2e\x4a\x70\x0d\xfb\xc5\x60\x06\x1e\x95\x7e\xde\xc8\xf6\xee\xeb\x74\xa3\x20', 'symbol': 'INS', 'decimal': 10},
{'chain_id': 1, 'address': b'\xa8\x00\x6c\x4c\xa5\x6f\x24\xd6\x83\x67\x27\xd1\x06\x34\x93\x20\xdb\x7f\xef\x82', 'symbol': 'INXT', 'decimal': 8},
{'chain_id': 1, 'address': b'\x0a\xef\x06\xdc\xcc\xc5\x31\xe5\x81\xf0\x44\x00\x59\xe6\xff\xcc\x20\x60\x39\xee', 'symbol': 'ITT', 'decimal': 8},
{'chain_id': 1, 'address': b'\xfc\xa4\x79\x62\xd4\x5a\xdf\xdf\xd1\xab\x2d\x97\x23\x15\xdb\x4c\xe7\xcc\xf0\x94', 'symbol': 'IXT', 'decimal': 8},
{'chain_id': 1, 'address': b'\x0a\xaf\x56\x1e\xff\x5b\xd9\xc8\xf9\x11\x61\x69\x33\xf8\x41\x66\xa1\x7c\xfe\x0c', 'symbol': 'JBX', 'decimal': 0},
{'chain_id': 1, 'address': b'\x87\x27\xc1\x12\xc7\x12\xc4\xa0\x33\x71\xac\x87\xa7\x4d\xd6\xab\x10\x4a\xf7\x68', 'symbol': 'JET (new)', 'decimal': 18},
{'chain_id': 1, 'address': b'\xc1\xe6\xc6\xc6\x81\xb2\x86\xfb\x50\x3b\x36\xa9\xdd\x6c\x1d\xbf\xf8\x5e\x73\xcf', 'symbol': 'JET (old)', 'decimal': 18},
{'chain_id': 1, 'address': b'\x77\x34\x50\x33\x5e\xd4\xec\x3d\xb4\x5a\xf7\x4f\x34\xf2\xc8\x53\x48\x64\x5d\x39', 'symbol': 'JTC', 'decimal': 18},
{'chain_id': 1, 'address': b'\xa5\xfd\x1a\x79\x1c\x4d\xfc\xaa\xcc\x96\x3d\x4f\x73\xc6\xae\x58\x24\x14\x9e\xa7', 'symbol': 'JNT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x27\x69\x5e\x09\x14\x9a\xdc\x73\x8a\x97\x8e\x9a\x67\x8f\x99\xe4\xc3\x9e\x9e\xb9', 'symbol': 'KICK', 'decimal': 8},
{'chain_id': 1, 'address': b'\x81\x8f\xc6\xc2\xec\x59\x86\xbc\x6e\x2c\xbf\x00\x93\x9d\x90\x55\x6a\xb1\x2c\xe5', 'symbol': 'KIN', 'decimal': 18},
{'chain_id': 1, 'address': b'\xdd\x97\x4d\x5c\x2e\x29\x28\xde\xa5\xf7\x1b\x98\x25\xb8\xb6\x46\x68\x6b\xd2\x00', 'symbol': 'KNC', 'decimal': 18},
{'chain_id': 1, 'address': b'\x95\x41\xfd\x8b\x9b\x5f\xa9\x73\x81\x78\x37\x83\xce\xbf\x2f\x5f\xa7\x93\xc2\x62', 'symbol': 'KZN', 'decimal': 8},
{'chain_id': 1, 'address': b'\x2e\xb8\x6e\x8f\xc5\x20\xe0\xf6\xbb\x5d\x9a\xf0\x8f\x92\x4f\xe7\x05\x58\xab\x89', 'symbol': 'LGR', 'decimal': 8},
{'chain_id': 1, 'address': b'\xff\x18\xdb\xc4\x87\xb4\xc2\xe3\x22\x2d\x11\x59\x52\xba\xbf\xda\x8b\xa5\x2f\x5f', 'symbol': 'LIFE', 'decimal': 18},
{'chain_id': 1, 'address': b'\x51\x49\x10\x77\x1a\xf9\xca\x65\x6a\xf8\x40\xdf\xf8\x3e\x82\x64\xec\xf9\x86\xca', 'symbol': 'LINK - ChainLink', 'decimal': 18},
{'chain_id': 1, 'address': b'\xe2\xe6\xd4\xbe\x08\x6c\x69\x38\xb5\x3b\x22\x14\x48\x55\xee\xf6\x74\x28\x16\x39', 'symbol': 'LINK - Link Platform', 'decimal': 18},
{'chain_id': 1, 'address': b'\x24\xa7\x7c\x1f\x17\xc5\x47\x10\x5e\x14\x81\x3e\x51\x7b\xe0\x6b\x00\x40\xaa\x76', 'symbol': 'LIVE', 'decimal': 18},
{'chain_id': 1, 'address': b'\x63\xe6\x34\x33\x0a\x20\x15\x0d\xbb\x61\xb1\x56\x48\xbc\x73\x85\x5d\x6c\xcf\x07', 'symbol': 'LNC', 'decimal': 18},
{'chain_id': 1, 'address': b'\x6b\xeb\x41\x8f\xc6\xe1\x95\x82\x04\xac\x8b\xad\xdc\xf1\x09\xb8\xe9\x69\x49\x66', 'symbol': 'LNC-Linker Coin', 'decimal': 18},
{'chain_id': 1, 'address': b'\x5e\x33\x46\x44\x40\x10\x13\x53\x22\x26\x8a\x46\x30\xd2\xed\x5f\x8d\x09\x44\x6c', 'symbol': 'LOC', 'decimal': 18},
{'chain_id': 1, 'address': b'\x21\xae\x23\xb8\x82\xa3\x40\xa2\x22\x82\x16\x20\x86\xbc\x98\xd3\xe2\xb7\x30\x18', 'symbol': 'LOK', 'decimal': 18},
{'chain_id': 1, 'address': b'\xef\x68\xe7\xc6\x94\xf4\x0c\x82\x02\x82\x1e\xdf\x52\x5d\xe3\x78\x24\x58\x63\x9f', 'symbol': 'LRC', 'decimal': 18},
{'chain_id': 1, 'address': b'\xfb\x12\xe3\xcc\xa9\x83\xb9\xf5\x9d\x90\x91\x2f\xd1\x7f\x8d\x74\x5a\x8b\x29\x53', 'symbol': 'LUCK', 'decimal': 0},
{'chain_id': 1, 'address': b'\xa8\x9b\x59\x34\x86\x34\x47\xf6\xe4\xfc\x53\xb3\x15\xa9\x3e\x87\x3b\xda\x69\xa3', 'symbol': 'LUM', 'decimal': 18},
{'chain_id': 1, 'address': b'\xfa\x05\xa7\x3f\xfe\x78\xef\x8f\x1a\x73\x94\x73\xe4\x62\xc5\x4b\xae\x65\x67\xd9', 'symbol': 'LUN', 'decimal': 18},
{'chain_id': 1, 'address': b'\x3f\x4b\x72\x66\x68\xda\x46\xf5\xe0\xe7\x5a\xa5\xd4\x78\xac\xec\x9f\x38\x21\x0f', 'symbol': 'M-ETH', 'decimal': 18},
{'chain_id': 1, 'address': b'\x0f\x5d\x2f\xb2\x9f\xb7\xd3\xcf\xee\x44\x4a\x20\x02\x98\xf4\x68\x90\x8c\xc9\x42', 'symbol': 'MANA', 'decimal': 18},
{'chain_id': 1, 'address': b'\x38\x64\x67\xf1\xf3\xdd\xbe\x83\x24\x48\x65\x04\x18\x31\x1a\x47\x9e\xec\xfc\x57', 'symbol': 'MBRS', 'decimal': 0},
{'chain_id': 1, 'address': b'\x93\xe6\x82\x10\x7d\x1e\x9d\xef\xb0\xb5\xee\x70\x1c\x71\x70\x7a\x4b\x2e\x46\xbc', 'symbol': 'MCAP', 'decimal': 8},
{'chain_id': 1, 'address': b'\x13\x8a\x87\x52\x09\x3f\x4f\x9a\x79\xaa\xed\xf4\x8d\x4b\x92\x48\xfa\xb9\x3c\x9c', 'symbol': 'MCI', 'decimal': 18},
{'chain_id': 1, 'address': b'\xb6\x3b\x60\x6a\xc8\x10\xa5\x2c\xca\x15\xe4\x4b\xb6\x30\xfd\x42\xd8\xd1\xd8\x3d', 'symbol': 'MCO', 'decimal': 8},
{'chain_id': 1, 'address': b'\x51\xdb\x5a\xd3\x5c\x67\x1a\x87\x20\x7d\x88\xfc\x11\xd5\x93\xac\x0c\x84\x15\xbd', 'symbol': 'MDA', 'decimal': 18},
{'chain_id': 1, 'address': b'\x40\x39\x50\x44\xac\x3c\x0c\x57\x05\x19\x06\xda\x93\x8b\x54\xbd\x65\x57\xf2\x12', 'symbol': 'MGO', 'decimal': 8},
{'chain_id': 1, 'address': b'\xe2\x3c\xd1\x60\x76\x1f\x63\xfc\x3a\x1c\xf7\x8a\xa0\x34\xb6\xcd\xf9\x7d\x3e\x0c', 'symbol': 'MIT', 'decimal': 18},
{'chain_id': 1, 'address': b'\xc6\x6e\xa8\x02\x71\x7b\xfb\x98\x33\x40\x02\x64\xdd\x12\xc2\xbc\xea\xa3\x4a\x6d', 'symbol': 'MKR', 'decimal': 18},
{'chain_id': 1, 'address': b'\xbe\xb9\xef\x51\x4a\x37\x9b\x99\x7e\x07\x98\xfd\xcc\x90\x1e\xe4\x74\xb6\xd9\xa1', 'symbol': 'MLN', 'decimal': 18},
{'chain_id': 1, 'address': b'\x1a\x95\xb2\x71\xb0\x53\x5d\x15\xfa\x49\x93\x2d\xab\xa3\x1b\xa6\x12\xb5\x29\x46', 'symbol': 'MNE', 'decimal': 8},
{'chain_id': 1, 'address': b'\x83\xce\xe9\xe0\x86\xa7\x7e\x49\x2e\xe0\xbb\x93\xc2\xb0\x43\x7a\xd6\xfd\xec\xcc', 'symbol': 'MNTP', 'decimal': 18},
{'chain_id': 1, 'address': b'\x95\x7c\x30\xab\x04\x26\xe0\xc9\x3c\xd8\x24\x1e\x2c\x60\x39\x2d\x08\xc6\xac\x8e', 'symbol': 'MOD', 'decimal': 0},
{'chain_id': 1, 'address': b'\xab\x6c\xf8\x7a\x50\xf1\x7d\x7f\x5e\x1f\xea\xf8\x1b\x6f\xe9\xff\xbe\x8e\xbf\x84', 'symbol': 'MRV', 'decimal': 18},
{'chain_id': 1, 'address': b'\x68\xaa\x3f\x23\x2d\xa9\xbd\xc2\x34\x34\x65\x54\x57\x94\xef\x3e\xea\x52\x09\xbd', 'symbol': 'MSP', 'decimal': 18},
{'chain_id': 1, 'address': b'\xaf\x4d\xce\x16\xda\x28\x77\xf8\xc9\xe0\x05\x44\xc9\x3b\x62\xac\x40\x63\x1f\x16', 'symbol': 'MTH', 'decimal': 5},
{'chain_id': 1, 'address': b'\xf4\x33\x08\x93\x66\x89\x9d\x83\xa9\xf2\x6a\x77\x3d\x59\xec\x7e\xcf\x30\x35\x5e', 'symbol': 'MTL', 'decimal': 8},
{'chain_id': 1, 'address': b'\x7f\xc4\x08\x01\x11\x65\x76\x0e\xe3\x1b\xe2\xbf\x20\xda\xf4\x50\x35\x66\x92\xaf', 'symbol': 'MTR', 'decimal': 8},
{'chain_id': 1, 'address': b'\x0a\xf4\x4e\x27\x84\x63\x72\x18\xdd\x1d\x32\xa3\x22\xd4\x4e\x60\x3a\x8f\x0c\x6a', 'symbol': 'MTX', 'decimal': 18},
{'chain_id': 1, 'address': b'\xf7\xe9\x83\x78\x16\x09\x01\x23\x07\xf2\x51\x4f\x63\xd5\x26\xd8\x3d\x24\xf4\x66', 'symbol': 'MYD', 'decimal': 16},
{'chain_id': 1, 'address': b'\xa6\x45\x26\x4c\x56\x03\xe9\x6c\x3b\x0b\x07\x8c\xda\xb6\x87\x33\x79\x4b\x0a\x71', 'symbol': 'MYST', 'decimal': 8},
{'chain_id': 1, 'address': b'\xa5\x4d\xdc\x7b\x3c\xce\x7f\xc8\xb1\xe3\xfa\x02\x56\xd0\xdb\x80\xd2\xc1\x09\x70', 'symbol': 'NDC', 'decimal': 18},
{'chain_id': 1, 'address': b'\xcf\xb9\x86\x37\xbc\xae\x43\xc1\x33\x23\xea\xa1\x73\x1c\xed\x2b\x71\x69\x62\xfd', 'symbol': 'NET', 'decimal': 18},
{'chain_id': 1, 'address': b'\xa8\x23\xe6\x72\x20\x06\xaf\xe9\x9e\x91\xc3\x0f\xf5\x29\x50\x52\xfe\x6b\x8e\x32', 'symbol': 'NEU', 'decimal': 18},
{'chain_id': 1, 'address': b'\xe2\x65\x17\xa9\x96\x72\x99\x45\x3d\x3f\x1b\x48\xaa\x00\x5e\x61\x27\xe6\x72\x10', 'symbol': 'NIMFA', 'decimal': 18},
{'chain_id': 1, 'address': b'\x17\x76\xe1\xf2\x6f\x98\xb1\xa5\xdf\x9c\xd3\x47\x95\x3a\x26\xdd\x3c\xb4\x66\x71', 'symbol': 'NMR', 'decimal': 18},
{'chain_id': 1, 'address': b'\xec\x46\xf8\x20\x7d\x76\x60\x12\x45\x4c\x40\x8d\xe2\x10\xbc\xbc\x22\x43\xe7\x1c', 'symbol': 'NOX', 'decimal': 18},
{'chain_id': 1, 'address': b'\x45\xe4\x2d\x65\x9d\x9f\x94\x66\xcd\x5d\xf6\x22\x50\x60\x33\x14\x5a\x9b\x89\xbc', 'symbol': 'NxC', 'decimal': 3},
{'chain_id': 1, 'address': b'\x76\x27\xde\x4b\x93\x26\x3a\x6a\x75\x70\xb8\xda\xfa\x64\xba\xe8\x12\xe5\xc3\x94', 'symbol': 'NXX', 'decimal': 8},
{'chain_id': 1, 'address': b'\x5c\x61\x83\xd1\x0a\x00\xcd\x74\x7a\x6d\xbb\x5f\x65\x8a\xd5\x14\x38\x3e\x94\x19', 'symbol': 'NXX_OLD', 'decimal': 8},
{'chain_id': 1, 'address': b'\x70\x1c\x24\x4b\x98\x8a\x51\x3c\x94\x59\x73\xde\xfa\x05\xde\x93\x3b\x23\xfe\x1d', 'symbol': 'OAX', 'decimal': 18},
{'chain_id': 1, 'address': b'\x7f\x21\x76\xce\xb1\x6d\xcb\x64\x8d\xc9\x24\xef\xf6\x17\xc3\xdc\x2b\xef\xd3\x0d', 'symbol': 'OHNI', 'decimal': 0},
{'chain_id': 1, 'address': b'\xd2\x61\x14\xcd\x6e\xe2\x89\xac\xcf\x82\x35\x0c\x8d\x84\x87\xfe\xdb\x8a\x0c\x07', 'symbol': 'OMG', 'decimal': 18},
{'chain_id': 1, 'address': b'\xb2\x3b\xe7\x35\x73\xbc\x7e\x03\xdb\x6e\x5d\xfc\x62\x40\x53\x68\x71\x6d\x28\xa8', 'symbol': 'ONEK', 'decimal': 18},
{'chain_id': 1, 'address': b'\x43\x55\xfc\x16\x0f\x74\x32\x8f\x9b\x38\x3d\xf2\xec\x58\x9b\xb3\xdf\xd8\x2b\xa0', 'symbol': 'OPT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x65\xa1\x50\x14\x96\x4f\x21\x02\xff\x58\x64\x7e\x16\xa1\x6a\x6b\x9e\x14\xbc\xf6', 'symbol': 'Ox Fina', 'decimal': 3},
{'chain_id': 1, 'address': b'\x69\x44\x04\x59\x5e\x30\x75\xa9\x42\x39\x7f\x46\x6a\xac\xd4\x62\xff\x1a\x7b\xd0', 'symbol': 'PATENTS', 'decimal': 18},
{'chain_id': 1, 'address': b'\xb9\x70\x48\x62\x8d\xb6\xb6\x61\xd4\xc2\xaa\x83\x3e\x95\xdb\xe1\xa9\x05\xb2\x80', 'symbol': 'PAY', 'decimal': 18},
{'chain_id': 1, 'address': b'\x55\x64\x8d\xe1\x98\x36\x33\x85\x49\x13\x0b\x1a\xf5\x87\xf1\x6b\xea\x46\xf6\x6b', 'symbol': 'PBL', 'decimal': 18},
{'chain_id': 1, 'address': b'\xe6\x45\x09\xf0\xbf\x07\xce\x2d\x29\xa7\xef\x19\xa8\xa9\xbc\x06\x54\x77\xc1\xb4', 'symbol': 'PIPL', 'decimal': 8},
{'chain_id': 1, 'address': b'\x8e\xff\xd4\x94\xeb\x69\x8c\xc3\x99\xaf\x62\x31\xfc\xcd\x39\xe0\x8f\xd2\x0b\x15', 'symbol': 'PIX', 'decimal': 0},
{'chain_id': 1, 'address': b'\xe4\x77\x29\x2f\x1b\x32\x68\x68\x7a\x29\x37\x61\x16\xb0\xed\x27\xa9\xc7\x61\x70', 'symbol': 'PLAY', 'decimal': 18},
{'chain_id': 1, 'address': b'\x0a\xff\xa0\x6e\x7f\xbe\x5b\xc9\xa7\x64\xc9\x79\xaa\x66\xe8\x25\x6a\x63\x1f\x02', 'symbol': 'PLBT', 'decimal': 6},
{'chain_id': 1, 'address': b'\xe3\x81\x85\x04\xc1\xb3\x2b\xf1\x55\x7b\x16\xc2\x38\xb2\xe0\x1f\xd3\x14\x9c\x17', 'symbol': 'PLR', 'decimal': 18},
{'chain_id': 1, 'address': b'\xd8\x91\x2c\x10\x68\x1d\x8b\x21\xfd\x37\x42\x24\x4f\x44\x65\x8d\xba\x12\x26\x4e', 'symbol': 'PLU', 'decimal': 18},
{'chain_id': 1, 'address': b'\x0e\x09\x89\xb1\xf9\xb8\xa3\x89\x83\xc2\xba\x80\x53\x26\x9c\xa6\x2e\xc9\xb1\x95', 'symbol': 'POE', 'decimal': 8},
{'chain_id': 1, 'address': b'\x77\x9b\x7b\x71\x3c\x86\xe3\xe6\x77\x4f\x50\x40\xd9\xcc\xc2\xd4\x3a\xd3\x75\xf8', 'symbol': 'POOL', 'decimal': 8},
{'chain_id': 1, 'address': b'\xee\x60\x9f\xe2\x92\x12\x8c\xad\x03\xb7\x86\xdb\xb9\xbc\x26\x34\xcc\xdb\xe7\xfc', 'symbol': 'POS', 'decimal': 18},
{'chain_id': 1, 'address': b'\x59\x58\x32\xf8\xfc\x6b\xf5\x9c\x85\xc5\x27\xfe\xc3\x74\x0a\x1b\x7a\x36\x12\x69', 'symbol': 'POWR', 'decimal': 6},
{'chain_id': 1, 'address': b'\xc4\x22\x09\xac\xcc\x14\x02\x9c\x10\x12\xfb\x56\x80\xd9\x5f\xbd\x60\x36\xe2\xa0', 'symbol': 'PPP', 'decimal': 18},
{'chain_id': 1, 'address': b'\xd4\xfa\x14\x60\xf5\x37\xbb\x90\x85\xd2\x2c\x7b\xcc\xb5\xdd\x45\x0e\xf2\x8e\x3a', 'symbol': 'PPT', 'decimal': 8},
{'chain_id': 1, 'address': b'\x88\xa3\xe4\xf3\x5d\x64\xaa\xd4\x1a\x6d\x40\x30\xac\x9a\xfe\x43\x56\xcb\x84\xfa', 'symbol': 'PRE', 'decimal': 18},
{'chain_id': 1, 'address': b'\x77\x28\xdf\xef\x5a\xbd\x46\x86\x69\xeb\x7f\x9b\x48\xa7\xf7\x0a\x50\x1e\xd2\x9d', 'symbol': 'PRG', 'decimal': 6},
{'chain_id': 1, 'address': b'\x22\x6b\xb5\x99\xa1\x2c\x82\x64\x76\xe3\xa7\x71\x45\x46\x97\xea\x52\xe9\xe2\x20', 'symbol': 'PRO', 'decimal': 8},
{'chain_id': 1, 'address': b'\x16\x37\x33\xbc\xc2\x8d\xbf\x26\xb4\x1a\x8c\xfa\x83\xe3\x69\xb5\xb3\xaf\x74\x1b', 'symbol': 'PRS', 'decimal': 18},
{'chain_id': 1, 'address': b'\x0c\x04\xd4\xf3\x31\xda\x8d\xf7\x5f\x9e\x2e\x27\x1e\x3f\x3f\x14\x94\xc6\x6c\x36', 'symbol': 'PRSP', 'decimal': 9},
{'chain_id': 1, 'address': b'\x66\x49\x7a\x28\x3e\x0a\x00\x7b\xa3\x97\x4e\x83\x77\x84\xc6\xae\x32\x34\x47\xde', 'symbol': 'PT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x8a\xe4\xbf\x2c\x33\xa8\xe6\x67\xde\x34\xb5\x49\x38\xb0\xcc\xd0\x3e\xb8\xcc\x06', 'symbol': 'PTOY', 'decimal': 8},
{'chain_id': 1, 'address': b'\x67\x1a\xbb\xe5\xce\x65\x24\x91\x98\x53\x42\xe8\x54\x28\xeb\x1b\x07\xbc\x6c\x64', 'symbol': 'QAU', 'decimal': 8},
{'chain_id': 1, 'address': b'\x69\x7b\xea\xc2\x8b\x09\xe1\x22\xc4\x33\x2d\x16\x39\x85\xe8\xa7\x31\x21\xb9\x7f', 'symbol': 'QRL', 'decimal': 8},
{'chain_id': 1, 'address': b'\x99\xea\x4d\xb9\xee\x77\xac\xd4\x0b\x11\x9b\xd1\xdc\x4e\x33\xe1\xc0\x70\xb8\x0d', 'symbol': 'QSP', 'decimal': 18},
{'chain_id': 1, 'address': b'\x2c\x3c\x1f\x05\x18\x7d\xba\x7a\x5f\x2d\xd4\x7d\xca\x57\x28\x1c\x4d\x4f\x18\x3f', 'symbol': 'QTQ', 'decimal': 18},
{'chain_id': 1, 'address': b'\x9a\x64\x2d\x6b\x33\x68\xdd\xc6\x62\xca\x24\x4b\xad\xf3\x2c\xda\x71\x60\x05\xbc', 'symbol': 'QTUM', 'decimal': 18},
{'chain_id': 1, 'address': b'\x25\x5a\xa6\xdf\x07\x54\x0c\xb5\xd3\xd2\x97\xf0\xd0\xd4\xd8\x4c\xb5\x2b\xc8\xe6', 'symbol': 'RDN', 'decimal': 18},
{'chain_id': 1, 'address': b'\x5f\x53\xf7\xa8\x07\x56\x14\xb6\x99\xba\xad\x0b\xc2\xc8\x99\xf4\xba\xd8\xfb\xbf', 'symbol': 'REBL', 'decimal': 18},
{'chain_id': 1, 'address': b'\xe9\x43\x27\xd0\x7f\xc1\x79\x07\xb4\xdb\x78\x8e\x5a\xdf\x2e\xd4\x24\xad\xdf\xf6', 'symbol': 'REP', 'decimal': 18},
{'chain_id': 1, 'address': b'\x8f\x82\x21\xaf\xbb\x33\x99\x8d\x85\x84\xa2\xb0\x57\x49\xba\x73\xc3\x7a\x93\x8a', 'symbol': 'REQ', 'decimal': 18},
{'chain_id': 1, 'address': b'\xf0\x5a\x93\x82\xa4\xc3\xf2\x9e\x27\x84\x50\x27\x54\x29\x3d\x88\xb8\x35\x10\x9c', 'symbol': 'REX', 'decimal': 18},
{'chain_id': 1, 'address': b'\xdd\x00\x72\x78\xb6\x67\xf6\xbe\xf5\x2f\xd0\xa4\xc2\x36\x04\xaa\x1f\x96\x03\x9a', 'symbol': 'RIPT', 'decimal': 8},
{'chain_id': 1, 'address': b'\x60\x7f\x4c\x5b\xb6\x72\x23\x0e\x86\x72\x08\x55\x32\xf7\xe9\x01\x54\x4a\x73\x75', 'symbol': 'RLC', 'decimal': 9},
{'chain_id': 1, 'address': b'\xcc\xed\x5b\x82\x88\x08\x6b\xe8\xc3\x8e\x23\x56\x7e\x68\x4c\x37\x40\xbe\x4d\x48', 'symbol': 'RLT', 'decimal': 10},
{'chain_id': 1, 'address': b'\x4a\x42\xd2\xc5\x80\xf8\x3d\xce\x40\x4a\xca\xd1\x8d\xab\x26\xdb\x11\xa1\x75\x0e', 'symbol': 'RLX', 'decimal': 18},
{'chain_id': 1, 'address': b'\x09\x96\xbf\xb5\xd0\x57\xfa\xa2\x37\x64\x0e\x25\x06\xbe\x7b\x4f\x9c\x46\xde\x0b', 'symbol': 'RNDR', 'decimal': 18},
{'chain_id': 1, 'address': b'\xc9\xde\x4b\x7f\x0c\x3d\x99\x1e\x96\x71\x58\xe4\xd4\xbf\xa4\xb5\x1e\xc0\xb1\x14', 'symbol': 'ROK', 'decimal': 18},
{'chain_id': 1, 'address': b'\x49\x93\xcb\x95\xc7\x44\x3b\xdc\x06\x15\x5c\x5f\x56\x88\xbe\x9d\x8f\x69\x99\xa5', 'symbol': 'ROUND', 'decimal': 18},
{'chain_id': 1, 'address': b'\xb4\xef\xd8\x5c\x19\x99\x9d\x84\x25\x13\x04\xbd\xa9\x9e\x90\xb9\x23\x00\xbd\x93', 'symbol': 'RPL', 'decimal': 18},
{'chain_id': 1, 'address': b'\x3d\x1b\xa9\xbe\x9f\x66\xb8\xee\x10\x19\x11\xbc\x36\xd3\xfb\x56\x2e\xac\x22\x44', 'symbol': 'RVT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x1e\xc8\xfe\x51\xa9\xb6\xa3\xa6\xc4\x27\xd1\x7d\x9e\xcc\x30\x60\xfb\xc4\xa4\x5c', 'symbol': 'S-A-PAT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x3e\xb9\x1d\x23\x7e\x49\x1e\x0d\xee\x85\x82\xc4\x02\xd8\x5c\xb4\x40\xfb\x6b\x54', 'symbol': 'S-ETH', 'decimal': 18},
{'chain_id': 1, 'address': b'\x41\x56\xd3\x34\x2d\x5c\x38\x5a\x87\xd2\x64\xf9\x06\x53\x73\x35\x92\x00\x05\x81', 'symbol': 'SALT', 'decimal': 8},
{'chain_id': 1, 'address': b'\x7c\x5a\x0c\xe9\x26\x7e\xd1\x9b\x22\xf8\xca\xe6\x53\xf1\x98\xe3\xe8\xda\xf0\x98', 'symbol': 'SAN', 'decimal': 18},
{'chain_id': 1, 'address': b'\xd7\x63\x17\x87\xb4\xdc\xc8\x7b\x12\x54\xcf\xd1\xe5\xce\x48\xe9\x68\x23\xde\xe8', 'symbol': 'SCL', 'decimal': 8},
{'chain_id': 1, 'address': b'\x4c\xa7\x41\x85\x53\x2d\xc1\x78\x95\x27\x19\x4e\x5b\x9c\x86\x6d\xd3\x3f\x4e\x82', 'symbol': 'sense', 'decimal': 18},
{'chain_id': 1, 'address': b'\xe0\x6e\xda\x74\x35\xba\x74\x9b\x04\x73\x80\xce\xd4\x91\x21\xdd\xe9\x33\x34\xae', 'symbol': 'SET', 'decimal': 0},
{'chain_id': 1, 'address': b'\xe0\x6e\xda\x74\x35\xba\x74\x9b\x04\x73\x80\xce\xd4\x91\x21\xdd\xe9\x33\x34\xae', 'symbol': 'SET', 'decimal': 0},
{'chain_id': 1, 'address': b'\x98\xf5\xe9\xb7\xf0\xe3\x39\x56\xc0\x44\x3e\x81\xbf\x7d\xeb\x8b\x5b\x1e\xd5\x45', 'symbol': 'SEXY', 'decimal': 18},
{'chain_id': 1, 'address': b'\xd2\x48\xb0\xd4\x8e\x44\xaa\xf9\xc4\x9a\xea\x03\x12\xbe\x7e\x13\xa6\xdc\x14\x68', 'symbol': 'SGT', 'decimal': 1},
{'chain_id': 1, 'address': b'\xef\x2e\x99\x66\xeb\x61\xbb\x49\x4e\x53\x75\xd5\xdf\x8d\x67\xb7\xdb\x8a\x78\x0d', 'symbol': 'SHIT', 'decimal': 0},
{'chain_id': 1, 'address': b'\x8a\x18\x7d\x52\x85\xd3\x16\xbc\xbc\x9a\xda\xfc\x08\xb5\x1d\x70\xa0\xd8\xe0\x00', 'symbol': 'SIFT', 'decimal': 0},
{'chain_id': 1, 'address': b'\x2b\xdc\x0d\x42\x99\x60\x17\xfc\xe2\x14\xb2\x16\x07\xa5\x15\xda\x41\xa9\xe0\xc5', 'symbol': 'SKIN', 'decimal': 6},
{'chain_id': 1, 'address': b'\x49\x94\xe8\x18\x97\xa9\x20\xc0\xfe\xa2\x35\xeb\x8c\xed\xee\xd3\xc6\xff\xf6\x97', 'symbol': 'SKO1', 'decimal': 18},
{'chain_id': 1, 'address': b'\x4c\x38\x2f\x8e\x09\x61\x5a\xc8\x6e\x08\xce\x58\x26\x6c\xc2\x27\xe7\xd4\xd9\x13', 'symbol': 'SKR', 'decimal': 6},
{'chain_id': 1, 'address': b'\x7a\x5f\xf2\x95\xdc\x82\x39\xd5\xc2\x37\x4e\x4d\x89\x42\x02\xaa\xf0\x29\xca\xb6', 'symbol': 'SLT', 'decimal': 3},
{'chain_id': 1, 'address': b'\x6f\x6d\xeb\x5d\xb0\xc4\x99\x4a\x82\x83\xa0\x1d\x6c\xfe\xeb\x27\xfc\x3b\xbe\x9c', 'symbol': 'Smart', 'decimal': 0},
{'chain_id': 1, 'address': b'\xf4\x13\x41\x46\xaf\x2d\x51\x1d\xd5\xea\x8c\xdb\x1c\x4a\xc8\x8c\x57\xd6\x04\x04', 'symbol': 'SNC', 'decimal': 18},
{'chain_id': 1, 'address': b'\xf3\x33\xb2\xac\xe9\x92\xac\x2b\xbd\x87\x98\xbf\x57\xbc\x65\xa0\x61\x84\xaf\xba', 'symbol': 'SND', 'decimal': 0},
{'chain_id': 1, 'address': b'\xae\xc2\xe8\x7e\x0a\x23\x52\x66\xd9\xc5\xad\xc9\xde\xb4\xb2\xe2\x9b\x54\xd0\x09', 'symbol': 'SNGLS', 'decimal': 0},
{'chain_id': 1, 'address': b'\x44\xf5\x88\xae\xeb\x8c\x44\x47\x14\x39\xd1\x27\x0b\x36\x03\xc6\x6a\x92\x62\xf1', 'symbol': 'SNIP', 'decimal': 18},
{'chain_id': 1, 'address': b'\x98\x3f\x6d\x60\xdb\x79\xea\x8c\xa4\xeb\x99\x68\xc6\xaf\xf8\xcf\xa0\x4b\x3c\x63', 'symbol': 'SNM', 'decimal': 18},
{'chain_id': 1, 'address': b'\x74\x4d\x70\xfd\xbe\x2b\xa4\xcf\x95\x13\x16\x26\x61\x4a\x17\x63\xdf\x80\x5b\x9e', 'symbol': 'SNT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x58\xbf\x7d\xf5\x7d\x9d\xa7\x11\x3c\x4c\xcb\x49\xd8\x46\x3d\x49\x08\xc7\x35\xcb', 'symbol': 'SPARC', 'decimal': 18},
{'chain_id': 1, 'address': b'\x24\xae\xf3\xbf\x1a\x47\x56\x15\x00\xf9\x43\x0d\x74\xed\x40\x97\xc4\x7f\x51\xf2', 'symbol': 'SPARTA', 'decimal': 4},
{'chain_id': 1, 'address': b'\x85\x08\x93\x89\xc1\x4b\xd9\xc7\x7f\xc2\xb8\xf0\xc3\xd1\xdc\x33\x63\xbf\x06\xef', 'symbol': 'SPF', 'decimal': 18},
{'chain_id': 1, 'address': b'\x68\xd5\x7c\x9a\x1c\x35\xf6\x3e\x2c\x83\xee\x8e\x49\xa6\x4e\x9d\x70\x52\x8d\x25', 'symbol': 'SRN', 'decimal': 18},
{'chain_id': 1, 'address': b'\x2c\x4e\x8f\x2d\x74\x61\x13\xd0\x69\x6c\xe8\x9b\x35\xf0\xd8\xbf\x88\xe0\xae\xca', 'symbol': 'ST', 'decimal': 18},
{'chain_id': 1, 'address': b'\xf7\x0a\x64\x2b\xd3\x87\xf9\x43\x80\xff\xb9\x04\x51\xc2\xc8\x1d\x4e\xb8\x2c\xbc', 'symbol': 'STAR', 'decimal': 18},
{'chain_id': 1, 'address': b'\x59\x93\x46\x77\x9e\x90\xfc\x3f\x5f\x99\x7b\x5e\xa7\x15\x34\x98\x20\xf9\x15\x71', 'symbol': 'STN', 'decimal': 4},
{'chain_id': 1, 'address': b'\xb6\x4e\xf5\x1c\x88\x89\x72\xc9\x08\xcf\xac\xf5\x9b\x47\xc1\xaf\xbc\x0a\xb8\xac', 'symbol': 'STORJ', 'decimal': 8},
{'chain_id': 1, 'address': b'\xd0\xa4\xb8\x94\x6c\xb5\x2f\x06\x61\x27\x3b\xfb\xc6\xfd\x0e\x0c\x75\xfc\x64\x33', 'symbol': 'STORM', 'decimal': 18},
{'chain_id': 1, 'address': b'\x46\x49\x24\x73\x75\x5e\x8d\xf9\x60\xf8\x03\x48\x77\xf6\x17\x32\xd7\x18\xce\x96', 'symbol': 'STRC', 'decimal': 8},
{'chain_id': 1, 'address': b'\x00\x6b\xea\x43\xba\xa3\xf7\xa6\xf7\x65\xf1\x4f\x10\xa1\xa1\xb0\x83\x34\xef\x45', 'symbol': 'STX', 'decimal': 18},
{'chain_id': 1, 'address': b'\x12\x48\x0e\x24\xeb\x5b\xec\x1a\x9d\x43\x69\xca\xb6\xa8\x0c\xad\x3c\x0a\x37\x7a', 'symbol': 'SUB', 'decimal': 2},
{'chain_id': 1, 'address': b'\xb9\xe7\xf8\x56\x8e\x08\xd5\x65\x9f\x5d\x29\xc4\x99\x71\x73\xd8\x4c\xdf\x26\x07', 'symbol': 'SWT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x55\x4c\x98\xb3\xec\x77\x2f\x79\xee\x5b\x96\xd4\x7a\x1d\x10\x85\x2e\xd2\x74\xc8', 'symbol': 'SXD', 'decimal': 18},
{'chain_id': 1, 'address': b'\x6c\xee\x94\x8c\x9d\x59\x3c\x58\xcb\xa5\xdf\xa7\x04\x82\x44\x48\x99\xd1\x34\x1c', 'symbol': 'SXS', 'decimal': 18},
{'chain_id': 1, 'address': b'\xaa\xdb\x05\xf4\x49\x07\x2d\x27\x58\x33\xba\xf7\xc8\x2e\x8f\xca\x4e\xe4\x65\x75', 'symbol': 'SXU', 'decimal': 18},
{'chain_id': 1, 'address': b'\x10\xb1\x23\xfd\xdd\xe0\x03\x24\x31\x99\xaa\xd0\x35\x22\x06\x5d\xc0\x58\x27\xa0', 'symbol': 'SYN', 'decimal': 18},
{'chain_id': 1, 'address': b'\xe7\x77\x5a\x6e\x9b\xcf\x90\x4e\xb3\x9d\xa2\xb6\x8c\x5e\xfb\x4f\x93\x60\xe0\x8c', 'symbol': 'TaaS', 'decimal': 6},
{'chain_id': 1, 'address': b'\xfa\xcc\xd5\xfc\x83\xc3\xe4\xc3\xc1\xac\x1e\xf3\x5d\x15\xad\xf0\x6b\xcf\x20\x9c', 'symbol': 'TBC2', 'decimal': 8},
{'chain_id': 1, 'address': b'\xaf\xe6\x05\x11\x34\x1a\x37\x48\x8d\xe2\x5b\xef\x35\x19\x52\x56\x2e\x31\xfc\xc1', 'symbol': 'TBT', 'decimal': 8},
{'chain_id': 1, 'address': b'\xa7\xf9\x76\xc3\x60\xeb\xbe\xd4\x46\x5c\x28\x55\x68\x4d\x1a\xae\x52\x71\xef\xa9', 'symbol': 'TFL', 'decimal': 8},
{'chain_id': 1, 'address': b'\x65\x31\xf1\x33\xe6\xde\xeb\xe7\xf2\xdc\xe5\xa0\x44\x1a\xa7\xef\x33\x0b\x4e\x53', 'symbol': 'TIME', 'decimal': 8},
{'chain_id': 1, 'address': b'\x80\xbc\x55\x12\x56\x1c\x7f\x85\xa3\xa9\x50\x8c\x7d\xf7\x90\x1b\x37\x0f\xa1\xdf', 'symbol': 'TIO', 'decimal': 18},
{'chain_id': 1, 'address': b'\xea\x1f\x34\x6f\xaf\x02\x3f\x97\x4e\xb5\xad\xaf\x08\x8b\xbc\xdf\x02\xd7\x61\xf4', 'symbol': 'TIX', 'decimal': 18},
{'chain_id': 1, 'address': b'\xaa\xaf\x91\xd9\xb9\x0d\xf8\x00\xdf\x4f\x55\xc2\x05\xfd\x69\x89\xc9\x77\xe7\x3a', 'symbol': 'TKN', 'decimal': 8},
{'chain_id': 1, 'address': b'\x08\xf5\xa9\x23\x5b\x08\x17\x3b\x75\x69\xf8\x36\x45\xd2\xc7\xfb\x55\xe8\xcc\xd8', 'symbol': 'TNT', 'decimal': 8},
{'chain_id': 1, 'address': b'\xcb\x94\xbe\x6f\x13\xa1\x18\x2e\x4a\x4b\x61\x40\xcb\x7b\xf2\x02\x5d\x28\xe4\x1b', 'symbol': 'TRST', 'decimal': 6},
{'chain_id': 1, 'address': b'\xf2\x30\xb7\x90\xe0\x53\x90\xfc\x82\x95\xf4\xd3\xf6\x03\x32\xc9\x3b\xed\x42\xe2', 'symbol': 'TRX', 'decimal': 6},
{'chain_id': 1, 'address': b'\x24\x69\x27\x91\xbc\x44\x4c\x5c\xd0\xb8\x1e\x3c\xbc\xab\xa4\xb0\x4a\xcd\x1f\x3b', 'symbol': 'UKG', 'decimal': 18},
{'chain_id': 1, 'address': b'\x89\x20\x5a\x3a\x3b\x2a\x69\xde\x6d\xbf\x7f\x01\xed\x13\xb2\x10\x8b\x2c\x43\xe7', 'symbol': 'UNCRN', 'decimal': 0},
{'chain_id': 1, 'address': b'\xd0\x1d\xb7\x3e\x04\x78\x55\xef\xb4\x14\xe6\x20\x20\x98\xc4\xbe\x4c\xd2\x42\x3b', 'symbol': 'UQC', 'decimal': 18},
{'chain_id': 1, 'address': b'\xeb\xed\x4f\xf9\xfe\x34\x41\x3d\xb8\xfc\x82\x94\x55\x6b\xbd\x15\x28\xa4\xda\xca', 'symbol': 'VENUS', 'decimal': 3},
{'chain_id': 1, 'address': b'\x8f\x34\x70\xa7\x38\x8c\x05\xee\x4e\x7a\xf3\xd0\x1d\x8c\x72\x2b\x0f\xf5\x23\x74', 'symbol': 'VERI', 'decimal': 18},
{'chain_id': 1, 'address': b'\xd8\x50\x94\x2e\xf8\x81\x1f\x2a\x86\x66\x92\xa6\x23\x01\x1b\xde\x52\xa4\x62\xc1', 'symbol': 'VET', 'decimal': 18},
{'chain_id': 1, 'address': b'\x2c\x97\x4b\x2d\x0b\xa1\x71\x6e\x64\x4c\x1f\xc5\x99\x82\xa8\x9d\xdd\x2f\xf7\x24', 'symbol': 'VIB', 'decimal': 18},
{'chain_id': 1, 'address': b'\xe8\xff\x5c\x9c\x75\xde\xb3\x46\xac\xac\x49\x3c\x46\x3c\x89\x50\xbe\x03\xdf\xba', 'symbol': 'VIBE', 'decimal': 18},
{'chain_id': 1, 'address': b'\x88\x24\x48\xf8\x3d\x90\xb2\xbf\x47\x7a\xf2\xea\x79\x32\x7f\xde\xa1\x33\x5d\x93', 'symbol': 'VIBEX', 'decimal': 18},
{'chain_id': 1, 'address': b'\x51\x94\x75\xb3\x16\x53\xe4\x6d\x20\xcd\x09\xf9\xfd\xcf\x3b\x12\xbd\xac\xb4\xf5', 'symbol': 'VIU', 'decimal': 18},
{'chain_id': 1, 'address': b'\x83\xee\xa0\x0d\x83\x8f\x92\xde\xc4\xd1\x47\x56\x97\xb9\xf4\xd3\x53\x7b\x56\xe3', 'symbol': 'VOISE', 'decimal': 8},
{'chain_id': 1, 'address': b'\xed\xba\xf3\xc5\x10\x03\x02\xdc\xdd\xa5\x32\x69\x32\x2f\x37\x30\xb1\xf0\x41\x6d', 'symbol': 'VRS', 'decimal': 5},
{'chain_id': 1, 'address': b'\x5c\x54\x3e\x7a\xe0\xa1\x10\x4f\x78\x40\x6c\x34\x0e\x9c\x64\xfd\x9f\xce\x51\x70', 'symbol': 'VSL', 'decimal': 18},
{'chain_id': 1, 'address': b'\x82\x66\x57\x64\xea\x0b\x58\x15\x7e\x1e\x5e\x9b\xab\x32\xf6\x8c\x76\xec\x0c\xdf', 'symbol': 'VSM(OLD)', 'decimal': 0},
{'chain_id': 1, 'address': b'\x28\x6b\xda\x14\x13\xa2\xdf\x81\x73\x1d\x49\x30\xce\x2f\x86\x2a\x35\xa6\x09\xfe', 'symbol': 'WaBi', 'decimal': 18},
{'chain_id': 1, 'address': b'\x74\x95\x1b\x67\x7d\xe3\x2d\x59\x6e\xe8\x51\xa2\x33\x33\x69\x26\xe6\xa2\xcd\x09', 'symbol': 'WBA', 'decimal': 7},
{'chain_id': 1, 'address': b'\x6a\x0a\x97\xe4\x7d\x15\xaa\xd1\xd1\x32\xa1\xac\x79\xa4\x80\xe3\xf2\x07\x90\x63', 'symbol': 'WCT', 'decimal': 18},
{'chain_id': 1, 'address': b'\x5e\x4a\xbe\x64\x19\x65\x0c\xa8\x39\xce\x5b\xb7\xdb\x42\x2b\x88\x1a\x60\x64\xbb', 'symbol': 'WiC', 'decimal': 18},
{'chain_id': 1, 'address': b'\x66\x70\x88\xb2\x12\xce\x3d\x06\xa1\xb5\x53\xa7\x22\x1e\x1f\xd1\x90\x00\xd9\xaf', 'symbol': 'WINGS', 'decimal': 18},
{'chain_id': 1, 'address': b'\xf6\xb5\x5a\xcb\xbc\x49\xf4\x52\x4a\xa4\x8d\x19\x28\x1a\x9a\x77\xc5\x4d\xe1\x0f', 'symbol': 'WLK', 'decimal': 18},
{'chain_id': 1, 'address': b'\x72\x87\x81\xe7\x57\x35\xdc\x09\x62\xdf\x3a\x51\xd7\xef\x47\xe7\x98\xa7\x10\x7e', 'symbol': 'WOLK', 'decimal': 18},
{'chain_id': 1, 'address': b'\x62\x08\x72\x45\x08\x71\x25\xd3\xdb\x5b\x9a\x3d\x71\x3d\x78\xe7\xbb\xc3\x1e\x54', 'symbol': 'WPC', 'decimal': 18},
{'chain_id': 1, 'address': b'\x91\x0d\xfc\x18\xd6\xea\x3d\x6a\x71\x24\xa6\xf8\xb5\x45\x8f\x28\x10\x60\xfa\x4c', 'symbol': 'X8X', 'decimal': 18},
{'chain_id': 1, 'address': b'\x4d\xf8\x12\xf6\x06\x4d\xef\x1e\x5e\x02\x9f\x1c\xa8\x58\x77\x7c\xc9\x8d\x2d\x81', 'symbol': 'XAUR', 'decimal': 8},
{'chain_id': 1, 'address': b'\x53\x3e\xf0\x98\x4b\x2f\xaa\x22\x7a\xcc\x62\x0c\x67\xcc\xe1\x2a\xa3\x9c\xd8\xcd', 'symbol': 'XGM', 'decimal': 8},
{'chain_id': 1, 'address': b'\x30\xf4\xa3\xe0\xab\x7a\x76\x73\x3d\x8b\x60\xb8\x9d\xd9\x3c\x3d\x0b\x4c\x9e\x2f', 'symbol': 'XGT', 'decimal': 18},
{'chain_id': 1, 'address': b'\xb1\x10\xec\x7b\x1d\xcb\x8f\xab\x8d\xed\xbf\x28\xf5\x3b\xc6\x3e\xa5\xbe\xdd\x84', 'symbol': 'XID', 'decimal': 8},
{'chain_id': 1, 'address': b'\xab\x95\xe9\x15\xc1\x23\xfd\xed\x5b\xdf\xb6\x32\x5e\x35\xef\x55\x15\xf1\xea\x69', 'symbol': 'XNN', 'decimal': 18},
{'chain_id': 1, 'address': b'\xb2\x47\x54\xbe\x79\x28\x15\x53\xdc\x1a\xdc\x16\x0d\xdf\x5c\xd9\xb7\x43\x61\xa4', 'symbol': 'XRL', 'decimal': 9},
{'chain_id': 1, 'address': b'\x0f\x51\x3f\xfb\x49\x26\xff\x82\xd7\xf6\x0a\x05\x06\x90\x47\xac\xa2\x95\xc4\x13', 'symbol': 'XSC', 'decimal': 18},
{'chain_id': 1, 'address': b'\x0f\x33\xbb\x20\xa2\x82\xa7\x64\x9c\x7b\x3a\xff\x64\x4f\x08\x4a\x93\x48\xe9\x33', 'symbol': 'YUPIE', 'decimal': 18},
{'chain_id': 1, 'address': b'\x67\x81\xa0\xf8\x4c\x7e\x9e\x84\x6d\xcb\x84\xa9\xa5\xbd\x49\x33\x30\x67\xb1\x04', 'symbol': 'ZAP', 'decimal': 18},
{'chain_id': 1, 'address': b'\xe4\x1d\x24\x89\x57\x1d\x32\x21\x89\x24\x6d\xaf\xa5\xeb\xde\x1f\x46\x99\xf4\x98', 'symbol': 'ZRX', 'decimal': 18},
{'chain_id': 1, 'address': b'\xe3\x86\xb1\x39\xed\x37\x15\xca\x4b\x18\xfd\x52\x67\x1b\xdc\xea\x1c\xdf\xe4\xb1', 'symbol': 'ZST', 'decimal': 8},
{'chain_id': 1, 'address': b'\x59\x41\x6a\x25\x62\x8a\x76\xb4\x73\x0e\xc5\x14\x86\x11\x4c\x32\xe0\xb5\x82\xa1', 'symbol': 'PLASMA', 'decimal': 6},
# ropsten
{'chain_id': 3, 'address': b'\x95\xd7\x32\x1e\xdc\xe5\x19\x41\x9b\xa1\xdb\xc6\x0a\x89\xba\xfb\xf5\x5e\xac\x0d', 'symbol': 'PLASMA', 'decimal': 6},
# rinkeby
{'chain_id': 4, 'address': b'\xa5\x28\x32\xa0\xb3\xeb\xfa\xef\x62\x9b\x1a\x44\xa9\x22\xf4\x6c\x90\x44\x51\x08', 'symbol': 'PLASMA', 'decimal': 6},
# ubq
{'chain_id': 8, 'address': b'\xd2\x45\x20\x7c\xfb\xf6\xeb\x6f\x34\x97\x0d\xb2\xa8\x07\xab\x1d\x17\x8f\xde\x6c', 'symbol': 'APX', 'decimal': 8},
{'chain_id': 8, 'address': b'\xff\x3b\xf0\x57\xad\xf3\xb0\xe0\x15\xb6\x46\x53\x31\xa6\x23\x6e\x55\x68\x82\x74', 'symbol': 'BEER', 'decimal': 0},
{'chain_id': 8, 'address': b'\x08\x53\x3d\x6a\x06\xce\x36\x52\x98\xb1\x2e\xf9\x2e\xb4\x07\xcb\xa8\xaa\x82\x73', 'symbol': 'CEFS', 'decimal': 8},
{'chain_id': 8, 'address': b'\x94\xad\x7e\x41\xc1\xd4\x40\x22\xc4\xf4\x7c\xb1\xba\x01\x9f\xd1\xa0\x22\xc5\x36', 'symbol': 'DOT', 'decimal': 8},
{'chain_id': 8, 'address': b'\x4b\x48\x99\xa1\x0f\x3e\x50\x7d\xb2\x07\xb0\xee\x24\x26\x02\x9e\xfa\x16\x8a\x67', 'symbol': 'QWARK', 'decimal': 8},
{'chain_id': 8, 'address': b'\x5e\x17\x15\xbb\x79\x80\x5b\xd6\x72\x72\x97\x60\xb3\xf7\xf3\x4d\x6f\x48\x50\x98', 'symbol': 'RICKS', 'decimal': 8},
# kovan
{'chain_id': 42, 'address': b'\x86\x67\x55\x92\x54\x24\x1d\xde\xd4\xd1\x13\x92\xf8\x68\xd7\x20\x92\x76\x53\x67', 'symbol': 'Aeternity', 'decimal': 18},
{'chain_id': 42, 'address': b'\x3c\x67\xf7\xd4\xde\xcf\x77\x95\x22\x5f\x51\xb5\x41\x34\xf8\x11\x37\x38\x5f\x83', 'symbol': 'GUP', 'decimal': 3},
{'chain_id': 42, 'address': b'\xbd\x28\x7b\x43\x98\xb2\x48\x03\x21\x83\x99\x42\x29\xf5\xf6\xa9\xfd\xac\x98\xb1', 'symbol': 'PLASMA', 'decimal': 6},
# etc
{'chain_id': 61, 'address': b'\x08\x5f\xb4\xf2\x40\x31\xea\xed\xbc\x2b\x61\x1a\xa5\x28\xf2\x23\x43\xeb\x52\xdb', 'symbol': 'BEC', 'decimal': 8},
{'chain_id': 61, 'address': b'\x6f\x6d\xeb\x5d\xb0\xc4\x99\x4a\x82\x83\xa0\x1d\x6c\xfe\xeb\x27\xfc\x3b\xbe\x9c', 'symbol': 'Smart', 'decimal': 0},
]

View File

@ -23,6 +23,8 @@ def encode_length(l: int, is_list: bool) -> bytes:
def encode(data) -> bytes:
if isinstance(data, int):
return encode(int_to_bytes(data))
if isinstance(data, bytearray):
data = bytes(data)
if isinstance(data, bytes):
if len(data) == 1 and ord(data) < 128:
return data
@ -34,4 +36,4 @@ def encode(data) -> bytes:
output += encode(item)
return encode_length(len(output), is_list=True) + output
else:
raise TypeError('Invalid input')
raise TypeError('Invalid input of type ' + str(type(data)))

View File

@ -0,0 +1,30 @@
from common import *
from apps.ethereum import ethereum_sign_tx
class TestEthereumSignTx(unittest.TestCase):
def test_format(self):
text = ethereum_sign_tx.format_amount((1).to_bytes(5, 'little'), None, 1)
self.assertEqual(text, '1 Wei')
text = ethereum_sign_tx.format_amount((1000).to_bytes(5, 'little'), None, 1)
self.assertEqual(text, '1000 Wei')
text = ethereum_sign_tx.format_amount((1000000000000000001).to_bytes(20, 'little'), None, 1)
self.assertEqual(text, '1 ETH')
text = ethereum_sign_tx.format_amount((10000000000000000001).to_bytes(20, 'little'), None, 1)
self.assertEqual(text, '10 ETH')
text = ethereum_sign_tx.format_amount((10000000000000000001).to_bytes(20, 'little'), None, 61)
self.assertEqual(text, '10 ETC')
text = ethereum_sign_tx.format_amount((1000000000000000001).to_bytes(20, 'little'), None, 31)
self.assertEqual(text, '1 tRSK')
# unknown chain
text = ethereum_sign_tx.format_amount((1).to_bytes(20, 'little'), None, 9999)
self.assertEqual(text, '1 Wei')
text = ethereum_sign_tx.format_amount((10000000000000000001).to_bytes(20, 'little'), None, 9999)
self.assertEqual(text, '10 UNKN')
if __name__ == '__main__':
unittest.main()

View File

@ -0,0 +1,26 @@
from common import *
from apps.ethereum import tokens
class TestEthereumTokens(unittest.TestCase):
def test_token_by_chain_address(self):
token = tokens.token_by_chain_address(1, b'\x7d\xd7\xf5\x6d\x69\x7c\xc0\xf2\xb5\x2b\xd5\x5c\x05\x7f\x37\x8f\x1f\xe6\xab\x4b')
self.assertEqual(token['symbol'], '$TEAK')
token = tokens.token_by_chain_address(1, b'\x59\x41\x6a\x25\x62\x8a\x76\xb4\x73\x0e\xc5\x14\x86\x11\x4c\x32\xe0\xb5\x82\xa1')
self.assertEqual(token['symbol'], 'PLASMA')
self.assertEqual(token['decimal'], 6)
token = tokens.token_by_chain_address(3, b'\x95\xd7\x32\x1e\xdc\xe5\x19\x41\x9b\xa1\xdb\xc6\x0a\x89\xba\xfb\xf5\x5e\xac\x0d')
self.assertEqual(token['symbol'], 'PLASMA')
self.assertEqual(token['decimal'], 6)
token = tokens.token_by_chain_address(8, b'\x4b\x48\x99\xa1\x0f\x3e\x50\x7d\xb2\x07\xb0\xee\x24\x26\x02\x9e\xfa\x16\x8a\x67')
self.assertEqual(token['symbol'], 'QWARK')
# invalid adress, invalid chain
token = tokens.token_by_chain_address(999, b'\x00\xFF')
self.assertEqual(token, None)
if __name__ == '__main__':
unittest.main()