|
|
@@ -58,7 +58,9 @@ from .common import (
|
|
|
)
|
|
|
from .ct_base import CmdTestBase
|
|
|
from .ct_shared import CmdTestShared
|
|
|
-from .etherscan import run_etherscan_server
|
|
|
+from .httpd.etherscan import EtherscanServer
|
|
|
+
|
|
|
+etherscan_server = EtherscanServer()
|
|
|
|
|
|
del_addrs = ('4', '1')
|
|
|
dfl_sid = '98831F3A'
|
|
|
@@ -179,12 +181,6 @@ token_bals_getbalance = lambda k: {
|
|
|
|
|
|
coin = cfg.coin
|
|
|
|
|
|
-def etherscan_server_start():
|
|
|
- import threading
|
|
|
- t = threading.Thread(target=run_etherscan_server, name='Etherscan server thread')
|
|
|
- t.daemon = True
|
|
|
- t.start()
|
|
|
-
|
|
|
class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
'Ethereum transacting, token deployment and tracking wallet operations'
|
|
|
networks = ('eth', 'etc')
|
|
|
@@ -244,8 +240,12 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
('txview1_sig', 'viewing the signed transaction'),
|
|
|
('tx_status0_bad', 'getting the transaction status'),
|
|
|
('txsign1_ni', 'signing the transaction (non-interactive)'),
|
|
|
+
|
|
|
+ ('etherscan_server_start','starting the Etherscan server'),
|
|
|
('txsend_etherscan_test','sending the transaction via Etherscan (simulation, with --test)'),
|
|
|
('txsend_etherscan', 'sending the transaction via Etherscan (simulation)'),
|
|
|
+ ('etherscan_server_stop','stopping the Etherscan server'),
|
|
|
+
|
|
|
('txsend1', 'sending the transaction'),
|
|
|
('bal1', f'the {coin} balance'),
|
|
|
|
|
|
@@ -459,9 +459,6 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
self.message = 'attack at dawn'
|
|
|
self.spawn_env['MMGEN_BOGUS_SEND'] = ''
|
|
|
|
|
|
- if type(self) is CmdTestEthdev:
|
|
|
- etherscan_server_start() # TODO: stop server when test group finishes executing
|
|
|
-
|
|
|
@property
|
|
|
async def rpc(self):
|
|
|
from mmgen.rpc import rpc_init
|
|
|
@@ -472,7 +469,7 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
time.sleep(0.5)
|
|
|
|
|
|
async def setup(self):
|
|
|
- self.spawn('', msg_only=True)
|
|
|
+ self.spawn(msg_only=True)
|
|
|
|
|
|
d = self.daemon
|
|
|
|
|
|
@@ -718,19 +715,19 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
txfile = self.get_file_with_ext(ext, no_dot=True)
|
|
|
t = self.spawn(
|
|
|
'mmgen-txsign',
|
|
|
- self.eth_args
|
|
|
- + [f'--coin={self.proto.coin}']
|
|
|
- + ['--rpc-host=bad_host'] # ETH signing must work without RPC
|
|
|
- + ([], ['--yes'])[ni]
|
|
|
- + ([f'--keys-from-file={keyfile}'] if dev_send else [])
|
|
|
- + add_args
|
|
|
- + [txfile, dfl_words_file])
|
|
|
+ self.eth_args
|
|
|
+ + ['--rpc-host=bad_host'] # ETH signing must work without RPC
|
|
|
+ + ([], ['--yes'])[ni]
|
|
|
+ + ([f'--keys-from-file={keyfile}'] if dev_send else [])
|
|
|
+ + add_args
|
|
|
+ + [txfile, dfl_words_file],
|
|
|
+ no_passthru_opts = ['coin'])
|
|
|
return self.txsign_ui_common(t, ni=ni, has_label=True)
|
|
|
|
|
|
def txsend(self, ext='{}.regtest.sigtx', add_args=[], test=False):
|
|
|
ext = ext.format('-α' if cfg.debug_utf8 else '')
|
|
|
txfile = self.get_file_with_ext(ext, no_dot=True)
|
|
|
- t = self.spawn('mmgen-txsend', self.eth_args + add_args + [txfile])
|
|
|
+ t = self.spawn('mmgen-txsend', self.eth_args + add_args + [txfile], no_passthru_opts=['coin'])
|
|
|
self.txsend_ui_common(
|
|
|
t,
|
|
|
quiet = not cfg.debug,
|
|
|
@@ -778,10 +775,20 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
return self.tx_status(ext='{}.regtest.sigtx', expect_str='neither in mempool nor blockchain', exit_val=1)
|
|
|
def txsign1_ni(self):
|
|
|
return self.txsign(ni=True, dev_send=True)
|
|
|
+
|
|
|
+ def etherscan_server_start(self):
|
|
|
+ self.spawn(msg_only=True)
|
|
|
+ etherscan_server.start()
|
|
|
+ return 'ok'
|
|
|
def txsend_etherscan_test(self):
|
|
|
return self.txsend(add_args=['--tx-proxy=ether', '--test'], test='tx_proxy')
|
|
|
def txsend_etherscan(self):
|
|
|
return self.txsend(add_args=['--tx-proxy=ethersc'])
|
|
|
+ def etherscan_server_stop(self):
|
|
|
+ self.spawn(msg_only=True)
|
|
|
+ etherscan_server.stop()
|
|
|
+ return 'ok'
|
|
|
+
|
|
|
def txsend1(self):
|
|
|
return self.txsend()
|
|
|
def txview1_sig(self): # do after send so that TxID is displayed
|
|
|
@@ -816,6 +823,7 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
t = self.spawn(
|
|
|
'mmgen-txsend',
|
|
|
self.eth_args + add_args + ['--status', txfile],
|
|
|
+ no_passthru_opts = ['coin'],
|
|
|
exit_val = exit_val)
|
|
|
t.expect(expect_str)
|
|
|
if expect_str2:
|
|
|
@@ -848,7 +856,7 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
if not self.daemon.id == 'geth':
|
|
|
return 'skip'
|
|
|
|
|
|
- self.spawn('', msg_only=True)
|
|
|
+ self.spawn(msg_only=True)
|
|
|
|
|
|
sig = '0x' + create_signature_mmgen()
|
|
|
sig_chk = await create_signature_rpc()
|
|
|
@@ -1002,7 +1010,7 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
if not self.using_solc:
|
|
|
imsg(f'Using precompiled contract data in {odir}')
|
|
|
return 'skip' if os.path.exists(odir) else False
|
|
|
- self.spawn('', msg_only=True)
|
|
|
+ self.spawn(msg_only=True)
|
|
|
cmd_args = [f'--{k}={v}' for k, v in list(token_data.items())]
|
|
|
imsg("Compiling solidity token contract '{}' with 'solc'".format(token_data['symbol']))
|
|
|
try:
|
|
|
@@ -1063,10 +1071,13 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
t.written_to_file('transaction')
|
|
|
ext = '[0,8000]{}.regtest.rawtx'.format('-α' if cfg.debug_utf8 else '')
|
|
|
txfile = self.get_file_with_ext(ext, no_dot=True)
|
|
|
- t = self.spawn('mmgen-txsign', self.eth_args + ['--yes', '-k', keyfile, txfile], no_msg=True)
|
|
|
+ t = self.spawn(
|
|
|
+ 'mmgen-txsign',
|
|
|
+ self.eth_args + ['--yes', '-k', keyfile, txfile], no_msg=True, no_passthru_opts=['coin'])
|
|
|
self.txsign_ui_common(t, ni=True)
|
|
|
txfile = txfile.replace('.rawtx', '.sigtx')
|
|
|
- t = self.spawn('mmgen-txsend', self.eth_args + [txfile], no_msg=True)
|
|
|
+ t = self.spawn('mmgen-txsend',
|
|
|
+ self.eth_args + [txfile], no_msg=True, no_passthru_opts=['coin'])
|
|
|
|
|
|
txid = self.txsend_ui_common(t,
|
|
|
caller = mmgen_cmd,
|
|
|
@@ -1103,7 +1114,7 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
return await self.token_deploy(num=2, key='Token', gas=4_000_000)
|
|
|
|
|
|
async def token_transfer_ops(self, op, amt=1000, num_tokens=2):
|
|
|
- self.spawn('', msg_only=True)
|
|
|
+ self.spawn(msg_only=True)
|
|
|
sid = dfl_sid
|
|
|
from mmgen.tool.wallet import tool_cmd
|
|
|
usr_mmaddrs = [f'{sid}:E:{i}' for i in (11, 21)][:num_tokens]
|
|
|
@@ -1214,18 +1225,25 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
def token_bal1(self):
|
|
|
return self.token_bal(n='1')
|
|
|
|
|
|
- def token_txcreate(self, args=[], token='', inputs='1', fee='50G', file_desc='Unsigned transaction'):
|
|
|
+ def token_txcreate(
|
|
|
+ self,
|
|
|
+ args = [],
|
|
|
+ token = '',
|
|
|
+ inputs = '1',
|
|
|
+ fee = '50G',
|
|
|
+ file_desc = 'Unsigned transaction'):
|
|
|
return self.txcreate_ui_common(
|
|
|
- self.spawn('mmgen-txcreate', self.eth_args + [f'--token={token}', '-B', f'--fee={fee}'] + args),
|
|
|
+ self.spawn('mmgen-txcreate',
|
|
|
+ self.eth_args + [f'--token={token}', '-B', f'--fee={fee}'] + args),
|
|
|
menu = [],
|
|
|
inputs = inputs,
|
|
|
input_sels_prompt = 'to spend from',
|
|
|
add_comment = tx_comment_lat_cyr_gr,
|
|
|
file_desc = file_desc)
|
|
|
def token_txsign(self, ext='', token='', add_args=[], ni=True):
|
|
|
- return self.txsign(ni=ni, ext=ext, add_args=[f'--token={token}'] + add_args)
|
|
|
+ return self.txsign(ni=ni, ext=ext, add_args=add_args)
|
|
|
def token_txsend(self, ext='', token=''):
|
|
|
- return self.txsend(ext=ext, add_args=['--token='+token])
|
|
|
+ return self.txsend(ext=ext)
|
|
|
|
|
|
def token_txcreate1(self):
|
|
|
return self.token_txcreate(args=['98831F3A:E:12,1.23456'], token='mm1')
|
|
|
@@ -1245,7 +1263,6 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
def tx_status3(self):
|
|
|
return self.tx_status(
|
|
|
ext = '1.23456,50000]{}.regtest.sigtx',
|
|
|
- add_args = ['--token=mm1'],
|
|
|
expect_str = 'successfully executed',
|
|
|
expect_str2 = 'has 1 confirmation')
|
|
|
|
|
|
@@ -1503,7 +1520,7 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
return t
|
|
|
|
|
|
async def twmove(self):
|
|
|
- self.spawn('', msg_only=True)
|
|
|
+ self.spawn(msg_only=True)
|
|
|
from mmgen.tw.ctl import TwCtl
|
|
|
twctl = await TwCtl(cfg, self.proto, no_wallet_init=True)
|
|
|
imsg('Moving tracking wallet')
|
|
|
@@ -1526,7 +1543,7 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
return self.twimport(add_args=['ignore_checksum=true'], expect_str='ignoring incorrect checksum')
|
|
|
|
|
|
def tw_chktotal(self):
|
|
|
- self.spawn('', msg_only=True)
|
|
|
+ self.spawn(msg_only=True)
|
|
|
from mmgen.tw.json import TwJSON
|
|
|
fn = joinpath(self.tmpdir, TwJSON.Base(cfg, self.proto).dump_fn)
|
|
|
res = json.loads(read_from_file(fn))
|
|
|
@@ -1534,7 +1551,7 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
return 'ok'
|
|
|
|
|
|
async def twcompare(self):
|
|
|
- self.spawn('', msg_only=True)
|
|
|
+ self.spawn(msg_only=True)
|
|
|
from mmgen.tw.ctl import TwCtl
|
|
|
twctl = await TwCtl(cfg, self.proto, no_wallet_init=True)
|
|
|
fn = twctl.tw_path
|
|
|
@@ -1545,7 +1562,7 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
return 'ok'
|
|
|
|
|
|
def edit_json_twdump(self):
|
|
|
- self.spawn('', msg_only=True)
|
|
|
+ self.spawn(msg_only=True)
|
|
|
from mmgen.tw.json import TwJSON
|
|
|
fn = TwJSON.Base(cfg, self.proto).dump_fn
|
|
|
text = json.loads(self.read_from_tmpfile(fn))
|
|
|
@@ -1555,7 +1572,7 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
return 'ok'
|
|
|
|
|
|
def stop(self):
|
|
|
- self.spawn('', msg_only=True)
|
|
|
+ self.spawn(msg_only=True)
|
|
|
if not cfg.no_daemon_stop:
|
|
|
if not stop_test_daemons(self.proto.coin+'_rt', remove_datadir=True):
|
|
|
return False
|