quote.py (2708B)
1 # standard imports 2 import logging 3 import os 4 import enum 5 6 # external imports 7 from chainlib.eth.constant import ZERO_ADDRESS 8 from chainlib.eth.constant import ZERO_CONTENT 9 from chainlib.eth.contract import ( 10 ABIContractEncoder, 11 ABIContractDecoder, 12 ABIContractType, 13 abi_decode_single, 14 ) 15 from chainlib.eth.jsonrpc import to_blockheight_param 16 from chainlib.eth.error import RequestMismatchException 17 from chainlib.eth.tx import ( 18 TxFactory, 19 TxFormat, 20 ) 21 from chainlib.jsonrpc import JSONRPCRequest 22 from chainlib.block import BlockSpec 23 from hexathon import ( 24 add_0x, 25 strip_0x, 26 ) 27 from chainlib.eth.cli.encode import CLIEncoder 28 29 # local imports 30 from erc20_pool.data import data_dir 31 32 logg = logging.getLogger() 33 34 35 class DecimalQuote(TxFactory): 36 37 __abi = None 38 __bytecode = None 39 40 def constructor(self, sender_address, tx_format=TxFormat.JSONRPC, version=None): 41 code = self.cargs(version=version) 42 tx = self.template(sender_address, None, use_nonce=True) 43 tx = self.set_code(tx, code) 44 return self.finalize(tx, tx_format) 45 46 47 @staticmethod 48 def cargs(version=None): 49 code = DecimalQuote.bytecode(version=version) 50 enc = ABIContractEncoder() 51 args = enc.get() 52 code += args 53 logg.debug('constructor code: ' + args) 54 return code 55 56 57 @staticmethod 58 def gas(code=None): 59 return 4000000 60 61 62 @staticmethod 63 def abi(): 64 if DecimalQuote.__abi == None: 65 f = open(os.path.join(data_dir, 'DecimalQuote.json'), 'r') 66 DecimalQuote.__abi = json.load(f) 67 f.close() 68 return DecimalQuote.__abi 69 70 71 @staticmethod 72 def bytecode(version=None): 73 if DecimalQuote.__bytecode == None: 74 f = open(os.path.join(data_dir, 'DecimalQuote.bin')) 75 DecimalQuote.__bytecode = f.read() 76 f.close() 77 return DecimalQuote.__bytecode 78 79 80 def value_for(self, contract_address, token_address_out, token_address_in, value_in, sender_address=ZERO_ADDRESS, id_generator=None): 81 j = JSONRPCRequest(id_generator) 82 o = j.template() 83 o['method'] = 'eth_call' 84 enc = ABIContractEncoder() 85 enc.method('valueFor') 86 enc.typ(ABIContractType.ADDRESS) 87 enc.typ(ABIContractType.ADDRESS) 88 enc.typ(ABIContractType.UINT256) 89 enc.address(token_address_out) 90 enc.address(token_address_in) 91 enc.uint256(value_in) 92 data = add_0x(enc.get()) 93 tx = self.template(sender_address, contract_address) 94 tx = self.set_code(tx, data) 95 o['params'].append(self.normalize(tx)) 96 o['params'].append('latest') 97 o = j.finalize(o) 98 return o