Add gas cache oracle connection for erc20
This commit is contained in:
parent
258ed420b8
commit
6ca3fd55d7
18
apps/cic-eth/cic_eth/check/start.py
Normal file
18
apps/cic-eth/cic_eth/check/start.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# external imports
|
||||||
|
from chainlib.chain import ChainSpec
|
||||||
|
|
||||||
|
# local imports
|
||||||
|
from cic_eth.admin.ctrl import check_lock
|
||||||
|
from cic_eth.enum import LockEnum
|
||||||
|
from cic_eth.error import LockedError
|
||||||
|
|
||||||
|
|
||||||
|
def health(*args, **kwargs):
|
||||||
|
config = kwargs['config']
|
||||||
|
chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC'))
|
||||||
|
|
||||||
|
try:
|
||||||
|
check_lock(None, chain_spec.asdict(), LockEnum.START)
|
||||||
|
except LockedError as e:
|
||||||
|
return False
|
||||||
|
return True
|
@ -2,5 +2,5 @@
|
|||||||
registry_address =
|
registry_address =
|
||||||
trust_address =
|
trust_address =
|
||||||
default_token_symbol =
|
default_token_symbol =
|
||||||
health_modules = cic_eth.check.db,cic_eth.check.start,cic_eth.check.redis,cic_eth.check.signer,cic_eth.check.gas
|
health_modules = cic_eth.check.db,cic_eth.check.redis,cic_eth.check.signer,cic_eth.check.gas,cic_eth.check.start
|
||||||
run_dir = /run
|
run_dir = /run
|
||||||
|
@ -136,7 +136,7 @@ def register(self, account_address, chain_spec_dict, writer_address=None):
|
|||||||
# Generate and sign transaction
|
# Generate and sign transaction
|
||||||
rpc_signer = RPCConnection.connect(chain_spec, 'signer')
|
rpc_signer = RPCConnection.connect(chain_spec, 'signer')
|
||||||
nonce_oracle = CustodialTaskNonceOracle(writer_address, self.request.root_id, session=session) #, default_nonce)
|
nonce_oracle = CustodialTaskNonceOracle(writer_address, self.request.root_id, session=session) #, default_nonce)
|
||||||
gas_oracle = self.create_gas_oracle(rpc, AccountRegistry.gas)
|
gas_oracle = self.create_gas_oracle(rpc, code_callback=AccountRegistry.gas)
|
||||||
account_registry = AccountsIndex(chain_spec, signer=rpc_signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle)
|
account_registry = AccountsIndex(chain_spec, signer=rpc_signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle)
|
||||||
(tx_hash_hex, tx_signed_raw_hex) = account_registry.add(account_registry_address, writer_address, account_address, tx_format=TxFormat.RLP_SIGNED)
|
(tx_hash_hex, tx_signed_raw_hex) = account_registry.add(account_registry_address, writer_address, account_address, tx_format=TxFormat.RLP_SIGNED)
|
||||||
rpc_signer.disconnect()
|
rpc_signer.disconnect()
|
||||||
@ -192,7 +192,7 @@ def gift(self, account_address, chain_spec_dict):
|
|||||||
# Generate and sign transaction
|
# Generate and sign transaction
|
||||||
rpc_signer = RPCConnection.connect(chain_spec, 'signer')
|
rpc_signer = RPCConnection.connect(chain_spec, 'signer')
|
||||||
nonce_oracle = CustodialTaskNonceOracle(account_address, self.request.root_id, session=session) #, default_nonce)
|
nonce_oracle = CustodialTaskNonceOracle(account_address, self.request.root_id, session=session) #, default_nonce)
|
||||||
gas_oracle = self.create_gas_oracle(rpc, MinterFaucet.gas)
|
gas_oracle = self.create_gas_oracle(rpc, code_callback=MinterFaucet.gas)
|
||||||
faucet = Faucet(chain_spec, signer=rpc_signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle)
|
faucet = Faucet(chain_spec, signer=rpc_signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle)
|
||||||
(tx_hash_hex, tx_signed_raw_hex) = faucet.give_to(faucet_address, account_address, account_address, tx_format=TxFormat.RLP_SIGNED)
|
(tx_hash_hex, tx_signed_raw_hex) = faucet.give_to(faucet_address, account_address, account_address, tx_format=TxFormat.RLP_SIGNED)
|
||||||
rpc_signer.disconnect()
|
rpc_signer.disconnect()
|
||||||
|
@ -34,10 +34,8 @@ from cic_eth.error import (
|
|||||||
YouAreBrokeError,
|
YouAreBrokeError,
|
||||||
)
|
)
|
||||||
from cic_eth.queue.tx import register_tx
|
from cic_eth.queue.tx import register_tx
|
||||||
from cic_eth.eth.gas import (
|
from cic_eth.eth.gas import create_check_gas_task
|
||||||
create_check_gas_task,
|
from cic_eth.eth.util import CacheGasOracle
|
||||||
MaxGasOracle,
|
|
||||||
)
|
|
||||||
from cic_eth.ext.address import translate_address
|
from cic_eth.ext.address import translate_address
|
||||||
from cic_eth.task import (
|
from cic_eth.task import (
|
||||||
CriticalSQLAlchemyTask,
|
CriticalSQLAlchemyTask,
|
||||||
@ -157,8 +155,12 @@ def transfer_from(self, tokens, holder_address, receiver_address, value, chain_s
|
|||||||
rpc_signer = RPCConnection.connect(chain_spec, 'signer')
|
rpc_signer = RPCConnection.connect(chain_spec, 'signer')
|
||||||
|
|
||||||
session = self.create_session()
|
session = self.create_session()
|
||||||
|
|
||||||
nonce_oracle = CustodialTaskNonceOracle(holder_address, self.request.root_id, session=session)
|
nonce_oracle = CustodialTaskNonceOracle(holder_address, self.request.root_id, session=session)
|
||||||
gas_oracle = self.create_gas_oracle(rpc, t['address'], MaxGasOracle.gas)
|
enc = ABIContractEncoder()
|
||||||
|
enc.method('transferFrom')
|
||||||
|
method = enc.get()
|
||||||
|
gas_oracle = self.create_gas_oracle(rpc, t['address'], method=method, session=session, min_price=self.min_fee_price)
|
||||||
c = ERC20(chain_spec, signer=rpc_signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle)
|
c = ERC20(chain_spec, signer=rpc_signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle)
|
||||||
try:
|
try:
|
||||||
(tx_hash_hex, tx_signed_raw_hex) = c.transfer_from(t['address'], spender_address, holder_address, receiver_address, value, tx_format=TxFormat.RLP_SIGNED)
|
(tx_hash_hex, tx_signed_raw_hex) = c.transfer_from(t['address'], spender_address, holder_address, receiver_address, value, tx_format=TxFormat.RLP_SIGNED)
|
||||||
@ -228,13 +230,12 @@ def transfer(self, tokens, holder_address, receiver_address, value, chain_spec_d
|
|||||||
rpc_signer = RPCConnection.connect(chain_spec, 'signer')
|
rpc_signer = RPCConnection.connect(chain_spec, 'signer')
|
||||||
|
|
||||||
session = self.create_session()
|
session = self.create_session()
|
||||||
nonce_oracle = CustodialTaskNonceOracle(holder_address, self.request.root_id, session=session)
|
|
||||||
|
|
||||||
enc = ABIContractEncoder()
|
enc = ABIContractEncoder()
|
||||||
enc.method('transferFrom')
|
enc.method('transfer')
|
||||||
method = enc.get()
|
method = enc.get()
|
||||||
|
gas_oracle = self.create_gas_oracle(rpc, t['address'], method=method, session=session, min_price=self.min_fee_price)
|
||||||
gas_oracle = self.create_gas_oracle(rpc, MaxGasOracle.gas)
|
nonce_oracle = CustodialTaskNonceOracle(holder_address, self.request.root_id, session=session)
|
||||||
c = ERC20(chain_spec, signer=rpc_signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle)
|
c = ERC20(chain_spec, signer=rpc_signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle)
|
||||||
try:
|
try:
|
||||||
(tx_hash_hex, tx_signed_raw_hex) = c.transfer(t['address'], holder_address, receiver_address, value, tx_format=TxFormat.RLP_SIGNED)
|
(tx_hash_hex, tx_signed_raw_hex) = c.transfer(t['address'], holder_address, receiver_address, value, tx_format=TxFormat.RLP_SIGNED)
|
||||||
@ -302,8 +303,12 @@ def approve(self, tokens, holder_address, spender_address, value, chain_spec_dic
|
|||||||
rpc_signer = RPCConnection.connect(chain_spec, 'signer')
|
rpc_signer = RPCConnection.connect(chain_spec, 'signer')
|
||||||
|
|
||||||
session = self.create_session()
|
session = self.create_session()
|
||||||
|
|
||||||
nonce_oracle = CustodialTaskNonceOracle(holder_address, self.request.root_id, session=session)
|
nonce_oracle = CustodialTaskNonceOracle(holder_address, self.request.root_id, session=session)
|
||||||
gas_oracle = self.create_gas_oracle(rpc, MaxGasOracle.gas)
|
enc = ABIContractEncoder()
|
||||||
|
enc.method('approve')
|
||||||
|
method = enc.get()
|
||||||
|
gas_oracle = self.create_gas_oracle(rpc, t['address'], method=method, session=session)
|
||||||
c = ERC20(chain_spec, signer=rpc_signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle)
|
c = ERC20(chain_spec, signer=rpc_signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle)
|
||||||
try:
|
try:
|
||||||
(tx_hash_hex, tx_signed_raw_hex) = c.approve(t['address'], holder_address, spender_address, value, tx_format=TxFormat.RLP_SIGNED)
|
(tx_hash_hex, tx_signed_raw_hex) = c.approve(t['address'], holder_address, spender_address, value, tx_format=TxFormat.RLP_SIGNED)
|
||||||
|
@ -67,6 +67,7 @@ from cic_eth.encode import (
|
|||||||
unpack_normal,
|
unpack_normal,
|
||||||
)
|
)
|
||||||
from cic_eth.error import SeppukuError
|
from cic_eth.error import SeppukuError
|
||||||
|
from cic_eth.eth.util import MAXIMUM_FEE_UNITS
|
||||||
|
|
||||||
celery_app = celery.current_app
|
celery_app = celery.current_app
|
||||||
logg = logging.getLogger()
|
logg = logging.getLogger()
|
||||||
|
@ -1,15 +1,18 @@
|
|||||||
# external imports
|
# external imports
|
||||||
from chainlib.eth.gas import RPCGasOracle
|
from chainlib.eth.gas import RPCGasOracle
|
||||||
|
from hexathon import strip_0x
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_eth.db.models.gas_cache import GasCache
|
from cic_eth.db.models.gas_cache import GasCache
|
||||||
|
from cic_eth.encode import tx_normalize
|
||||||
|
from cic_eth.db.models.base import SessionBase
|
||||||
|
|
||||||
|
|
||||||
MAXIMUM_FEE_UNITS = 8000000
|
MAXIMUM_FEE_UNITS = 8000000
|
||||||
|
|
||||||
class MaxGasOracle(RPCGasOracle):
|
class MaxGasOracle(RPCGasOracle):
|
||||||
|
|
||||||
def get_fee_units(code=None):
|
def get_fee_units(self, code=None):
|
||||||
return MAXIMUM_FEE_UNITS
|
return MAXIMUM_FEE_UNITS
|
||||||
|
|
||||||
|
|
||||||
@ -28,10 +31,10 @@ class CacheGasOracle(MaxGasOracle):
|
|||||||
address = tx_normalize.executable_address(address)
|
address = tx_normalize.executable_address(address)
|
||||||
session = SessionBase.bind_session(session)
|
session = SessionBase.bind_session(session)
|
||||||
q = session.query(GasCache)
|
q = session.query(GasCache)
|
||||||
q = q.filter(GasCache.address=address)
|
q = q.filter(GasCache.address==address)
|
||||||
if method != None:
|
if method != None:
|
||||||
method = strip_0x(method)
|
method = strip_0x(method)
|
||||||
q = q.filter(GasCache.method=method)
|
q = q.filter(GasCache.method==method)
|
||||||
o = q.first()
|
o = q.first()
|
||||||
if o != None:
|
if o != None:
|
||||||
self.value = int(o.value)
|
self.value = int(o.value)
|
||||||
|
@ -17,8 +17,7 @@ import celery
|
|||||||
# local imports
|
# local imports
|
||||||
from .base import SyncFilter
|
from .base import SyncFilter
|
||||||
|
|
||||||
#logg = logging.getLogger(__name__)
|
logg = logging.getLogger(__name__)
|
||||||
logg = logging.getLogger()
|
|
||||||
|
|
||||||
|
|
||||||
class TokenFilter(SyncFilter):
|
class TokenFilter(SyncFilter):
|
||||||
|
@ -10,6 +10,7 @@ from chainlib.chain import ChainSpec
|
|||||||
from chainlib.connection import RPCConnection
|
from chainlib.connection import RPCConnection
|
||||||
from chainlib.eth.constant import ZERO_ADDRESS
|
from chainlib.eth.constant import ZERO_ADDRESS
|
||||||
from chainlib.eth.nonce import RPCNonceOracle
|
from chainlib.eth.nonce import RPCNonceOracle
|
||||||
|
from chainlib.eth.gas import RPCGasOracle
|
||||||
from cic_eth_registry import CICRegistry
|
from cic_eth_registry import CICRegistry
|
||||||
from cic_eth_registry.error import UnknownContractError
|
from cic_eth_registry.error import UnknownContractError
|
||||||
|
|
||||||
@ -30,7 +31,6 @@ class BaseTask(celery.Task):
|
|||||||
call_address = ZERO_ADDRESS
|
call_address = ZERO_ADDRESS
|
||||||
trusted_addresses = []
|
trusted_addresses = []
|
||||||
min_fee_price = 1
|
min_fee_price = 1
|
||||||
create_gas_oracle = CacheGasOracle
|
|
||||||
default_token_address = None
|
default_token_address = None
|
||||||
default_token_symbol = None
|
default_token_symbol = None
|
||||||
default_token_name = None
|
default_token_name = None
|
||||||
@ -38,8 +38,22 @@ class BaseTask(celery.Task):
|
|||||||
run_dir = '/run'
|
run_dir = '/run'
|
||||||
|
|
||||||
|
|
||||||
def create_gas_oracle(self, conn, code_callback=None, id_generator=None):
|
def create_gas_oracle(self, conn, address=None, *args, **kwargs):
|
||||||
return RPCGasOracle(conn, code_callback=code_callback, min_price=self.min_fee_price, id_generator=id_generator)
|
if address == None:
|
||||||
|
return RPCGasOracle(
|
||||||
|
conn,
|
||||||
|
code_callback=kwargs.get('code_callback'),
|
||||||
|
min_price=self.min_fee_price,
|
||||||
|
id_generator=kwargs.get('id_generator'),
|
||||||
|
)
|
||||||
|
|
||||||
|
return CacheGasOracle(
|
||||||
|
conn,
|
||||||
|
address,
|
||||||
|
method=kwargs.get('method'),
|
||||||
|
min_price=self.min_fee_price,
|
||||||
|
id_generator=kwargs.get('id_generator'),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def create_session(self):
|
def create_session(self):
|
||||||
|
@ -18,6 +18,7 @@ from chainlib.eth.block import (
|
|||||||
block_latest,
|
block_latest,
|
||||||
block_by_number,
|
block_by_number,
|
||||||
)
|
)
|
||||||
|
from chainlib.eth.address import is_same_address
|
||||||
from chainlib.eth.contract import ABIContractEncoder
|
from chainlib.eth.contract import ABIContractEncoder
|
||||||
from hexathon import strip_0x
|
from hexathon import strip_0x
|
||||||
from eth_token_index import TokenUniqueSymbolIndex
|
from eth_token_index import TokenUniqueSymbolIndex
|
||||||
@ -39,7 +40,7 @@ def test_filter_gas(
|
|||||||
foo_token,
|
foo_token,
|
||||||
token_registry,
|
token_registry,
|
||||||
register_lookups,
|
register_lookups,
|
||||||
celery_worker,
|
celery_session_worker,
|
||||||
cic_registry,
|
cic_registry,
|
||||||
):
|
):
|
||||||
|
|
||||||
@ -86,7 +87,7 @@ def test_filter_gas(
|
|||||||
q = q.filter(GasCache.tx_hash==strip_0x(tx_hash_hex))
|
q = q.filter(GasCache.tx_hash==strip_0x(tx_hash_hex))
|
||||||
o = q.first()
|
o = q.first()
|
||||||
|
|
||||||
assert o.address == strip_0x(foo_token)
|
assert is_same_address(o.address, strip_0x(foo_token))
|
||||||
assert o.value > 0
|
assert o.value > 0
|
||||||
|
|
||||||
enc = ABIContractEncoder()
|
enc = ABIContractEncoder()
|
||||||
|
Loading…
Reference in New Issue
Block a user