erc20-pool

Permissioned ERC20 swap pool for EVM
Info | Log | Files | Refs | README

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