From 4204a32311a6eae9df54591dc391ed093ea1eaca Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Sat, 16 May 2020 16:07:28 +0000 Subject: [PATCH] coin protocol: minor cleanups --- mmgen/addr.py | 4 ++-- mmgen/obj.py | 14 +++++++------- mmgen/protocol.py | 17 +++++++++-------- mmgen/rpc.py | 5 +++-- mmgen/util.py | 7 ++++--- test/test.py | 15 +++++++++------ test/test_py_d/ts_main.py | 2 -- test/test_py_d/ts_ref.py | 4 ++-- 8 files changed, 36 insertions(+), 32 deletions(-) diff --git a/mmgen/addr.py b/mmgen/addr.py index c458d724..bfa461dc 100755 --- a/mmgen/addr.py +++ b/mmgen/addr.py @@ -678,10 +678,10 @@ Removed {{}} duplicate WIF key{{}} from keylist (also in {pnm} key-address file al_coin,al_mmtype = None,None tn = lbl[-8:] == ':TESTNET' if tn: - assert g.proto.testnet,'{} file is testnet but protocol is mainnet!'.format(self.data_desc) + assert g.proto.testnet, f'{self.data_desc} file is testnet but protocol is mainnet!' lbl = lbl[:-8] else: - assert not g.proto.testnet,'{} file is mainnet but protocol is testnet!'.format(self.data_desc) + assert not g.proto.testnet, f'{self.data_desc} file is mainnet but protocol is testnet!' lbl = lbl.split(':',1) if len(lbl) == 2: al_coin,al_mmtype = lbl[0],lbl[1].lower() diff --git a/mmgen/obj.py b/mmgen/obj.py index 29807850..dd8ebb88 100755 --- a/mmgen/obj.py +++ b/mmgen/obj.py @@ -529,7 +529,7 @@ class CoinAddr(str,Hilite,InitErrors,MMGenObject): me.hex = ap.bytes.hex() return me except Exception as e: - return cls.init_fail(e,s,objname='{} address'.format(type(g.proto).__name__)) + return cls.init_fail(e,s,objname=f'{g.proto.cls_name} address') @classmethod def fmtc(cls,s,**kwargs): @@ -538,7 +538,7 @@ class CoinAddr(str,Hilite,InitErrors,MMGenObject): def is_for_chain(self,chain): - if type(g.proto).__name__.startswith('Ethereum'): + if g.proto.name.startswith('Ethereum'): return True from mmgen.protocol import init_proto @@ -621,7 +621,7 @@ class MMGenID(str,Hilite,InitErrors,MMGenObject): me.sid = SeedID(sid=ss[0],on_fail='raise') me.idx = AddrIdx(ss[-1],on_fail='raise') me.mmtype = t - assert t in g.proto.mmtypes,'{}: invalid address type for {}'.format(t,type(g.proto).__name__) + assert t in g.proto.mmtypes, f'{t}: invalid address type for {g.proto.cls_name}' me.al_id = str.__new__(AddrListID,me.sid+':'+me.mmtype) # checks already done me.sort_key = '{}:{}:{:0{w}}'.format(me.sid,me.mmtype,me.idx,w=me.idx.max_digits) return me @@ -755,8 +755,8 @@ class PrivKey(str,Hilite,InitErrors,MMGenObject): me.wif = str.__new__(WifKey,wif) # check has been done me.orig_hex = None if k.sec != g.proto.preprocess_key(k.sec,k.pubkey_type): - m = '{} WIF key {!r} encodes private key with unacceptable value {}' - raise PrivateKeyError(m.format(type(g.proto).__name__,me.wif,me)) + raise PrivateKeyError( + f'{g.proto.cls_name} WIF key {me.wif!r} encodes private key with invalid value {me}') return me except Exception as e: return cls.init_fail(e,s,objname='{} WIF key'.format(g.coin)) @@ -914,8 +914,8 @@ class MMGenAddrType(str,Hilite,InitErrors,MMGenObject): me = str.__new__(cls,s) for k in v._fields: setattr(me,k,getattr(v,k)) - assert me in g.proto.mmtypes + ('P',), ( - "'{}': invalid address type for {}".format(me.name,type(g.proto).__name__)) + if me not in g.proto.mmtypes + ('P',): + raise ValueError(f'{me.name!r}: invalid address type for {g.proto.cls_name}') return me raise ValueError('unrecognized address type') except Exception as e: diff --git a/mmgen/protocol.py b/mmgen/protocol.py index 7b49baab..31bdf486 100755 --- a/mmgen/protocol.py +++ b/mmgen/protocol.py @@ -88,18 +88,19 @@ class CoinProtocol(MMGenObject): networks = ('mainnet','testnet','regtest') def __init__(self,coin,name,network): - self.coin = coin.upper() - self.dcoin = self.coin # display coin - for Ethereum, is set to ERC20 token name - self.name = name - self.network = network - self.testnet = network in ('testnet','regtest') - self.regtest = network == 'regtest' + self.coin = coin.upper() + self.dcoin = self.coin # display coin - for Ethereum, is set to ERC20 token name + self.name = name + self.cls_name = type(self).__name__ + self.network = network + self.testnet = network in ('testnet','regtest') + self.regtest = network == 'regtest' def cap(self,s): return s in self.caps class Bitcoin(Common): # chainparams.cpp - mod_clsname = 'bitcoin' + mod_clsname = 'Bitcoin' daemon_name = 'bitcoind' daemon_family = 'bitcoind' addr_ver_bytes = { '00': 'p2pkh', '05': 'p2sh' } @@ -342,7 +343,7 @@ class CoinProtocol(MMGenObject): addr_len = 20 mmtypes = ('E',) dfl_mmtype = 'E' - mod_clsname = 'ethereum' + mod_clsname = 'Ethereum' base_coin = 'ETH' pubkey_type = 'std' # required by DummyWIF diff --git a/mmgen/rpc.py b/mmgen/rpc.py index 26c57b2e..69b6fb81 100755 --- a/mmgen/rpc.py +++ b/mmgen/rpc.py @@ -330,7 +330,8 @@ class BitcoinRPCClient(RPCClient,metaclass=aInitMeta): async def check_chainfork_mismatch(block0): try: - assert block0 == self.proto.block0,'Incorrect Genesis block for {}'.format(type(self.proto).__name__) + if block0 != self.proto.block0: + raise ValueError(f'Invalid Genesis block for {self.proto.cls_name} protocol') for fork in self.proto.forks: if fork.height == None or self.blockcount < fork.height: break @@ -555,7 +556,7 @@ async def rpc_init(proto=None,backend=None): backend = backend or opt.rpc_backend if not 'rpc' in proto.mmcaps: - die(1,'Coin daemon operations not supported for {}!'.format(type(proto).__name__)) + die(1,f'Coin daemon operations not supported for {proto.name} protocol!') g.rpc = await { 'bitcoind': BitcoinRPCClient, diff --git a/mmgen/util.py b/mmgen/util.py index 188bfe2b..b69f08c4 100755 --- a/mmgen/util.py +++ b/mmgen/util.py @@ -860,12 +860,13 @@ def format_par(s,indent=0,width=80,as_list=False): # module loading magic for tx.py and tw.py def altcoin_subclass(cls,mod_id,cls_name): - if cls.__name__ != cls_name: return cls + if cls.__name__ != cls_name: + return cls mod_dir = g.proto.base_coin.lower() tname = 'Token' if g.token else '' import importlib - modname = 'mmgen.altcoins.{}.{}'.format(mod_dir,mod_id) - clsname = '{}{}{}'.format(capfirst(g.proto.mod_clsname),tname,cls_name) + modname = f'mmgen.altcoins.{mod_dir}.{mod_id}' + clsname = g.proto.mod_clsname + tname + cls_name try: return getattr(importlib.import_module(modname),clsname) except ImportError: diff --git a/test/test.py b/test/test.py index f55b7b5b..cc7a0ef1 100755 --- a/test/test.py +++ b/test/test.py @@ -23,7 +23,7 @@ test/test.py: Test suite for the MMGen wallet system def check_segwit_opts(): for k,m in (('segwit','S'),('segwit_random','S'),('bech32','B')): if getattr(opt,k) and m not in g.proto.mmtypes: - die(1,'--{} option incompatible with {}'.format(k.replace('_','-'),type(g.proto).__name__)) + die(1,f'--{k.replace("_","-")} option incompatible with {g.proto.cls_name}') def create_shm_dir(data_dir,trash_dir): # Laggy flash media can cause pexpect to fail, so create a temporary directory @@ -696,11 +696,14 @@ class TestSuiteRunner(object): else: segwit_opt = None - m1 = ('test group {g!r}','{g}:{c}')[bool(cmd)].format(g=gname,c=cmd) - m2 = ' for {} {}net'.format(g.coin.lower(),'test' if g.proto.testnet else 'main') \ - if len(ts_cls.networks) != 1 else '' - m3 = ' (--{})'.format(segwit_opt.replace('_','-')) if segwit_opt else '' - m = m1 + m2 + m3 + def gen_msg(): + yield ('{g}:{c}' if cmd else 'test group {g!r}').format(g=gname,c=cmd) + if len(ts_cls.networks) != 1: + yield ' for {} {}'.format(g.proto.coin,g.proto.network) + if segwit_opt: + yield ' (--{})'.format(segwit_opt.replace('_','-')) + + m = ''.join(gen_msg()) if segwit_opt and not ts_cls.segwit_opts_ok: iqmsg('INFO → skipping ' + m) diff --git a/test/test_py_d/ts_main.py b/test/test_py_d/ts_main.py index 6bb73bf1..922feae1 100755 --- a/test/test_py_d/ts_main.py +++ b/test/test_py_d/ts_main.py @@ -147,8 +147,6 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): if g.coin.lower() not in self.networks: return from mmgen.rpc import rpc_init - if g.proto.regtest: # rpc_init hack - g.proto = init_proto(g.coin,network='testnet') self.rpc = run_session(rpc_init()) self.lbl_id = ('account','label')['label_api' in self.rpc.caps] if g.coin in ('BTC','BCH','LTC'): diff --git a/test/test_py_d/ts_ref.py b/test/test_py_d/ts_ref.py index 634a42f4..8b22a2fd 100755 --- a/test/test_py_d/ts_ref.py +++ b/test/test_py_d/ts_ref.py @@ -231,12 +231,12 @@ class TestSuiteRef(TestSuiteBase,TestSuiteShared): def ref_segwitaddrfile_chk(self): if not 'S' in g.proto.mmtypes: - return skip('not supported by {}'.format(type(g.proto).__name__)) + return skip(f'not supported by {g.protocol.cls_name} protocol') return self.ref_addrfile_chk(ftype='segwitaddr',pat='{}.*Segwit'.format(nw_name)) def ref_bech32addrfile_chk(self): if not 'B' in g.proto.mmtypes: - return skip('not supported by {}'.format(type(g.proto).__name__)) + return skip(f'not supported by {g.protocol.cls_name} protocol') return self.ref_addrfile_chk(ftype='bech32addr',pat='{}.*Bech32'.format(nw_name)) def ref_keyaddrfile_chk(self):