|
|
@@ -20,7 +20,7 @@
|
|
|
test.cmdtest_d.ct_ethdev: Ethdev tests for the cmdtest.py test suite
|
|
|
"""
|
|
|
|
|
|
-import sys, os, re, shutil, asyncio, json
|
|
|
+import sys, time, os, re, shutil, asyncio, json
|
|
|
from decimal import Decimal
|
|
|
from collections import namedtuple
|
|
|
from subprocess import run, PIPE, DEVNULL
|
|
|
@@ -66,10 +66,19 @@ dfl_sid = '98831F3A'
|
|
|
dfl_devaddr = '00a329c0648769a73afac7f9381e08fb43dbea72'
|
|
|
dfl_devkey = '4d5db4107d237df6a3d58ee5f70ae63d73d7658d4026f2eefd2f204c81682cb7'
|
|
|
|
|
|
+def get_reth_dev_keypair():
|
|
|
+ from mmgen.bip39 import bip39
|
|
|
+ from mmgen.bip_hd import MasterNode
|
|
|
+ mn = 'test test test test test test test test test test test junk' # See ‘reth node --help’
|
|
|
+ seed = bip39().generate_seed(mn.split())
|
|
|
+ m = MasterNode(cfg, seed)
|
|
|
+ node = m.to_chain(idx=0, coin='eth').derive_private(0)
|
|
|
+ return (node.key.hex(), node.address)
|
|
|
+
|
|
|
burn_addr = 'deadbeef'*5
|
|
|
burn_addr2 = 'beadcafe'*5
|
|
|
|
|
|
-amt1 = '999999.12345689012345678'
|
|
|
+amt1 = '999777.12345689012345678'
|
|
|
amt2 = '888.111122223333444455'
|
|
|
|
|
|
parity_devkey_fn = 'parity.devkey'
|
|
|
@@ -81,9 +90,19 @@ def set_vbals(daemon_id):
|
|
|
vbal2 = '99.996560752'
|
|
|
vbal3 = '1.2314176'
|
|
|
vbal4 = '127.0287834'
|
|
|
- vbal5 = '1000126.14775104212345678'
|
|
|
- vbal6 = '1000126.14880104212345678'
|
|
|
- vbal7 = '1000124.91891764212345678'
|
|
|
+ vbal5 = '999904.14775104212345678'
|
|
|
+ vbal6 = '999904.14880104212345678'
|
|
|
+ vbal7 = '999902.91891764212345678'
|
|
|
+ vbal9 = '1.2262504'
|
|
|
+ elif daemon_id == 'reth':
|
|
|
+ vbal1 = '1.2288334'
|
|
|
+ vbal2 = '99.996560752'
|
|
|
+ vbal3 = '1.23142525'
|
|
|
+ vbal3 = '1.2314176'
|
|
|
+ vbal4 = '127.0287834'
|
|
|
+ vbal5 = '999904.14775104212345678'
|
|
|
+ vbal6 = '999904.14880104212345678'
|
|
|
+ vbal7 = '999902.91891764212345678'
|
|
|
vbal9 = '1.2262504'
|
|
|
else:
|
|
|
vbal1 = '1.2288396'
|
|
|
@@ -153,7 +172,7 @@ token_bals = lambda k: {
|
|
|
}[k]
|
|
|
|
|
|
token_bals_getbalance = lambda k: {
|
|
|
- '1': (vbal4, '999999.12345689012345678'),
|
|
|
+ '1': (vbal4, '999777.12345689012345678'),
|
|
|
'2': ('111.888877776666555545', '888.111122223333444455')
|
|
|
}[k]
|
|
|
|
|
|
@@ -193,6 +212,7 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
('addrimport', 'importing addresses'),
|
|
|
('addrimport_dev_addr', "importing dev faucet address 'Ox00a329c..'"),
|
|
|
('fund_dev_address', 'funding the default (Parity dev) address'),
|
|
|
+ ('cli_dev_balance', 'mmgen-cli eth_getBalance'),
|
|
|
),
|
|
|
'msg': (
|
|
|
'message signing',
|
|
|
@@ -267,8 +287,6 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
('token_deploy2a', 'deploying ERC20 token #2 (SafeMath)'),
|
|
|
('token_deploy2b', 'deploying ERC20 token #2 (Owned)'),
|
|
|
('token_deploy2c', 'deploying ERC20 token #2 (Token)'),
|
|
|
-
|
|
|
- ('contract_deploy', 'deploying contract (create, sign, send)'),
|
|
|
),
|
|
|
'token': (
|
|
|
'creating, signing, sending and bumping ERC20 token transactions',
|
|
|
@@ -410,6 +428,10 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
from mmgen.daemon import CoinDaemon
|
|
|
self.daemon = CoinDaemon( cfg, self.proto.coin+'_rt', test_suite=True)
|
|
|
|
|
|
+ if self.daemon.id == 'reth':
|
|
|
+ global dfl_devkey, dfl_devaddr
|
|
|
+ dfl_devkey, dfl_devaddr = get_reth_dev_keypair()
|
|
|
+
|
|
|
set_vbals(self.daemon.id)
|
|
|
|
|
|
self.using_solc = check_solc_ver()
|
|
|
@@ -433,16 +455,21 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
from mmgen.rpc import rpc_init
|
|
|
return await rpc_init(cfg, self.proto)
|
|
|
|
|
|
+ def mining_delay(self): # workaround for mining race condition in dev mode
|
|
|
+ if self.daemon.id == 'reth':
|
|
|
+ time.sleep(0.5)
|
|
|
+
|
|
|
async def setup(self):
|
|
|
self.spawn('', msg_only=True)
|
|
|
|
|
|
+ d = self.daemon
|
|
|
+
|
|
|
if not self.using_solc:
|
|
|
- srcdir = os.path.join(self.tr.repo_root, 'test', 'ref', 'ethereum', 'bin')
|
|
|
+ subdir = 'reth' if d.id == 'reth' else 'geth'
|
|
|
+ srcdir = os.path.join(self.tr.repo_root, 'test', 'ref', 'ethereum', 'bin', subdir)
|
|
|
from shutil import copytree
|
|
|
- for d in ('mm1', 'mm2'):
|
|
|
- copytree(os.path.join(srcdir, d), os.path.join(self.tmpdir, d))
|
|
|
-
|
|
|
- d = self.daemon
|
|
|
+ for _ in ('mm1', 'mm2'):
|
|
|
+ copytree(os.path.join(srcdir, _), os.path.join(self.tmpdir, _))
|
|
|
|
|
|
if d.id in ('geth', 'erigon'):
|
|
|
self.genesis_setup(d)
|
|
|
@@ -570,6 +597,16 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
t.expect('version')
|
|
|
return t
|
|
|
|
|
|
+ def cli_dev_balance(self):
|
|
|
+ t = self.spawn(
|
|
|
+ 'mmgen-cli',
|
|
|
+ [f'--coin={self.proto.coin}', '--regtest=1', 'eth_getBalance', '0x'+dfl_devaddr, 'latest'])
|
|
|
+ if self.daemon.id == 'geth':
|
|
|
+ t.expect('0x33b2e3c91ec0e9113986000')
|
|
|
+ elif self.daemon.id == 'reth':
|
|
|
+ t.expect('0xd3c21bcecceda1000000')
|
|
|
+ return t
|
|
|
+
|
|
|
async def _wallet_upgrade(self, src_fn, expect1, expect2=None):
|
|
|
if self.proto.coin == 'ETC':
|
|
|
msg(f'skipping test {self.test_name!r} for ETC')
|
|
|
@@ -596,7 +633,10 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
return await self._wallet_upgrade('tracking-wallet-v2.json', 'token params field', 'network field')
|
|
|
|
|
|
def addrgen(self, addrs='1-3,11-13,21-23'):
|
|
|
- t = self.spawn('mmgen-addrgen', self.eth_args + [dfl_words_file, addrs])
|
|
|
+ t = self.spawn(
|
|
|
+ 'mmgen-addrgen',
|
|
|
+ [f'--coin={self.proto.coin}'] + self.eth_args + [dfl_words_file, addrs],
|
|
|
+ no_passthru_opts = True)
|
|
|
t.written_to_file('Addresses')
|
|
|
return t
|
|
|
|
|
|
@@ -753,6 +793,7 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
return self.bal(n='3')
|
|
|
|
|
|
def tx_status(self, ext, expect_str, expect_str2='', add_args=[], exit_val=0):
|
|
|
+ self.mining_delay()
|
|
|
ext = ext.format('-α' if cfg.debug_utf8 else '')
|
|
|
txfile = self.get_file_with_ext(ext, no_dot=True)
|
|
|
t = self.spawn(
|
|
|
@@ -883,6 +924,7 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
return self.bal(n='5')
|
|
|
|
|
|
def bal(self, n):
|
|
|
+ self.mining_delay()
|
|
|
t = self.spawn('mmgen-tool', self.eth_args + ['twview', 'wide=1'])
|
|
|
text = t.read(strip_color=True)
|
|
|
for addr, amt in bals(n):
|
|
|
@@ -893,6 +935,7 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
return t
|
|
|
|
|
|
def token_bal(self, n=None):
|
|
|
+ self.mining_delay()
|
|
|
t = self.spawn('mmgen-tool', self.eth_args + ['--token=mm1', 'twview', 'wide=1'])
|
|
|
text = t.read(strip_color=True)
|
|
|
for addr, _amt1, _amt2 in token_bals(n):
|
|
|
@@ -972,8 +1015,8 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
return self.token_compile(token_data)
|
|
|
|
|
|
async def get_tx_receipt(self, txid):
|
|
|
- if self.daemon.id == 'geth': # yet another Geth bug
|
|
|
- await asyncio.sleep(0.5)
|
|
|
+ if self.daemon.id in ('geth', 'reth'): # workaround for mining race condition in dev mode
|
|
|
+ await asyncio.sleep(1 if self.daemon.id == 'reth' else 0.5)
|
|
|
from mmgen.tx import NewTX
|
|
|
tx = await NewTX(cfg=cfg, proto=self.proto, target='tx')
|
|
|
tx.rpc = await self.rpc
|
|
|
@@ -1035,16 +1078,13 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
def bal6(self):
|
|
|
return self.bal5()
|
|
|
|
|
|
- async def token_deploy2a(self):
|
|
|
- return await self.token_deploy(num=2, key='SafeMath', gas=500_000)
|
|
|
+ async def token_deploy2a(self): # test create, sign, send:
|
|
|
+ return await self.token_deploy(num=2, key='SafeMath', gas=500_000, mmgen_cmd='txcreate')
|
|
|
async def token_deploy2b(self):
|
|
|
return await self.token_deploy(num=2, key='Owned', gas=1_000_000)
|
|
|
async def token_deploy2c(self):
|
|
|
return await self.token_deploy(num=2, key='Token', gas=4_000_000)
|
|
|
|
|
|
- async def contract_deploy(self): # test create, sign, send
|
|
|
- return await self.token_deploy(num=2, key='SafeMath', gas=500_000, mmgen_cmd='txcreate')
|
|
|
-
|
|
|
async def token_transfer_ops(self, op, amt=1000, num_tokens=2):
|
|
|
self.spawn('', msg_only=True)
|
|
|
sid = dfl_sid
|
|
|
@@ -1306,6 +1346,8 @@ class CmdTestEthdev(CmdTestBase, CmdTestShared):
|
|
|
|
|
|
def _txcreate_refresh_balances(self, bals, args, total, adj_total, total_coin):
|
|
|
|
|
|
+ self.mining_delay()
|
|
|
+
|
|
|
if total_coin is None:
|
|
|
total_coin = self.proto.coin
|
|
|
|