diff --git a/mmgen/base_proto/ethereum/tw/ctl.py b/mmgen/base_proto/ethereum/tw/ctl.py index 57697a94..07fba160 100755 --- a/mmgen/base_proto/ethereum/tw/ctl.py +++ b/mmgen/base_proto/ethereum/tw/ctl.py @@ -36,7 +36,12 @@ class EthereumTrackingWallet(TrackingWallet): return addr in self.data_root def init_empty(self): - self.data = { 'coin': self.proto.coin, 'accounts': {}, 'tokens': {} } + self.data = { + 'coin': self.proto.coin, + 'network': self.proto.network.upper(), + 'accounts': {}, + 'tokens': {}, + } def upgrade_wallet_maybe(self): @@ -70,6 +75,11 @@ class EthereumTrackingWallet(TrackingWallet): add_token_params_fields() upgraded = True + if not 'network' in self.data: + ymsg(f'Upgrading {self.desc} (v3->v4: network field added)') + self.data['network'] = self.proto.network.upper() + upgraded = True + if upgraded: self.force_write() msg(f'{self.desc} upgraded successfully!') diff --git a/mmgen/tw/ctl.py b/mmgen/tw/ctl.py index 75fd05a7..f4f6411d 100755 --- a/mmgen/tw/ctl.py +++ b/mmgen/tw/ctl.py @@ -203,7 +203,7 @@ class TrackingWallet(MMGenObject,metaclass=AsyncInit): self.mode = mode_save @write_mode - def write_changed(self,data): + def write_changed(self,data,quiet): from ..fileutil import write_data_to_file write_data_to_file( self.tw_fn, @@ -211,25 +211,24 @@ class TrackingWallet(MMGenObject,metaclass=AsyncInit): desc = f'{self.base_desc} data', ask_overwrite = False, ignore_opt_outdir = True, - quiet = True, - check_data = True, + quiet = quiet, + check_data = True, # die if wallet has been altered by another program cmp_data = self.orig_data ) self.orig_data = data - def write(self): # use 'check_data' to check wallet hasn't been altered by another program + def write(self,quiet=True): if not self.use_tw_file: dmsg("'use_tw_file' is False, doing nothing") return dmsg(f'write(): checking if {self.desc} data has changed') wdata = json.dumps(self.data) - if self.orig_data != wdata: if g.debug: print_stack_trace(f'TW DATA CHANGED {self!r}') print_diff(self.orig_data,wdata,from_json=True) - self.write_changed(wdata) + self.write_changed(wdata,quiet=quiet) elif g.debug: msg('Data is unchanged\n') diff --git a/mmgen/util.py b/mmgen/util.py index d3667a81..67aa90b9 100755 --- a/mmgen/util.py +++ b/mmgen/util.py @@ -650,7 +650,7 @@ def get_subclasses(cls,names=False): yield j return tuple((c.__name__ for c in gen(cls)) if names else gen(cls)) -def base_proto_subclass(cls,proto,subdir,modname): +def base_proto_subclass(cls,proto,subdir,modname,sub_clsname=None): """ magic module loading and class selection """ @@ -658,13 +658,17 @@ def base_proto_subclass(cls,proto,subdir,modname): proto.base_proto.lower(), subdir + '.' if subdir else '', modname ) + clsname = ( proto.mod_clsname + ('Token' if proto.tokensym else '') + cls.__name__ ) import importlib - return getattr(importlib.import_module(modpath),clsname) + if sub_clsname: + return getattr(getattr(importlib.import_module(modpath),clsname),sub_clsname) + else: + return getattr(importlib.import_module(modpath),clsname) # decorator for TrackingWallet def write_mode(orig_func): diff --git a/test/overlay/__init__.py b/test/overlay/__init__.py index 485a26e1..2b3082a8 100644 --- a/test/overlay/__init__.py +++ b/test/overlay/__init__.py @@ -30,10 +30,10 @@ def overlay_setup(repo_root): os.path.join(destdir,link_fn) ) overlay_dir = get_overlay_dir(repo_root) - fakemod_root = os.path.join(repo_root,'test','overlay','fakemods') - make_link = os.symlink if sys.platform == 'linux' else shutil.copy2 if not os.path.exists(os.path.join(overlay_dir,'mmgen','main.py')): + fakemod_root = os.path.join(repo_root,'test','overlay','fakemods') + make_link = os.symlink if sys.platform == 'linux' else shutil.copy2 sys.stderr.write('Setting up overlay tree\n') shutil.rmtree(overlay_dir,ignore_errors=True) for d in ( diff --git a/test/test_py_d/ts_ethdev.py b/test/test_py_d/ts_ethdev.py index 8188436b..917a5872 100755 --- a/test/test_py_d/ts_ethdev.py +++ b/test/test_py_d/ts_ethdev.py @@ -56,6 +56,7 @@ vbal2 = '99.997088755' vbal3 = '1.23142525' vbal4 = '127.0287909' vbal5 = '1000126.14828654512345678' +vbal6 = '1000124.91944564512345678' bals = { '1': [ ('98831F3A:E:1','123.456')], @@ -301,6 +302,7 @@ class TestSuiteEthdev(TestSuiteBase,TestSuiteShared): ('token_edit_label1', f'adding label to addr #{del_addrs[0]} in {coin} token tracking wallet'), ('remove_addr1', f'removing addr #{del_addrs[0]} from {coin} tracking wallet'), + ('twview6', 'twview (balance reduced after address removal)'), ('remove_addr2', f'removing addr #{del_addrs[1]} from {coin} tracking wallet'), ('token_remove_addr1', f'removing addr #{del_addrs[0]} from {coin} token tracking wallet'), ('token_remove_addr2', f'removing addr #{del_addrs[1]} from {coin} token tracking wallet'), @@ -1080,7 +1082,9 @@ class TestSuiteEthdev(TestSuiteBase,TestSuiteShared): return self.token_bal(n='3') def del_dev_addr(self): - return self.spawn('mmgen-tool', self.eth_args + ['remove_address',dfl_devaddr]) + t = self.spawn('mmgen-tool', self.eth_args + ['remove_address', dfl_devaddr]) + t.expect(f"'{dfl_devaddr}' deleted") + return t def bal1_getbalance(self): return self.bal_getbalance('1',etc_adj=True) @@ -1199,6 +1203,8 @@ class TestSuiteEthdev(TestSuiteBase,TestSuiteShared): return self.twview(tool_args=['wide=1','minconf=999999999']) def twview5(self): return self.twview(tool_args=['wide=1','minconf=0']) + def twview6(self): + return self.twview(expect_str=vbal6) def token_twview1(self): return self.twview(args=['--token=mm1'])