2021-02-01 18:12:51 +01:00
|
|
|
# standard imports
|
|
|
|
import logging
|
|
|
|
|
2021-03-29 15:27:53 +02:00
|
|
|
# external imports
|
|
|
|
import celery
|
|
|
|
from chainlib.eth.gas import price
|
|
|
|
from hexathon import strip_0x
|
|
|
|
|
2021-02-01 18:12:51 +01:00
|
|
|
# local imports
|
|
|
|
from cic_eth.db.models.role import AccountRole
|
|
|
|
from cic_eth.db.models.base import SessionBase
|
|
|
|
|
|
|
|
logg = logging.getLogger()
|
|
|
|
|
2021-03-29 15:27:53 +02:00
|
|
|
#
|
|
|
|
#class GasOracle():
|
|
|
|
# """Provides gas pricing for transactions.
|
|
|
|
#
|
|
|
|
# :param w3: Web3 object
|
|
|
|
# :type w3: web3.Web3
|
|
|
|
# """
|
|
|
|
#
|
|
|
|
# __safe_threshold_amount_value = 2000000000 * 60000 * 3
|
|
|
|
# __refill_amount_value = __safe_threshold_amount_value * 5
|
|
|
|
# default_gas_limit = 21000
|
|
|
|
#
|
|
|
|
# def __init__(self, conn):
|
|
|
|
# o = price()
|
|
|
|
# r = conn.do(o)
|
|
|
|
# b = bytes.from_hex(strip_0x(r))
|
|
|
|
# self.gas_price_current = int.from_bytes(b, 'big')
|
|
|
|
#
|
|
|
|
# #self.w3 = w3
|
|
|
|
# #self.gas_price_current = w3.eth.gas_price()
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# def safe_threshold_amount(self):
|
|
|
|
# """The gas balance threshold under which a new gas refill transaction should be initiated.
|
|
|
|
#
|
|
|
|
# :returns: Gas token amount
|
|
|
|
# :rtype: number
|
|
|
|
# """
|
|
|
|
# g = GasOracle.__safe_threshold_amount_value
|
|
|
|
# logg.warning('gas safe threshold is currently hardcoded to {}'.format(g))
|
|
|
|
# return g
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# def refill_amount(self):
|
|
|
|
# """The amount of gas tokens to send in a gas refill transaction.
|
|
|
|
#
|
|
|
|
# :returns: Gas token amount
|
|
|
|
# :rtype: number
|
|
|
|
# """
|
|
|
|
# g = GasOracle.__refill_amount_value
|
|
|
|
# logg.warning('gas refill amount is currently hardcoded to {}'.format(g))
|
|
|
|
# return g
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# def gas_provider(self):
|
|
|
|
# """Gas provider address.
|
|
|
|
#
|
|
|
|
# :returns: Etheerum account address
|
|
|
|
# :rtype: str, 0x-hex
|
|
|
|
# """
|
|
|
|
# session = SessionBase.create_session()
|
|
|
|
# a = AccountRole.get_address('GAS_GIFTER', session)
|
|
|
|
# logg.debug('gasgifter {}'.format(a))
|
|
|
|
# session.close()
|
|
|
|
# return a
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# def gas_price(self, category='safe'):
|
|
|
|
# """Get projected gas price to use for a transaction at the current moment.
|
|
|
|
#
|
|
|
|
# When the category parameter is implemented, it can be used to control the priority of a transaction in the network.
|
|
|
|
#
|
|
|
|
# :param category: Bid level category to return price for. Currently has no effect.
|
|
|
|
# :type category: str
|
|
|
|
# :returns: Gas price
|
|
|
|
# :rtype: number
|
|
|
|
# """
|
|
|
|
# #logg.warning('gas price hardcoded to category "safe"')
|
|
|
|
# #g = 100
|
|
|
|
# #return g
|
|
|
|
# return self.gas_price_current
|
|
|
|
|
|
|
|
|
|
|
|
class MaxGasOracle:
|
|
|
|
|
|
|
|
def gas(code=None):
|
|
|
|
return 8000000
|
|
|
|
|
|
|
|
|
|
|
|
def create_check_gas_task(tx_signed_raws_hex, chain_spec, holder_address, gas=None, tx_hashes_hex=None, queue=None):
|
|
|
|
"""Creates a celery task signature for a check_gas task that adds the task to the outgoing queue to be processed by the dispatcher.
|
|
|
|
|
|
|
|
If tx_hashes_hex is not spefified, a preceding task chained to check_gas must supply the transaction hashes as its return value.
|
|
|
|
|
|
|
|
:param tx_signed_raws_hex: Raw signed transaction data
|
|
|
|
:type tx_signed_raws_hex: list of str, 0x-hex
|
|
|
|
:param chain_spec: Chain spec of address to add check gas for
|
|
|
|
:type chain_spec: chainlib.chain.ChainSpec
|
|
|
|
:param holder_address: Address sending the transactions
|
|
|
|
:type holder_address: str, 0x-hex
|
|
|
|
:param gas: Gas budget hint for transactions
|
|
|
|
:type gas: int
|
|
|
|
:param tx_hashes_hex: Transaction hashes
|
|
|
|
:type tx_hashes_hex: list of str, 0x-hex
|
|
|
|
:param queue: Task queue
|
|
|
|
:type queue: str
|
|
|
|
:returns: Signature of task chain
|
|
|
|
:rtype: celery.Signature
|
2021-02-01 18:12:51 +01:00
|
|
|
"""
|
2021-03-29 15:27:53 +02:00
|
|
|
s_check_gas = None
|
|
|
|
if tx_hashes_hex != None:
|
|
|
|
s_check_gas = celery.signature(
|
|
|
|
'cic_eth.eth.tx.check_gas',
|
|
|
|
[
|
|
|
|
tx_hashes_hex,
|
|
|
|
chain_spec.asdict(),
|
|
|
|
tx_signed_raws_hex,
|
|
|
|
holder_address,
|
|
|
|
gas,
|
|
|
|
],
|
|
|
|
queue=queue,
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
s_check_gas = celery.signature(
|
|
|
|
'cic_eth.eth.tx.check_gas',
|
|
|
|
[
|
|
|
|
chain_spec.asdict(),
|
|
|
|
tx_signed_raws_hex,
|
|
|
|
holder_address,
|
|
|
|
gas,
|
|
|
|
],
|
|
|
|
queue=queue,
|
|
|
|
)
|
|
|
|
return s_check_gas
|