add.py (2723B)
1 """Adds a new token to the token symbol index 2 3 .. moduleauthor:: Louis Holbrook <dev@holbrook.no> 4 .. pgp:: 0826EDA1702D1E87C6E2875121D2E7BB88C2A746 5 6 """ 7 8 # standard imports 9 import sys 10 import os 11 import json 12 import argparse 13 import logging 14 import hashlib 15 16 # external imports 17 import chainlib.eth.cli 18 from chainlib.chain import ChainSpec 19 from chainlib.eth.tx import receipt 20 from eth_erc20 import ERC20 21 from chainlib.eth.address import to_checksum_address 22 from hexathon import add_0x 23 24 # local imports 25 from eth_token_index import TokenUniqueSymbolIndex 26 27 logging.basicConfig(level=logging.WARNING) 28 logg = logging.getLogger() 29 30 arg_flags = chainlib.eth.cli.argflag_std_write | chainlib.eth.cli.Flag.EXEC 31 argparser = chainlib.eth.cli.ArgumentParser(arg_flags) 32 argparser.add_argument('token_address', type=str, help='Token address to add to index') 33 args = argparser.parse_args() 34 35 extra_args = { 36 'token_address': None, 37 } 38 config = chainlib.eth.cli.Config.from_args(args, arg_flags, extra_args=extra_args, default_fee_limit=TokenUniqueSymbolIndex.gas()) 39 40 wallet = chainlib.eth.cli.Wallet() 41 wallet.from_config(config) 42 43 rpc = chainlib.eth.cli.Rpc(wallet=wallet) 44 conn = rpc.connect_by_config(config) 45 46 chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC')) 47 48 49 def main(): 50 signer = rpc.get_signer() 51 signer_address = rpc.get_sender_address() 52 53 gas_oracle = rpc.get_gas_oracle() 54 nonce_oracle = rpc.get_nonce_oracle() 55 56 c = TokenUniqueSymbolIndex(chain_spec, signer=signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle) 57 58 token_address = to_checksum_address(config.get('_TOKEN_ADDRESS')) 59 if not config.true('_UNSAFE') and token_address != add_0x(config.get('_TOKEN_ADDRESS')): 60 raise ValueError('invalid checksum address for token_address') 61 62 contract_address = to_checksum_address(config.get('_EXEC_ADDRESS')) 63 if not config.true('_UNSAFE') and contract_address != add_0x(config.get('_EXEC_ADDRESS')): 64 raise ValueError('invalid checksum address for contract') 65 66 (tx_hash_hex, o) = c.register(contract_address, signer_address, token_address) 67 68 if config.get('_RPC_SEND'): 69 conn.do(o) 70 if config.get('_WAIT'): 71 r = conn.wait(tx_hash_hex) 72 if r['status'] == 0: 73 sys.stderr.write('EVM revert while deploying contract. Wish I had more to tell you') 74 sys.exit(1) 75 76 c = ERC20(chain_spec) 77 o = c.symbol(token_address) 78 r = conn.do(o) 79 token_symbol = ERC20.parse_symbol(r) 80 81 logg.info('added token {} at {} to token index {}'.format(token_symbol, token_address, contract_address)) 82 83 print(tx_hash_hex) 84 else: 85 print(o) 86 87 88 if __name__ == '__main__': 89 main()