From 75ce19845e5228019c3618c4d212dc9277bc7400 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 1 Sep 2023 03:53:23 +0100 Subject: [PATCH] Implement txs --- gas3/__init__.py | 61 +++++++++++++++++++++++++++++++++++++++--- gas3/base.py | 2 +- gas3/register.py | 32 +++++++++++++++++++--- requirements.txt | 3 +++ tests/test_register.py | 1 - 5 files changed, 90 insertions(+), 9 deletions(-) diff --git a/gas3/__init__.py b/gas3/__init__.py index eec0ee1..9f03128 100644 --- a/gas3/__init__.py +++ b/gas3/__init__.py @@ -5,6 +5,16 @@ import logging import re # external imports +from chainlib.eth.gas import balance +from chainlib.eth.cli.config import Config +from chainlib.eth.cli.config import process_config +from chainlib.eth.cli.arg import ArgFlag +from chainlib.eth.cli.arg import Arg +from chainlib.eth.cli.arg import process_args +from chainlib.settings import ChainSettings +from chainlib.eth.settings import process_settings +from eth_contract_registry import Registry +import chainlib.eth.cli from leveldir.uuid import UUIDDir # local imports @@ -17,11 +27,57 @@ logging.basicConfig(level=logging.DEBUG) logg = logging.getLogger() data_path = os.environ.get('GAS3_DATA_DIR', 'data') +registry = os.environ.get('CIC_REGISTRY_ADDRESS') data_dir = UUIDDir(data_path) re_yield = re.compile('^/yield') re_register = re.compile('^/register') +def process_settings_local(settings, config): + conn = settings.get('CONN') + o = balance(settings.get('SENDER_ADDRESS')) + r = conn.do(o) + logg.info('signing with address {} balance start {}'.format(settings.get('SENDER_ADDRESS'), int(r, 16))) + + c = Registry(settings.get('CHAIN_SPEC'), gas_oracle=settings.get('GAS_ORACLE')) + #o = c.address_of(registry, 'registry', sender_address=settings.get('SENDER_ADDRESS')) + #o['params'][0]['gasPrice'] = "0x3b9aca00" + #o['params'][0]['gas'] = "0x7530" + #r = conn.do(o) + #logg.info('using registry {}'.format(r)) + + o = c.address_of(registry, 'accounts', sender_address=settings.get('SENDER_ADDRESS')) + r = conn.do(o) + accounts_index = c.parse_address_of(r) + settings.set('ACCOUNTS_CONTRACT', accounts_index) + logg.info('using accounts_index {}'.format(accounts_index)) + + o = c.address_of(registry, 'faucet', sender_address=settings.get('SENDER_ADDRESS')) + r = conn.do(o) + faucet = c.parse_address_of(r) + settings.set('FAUCET_CONTRACT', faucet) + logg.info('using faucet {}'.format(faucet)) + + return settings + + +arg_flags = ArgFlag() +arg = Arg(arg_flags) +flags = arg_flags.STD_WRITE | arg_flags.WALLET | arg_flags.EXEC +argparser = chainlib.eth.cli.ArgumentParser() +argparser = process_args(argparser, arg, flags) +args = argparser.parse_args() + +config = Config() +config = process_config(config, arg, args, flags) +logg.debug('config loaded:\n{}'.format(config)) + +settings = ChainSettings() +settings = process_settings(settings, config) +settings = process_settings_local(settings, config) +logg.debug('settings loaded:\n{}'.format(settings)) + + def application(env, start_response): req = urllib.parse.urlparse(env['REQUEST_URI']) @@ -30,10 +86,10 @@ def application(env, start_response): r = '' if re.match(re_yield, req.path): - r = do_yield(req, env, data_dir) + r = do_yield(req, env, data_dir, settings) elif re.match(re_register, req.path): try: - r = do_register(req, env, data_dir) + r = do_register(req, env, data_dir, settings) except gas3.error.Used: scode = 410 stext = 'Code already used' @@ -50,7 +106,6 @@ def application(env, start_response): r = str(e) else: r = '' - l = len(r) status = str(scode) + ' ' + stext diff --git a/gas3/base.py b/gas3/base.py index 5ddd5eb..d91f1a2 100644 --- a/gas3/base.py +++ b/gas3/base.py @@ -5,7 +5,7 @@ import logging logg = logging.getLogger(__name__) -def do_yield(req, env, data_dir): +def do_yield(req, env, data_dir, settings): u = uuid.uuid4() data_dir.add(u, b'\x00') return str(u) diff --git a/gas3/register.py b/gas3/register.py index 535aa68..1cb4b68 100644 --- a/gas3/register.py +++ b/gas3/register.py @@ -4,6 +4,8 @@ import logging # external imports from chainlib.eth.address import to_checksum_address from hexathon import strip_0x +from eth_accounts_index import AccountsIndex +from eth_faucet import EthFaucet # local imports from gas3.error import InvalidInput @@ -13,10 +15,31 @@ from gas3.base import check logg = logging.getLogger(__name__) -def register_address(a): - pass +def register_address(settings, address): + c = AccountsIndex( + settings.get('CHAIN_SPEC'), + signer=settings.get('SIGNER'), + gas_oracle=settings.get('FEE_ORACLE'), + nonce_oracle=settings.get('NONCE_ORACLE'), + ) + (tx_hash, o) = c.add(settings.get('ACCOUNTS_CONTRACT'), settings.get('SENDER_ADDRESS'), address) + r = settings.get('CONN').do(o) + logg.debug('registry tx for {}: {}'.format(address, tx_hash)) -def do_register(req, env, data_dir): + c = EthFaucet( + settings.get('CHAIN_SPEC'), + signer=settings.get('SIGNER'), + gas_oracle=settings.get('FEE_ORACLE'), + nonce_oracle=settings.get('NONCE_ORACLE'), + ) + (tx_hash, o) = c.give_to(settings.get('FAUCET_CONTRACT'), settings.get('SENDER_ADDRESS'), address) + r = settings.get('CONN').do(o) + logg.debug('faucet tx for {}: {}'.format(address, tx_hash)) + + return tx_hash + + +def do_register(req, env, data_dir, settings): i = req.path.find('/', 1) if i == -1: raise InvalidInput(env.path) @@ -36,4 +59,5 @@ def do_register(req, env, data_dir): raise InvalidInput('invalid address: ' + str(v)) data_dir.add(p, bytes.fromhex(v)) - return v + tx_hash = register_address(settings, v) + return tx_hash diff --git a/requirements.txt b/requirements.txt index 241151f..5555848 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,5 @@ leveldir~=0.3.3rc1 chainlib-eth~=0.5.2 +eth-contract-registry~=0.12.0rc1 +eth-accounts-index~=0.5.4rc1 +eth-faucet~=0.5.0rc1 diff --git a/tests/test_register.py b/tests/test_register.py index b288e92..fa37a82 100644 --- a/tests/test_register.py +++ b/tests/test_register.py @@ -54,6 +54,5 @@ class TestRegister(EthTesterCase): self.assertTrue(is_same_hex(r.hex(), self.accounts[0])) - if __name__ == '__main__': unittest.main()