From 0fef35f567613e5f82ca1703d695be15040c24e5 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Thu, 10 Feb 2022 12:51:41 +0000 Subject: [PATCH] move tracking wallet modules to `tw` and `base_proto/{name}/tw` --- mmgen/addrdata.py | 6 ++-- mmgen/base_proto/bitcoin/tw/__init__.py | 0 .../bitcoin/{twaddrs.py => tw/addrs.py} | 12 +++---- .../bitcoin/{twbal.py => tw/bal.py} | 4 +-- .../bitcoin/{tw.py => tw/common.py} | 4 +-- .../bitcoin/{twctl.py => tw/ctl.py} | 4 +-- .../bitcoin/{twuo.py => tw/unspent.py} | 4 +-- mmgen/base_proto/ethereum/tw/__init__.py | 0 .../ethereum/{twaddrs.py => tw/addrs.py} | 8 ++--- .../ethereum/{twbal.py => tw/bal.py} | 4 +-- .../ethereum/{tw.py => tw/common.py} | 8 ++--- .../ethereum/{twctl.py => tw/ctl.py} | 12 +++---- .../ethereum/{twuo.py => tw/unspent.py} | 8 ++--- mmgen/base_proto/ethereum/tx/new.py | 2 +- mmgen/main_addrimport.py | 6 ++-- mmgen/main_txbump.py | 2 +- mmgen/main_txcreate.py | 2 +- mmgen/main_txdo.py | 2 +- mmgen/tool/rpc.py | 12 +++---- mmgen/tw/__init__.py | 0 mmgen/{twaddrs.py => tw/addrs.py} | 14 ++++---- mmgen/{twbal.py => tw/bal.py} | 12 +++---- mmgen/{tw.py => tw/common.py} | 6 ++-- mmgen/{twctl.py => tw/ctl.py} | 28 ++++++++-------- mmgen/{twuo.py => tw/unspent.py} | 32 +++++++++---------- mmgen/tx/__init__.py | 2 +- mmgen/tx/new.py | 2 +- mmgen/util.py | 4 +-- setup.cfg | 3 ++ test/objattrtest.py | 2 +- test/objattrtest_py_d/oat_common.py | 2 +- test/objtest.py | 2 +- test/overlay/__init__.py | 3 ++ .../bitcoin/{twuo.py => tw/unspent.py} | 4 +-- test/overlay/fakemods/{tw.py => tw/common.py} | 2 +- test/test_py_d/ts_main.py | 2 +- 36 files changed, 113 insertions(+), 107 deletions(-) create mode 100755 mmgen/base_proto/bitcoin/tw/__init__.py rename mmgen/base_proto/bitcoin/{twaddrs.py => tw/addrs.py} (95%) rename mmgen/base_proto/bitcoin/{twbal.py => tw/bal.py} (94%) rename mmgen/base_proto/bitcoin/{tw.py => tw/common.py} (95%) rename mmgen/base_proto/bitcoin/{twctl.py => tw/ctl.py} (94%) rename mmgen/base_proto/bitcoin/{twuo.py => tw/unspent.py} (97%) create mode 100755 mmgen/base_proto/ethereum/tw/__init__.py rename mmgen/base_proto/ethereum/{twaddrs.py => tw/addrs.py} (93%) rename mmgen/base_proto/ethereum/{twbal.py => tw/bal.py} (95%) rename mmgen/base_proto/ethereum/{tw.py => tw/common.py} (91%) rename mmgen/base_proto/ethereum/{twctl.py => tw/ctl.py} (96%) rename mmgen/base_proto/ethereum/{twuo.py => tw/unspent.py} (96%) create mode 100755 mmgen/tw/__init__.py rename mmgen/{twaddrs.py => tw/addrs.py} (92%) rename mmgen/{twbal.py => tw/bal.py} (89%) rename mmgen/{tw.py => tw/common.py} (96%) rename mmgen/{twctl.py => tw/ctl.py} (93%) rename mmgen/{twuo.py => tw/unspent.py} (96%) rename test/overlay/fakemods/base_proto/bitcoin/{twuo.py => tw/unspent.py} (80%) rename test/overlay/fakemods/{tw.py => tw/common.py} (96%) diff --git a/mmgen/addrdata.py b/mmgen/addrdata.py index 51c1f007..d71dc1a0 100755 --- a/mmgen/addrdata.py +++ b/mmgen/addrdata.py @@ -20,7 +20,7 @@ addrdata.py: MMGen AddrData and related classes """ -from .util import vmsg,base_proto_subclass,fmt,die +from .util import vmsg,base_proto_tw_subclass,fmt,die from .base_obj import AsyncInit from .obj import MMGenObject,MMGenDict,get_obj from .addr import MMGenID,AddrListID @@ -69,11 +69,11 @@ class AddrData(MMGenObject): class TwAddrData(AddrData,metaclass=AsyncInit): def __new__(cls,proto,*args,**kwargs): - return MMGenObject.__new__(base_proto_subclass(cls,proto,'tw')) + return MMGenObject.__new__(base_proto_tw_subclass(cls,proto,'common')) async def __init__(self,proto,wallet=None): from .rpc import rpc_init - from .tw import TwLabel + from .tw.common import TwLabel from .globalvars import g from .seed import SeedID self.proto = proto diff --git a/mmgen/base_proto/bitcoin/tw/__init__.py b/mmgen/base_proto/bitcoin/tw/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/mmgen/base_proto/bitcoin/twaddrs.py b/mmgen/base_proto/bitcoin/tw/addrs.py similarity index 95% rename from mmgen/base_proto/bitcoin/twaddrs.py rename to mmgen/base_proto/bitcoin/tw/addrs.py index aaaa75c5..7a5fd87f 100755 --- a/mmgen/base_proto/bitcoin/twaddrs.py +++ b/mmgen/base_proto/bitcoin/tw/addrs.py @@ -12,12 +12,12 @@ base_proto.bitcoin.twaddrs: Bitcoin base protocol tracking wallet address list class """ -from ...twaddrs import TwAddrList -from ...util import msg,die -from ...obj import MMGenList -from ...addr import CoinAddr -from ...rpc import rpc_init -from ...tw import get_tw_label +from ....util import msg,die +from ....obj import MMGenList +from ....addr import CoinAddr +from ....rpc import rpc_init +from ....tw.addrs import TwAddrList +from ....tw.common import get_tw_label class BitcoinTwAddrList(TwAddrList): diff --git a/mmgen/base_proto/bitcoin/twbal.py b/mmgen/base_proto/bitcoin/tw/bal.py similarity index 94% rename from mmgen/base_proto/bitcoin/twbal.py rename to mmgen/base_proto/bitcoin/tw/bal.py index 4cc74636..7f2d0037 100755 --- a/mmgen/base_proto/bitcoin/twbal.py +++ b/mmgen/base_proto/bitcoin/tw/bal.py @@ -12,8 +12,8 @@ base_proto.bitcoin.twbal: Bitcoin base protocol tracking wallet balance class """ -from ...twbal import TwGetBalance -from ...tw import get_tw_label +from ....tw.bal import TwGetBalance +from ....tw.common import get_tw_label class BitcoinTwGetBalance(TwGetBalance): diff --git a/mmgen/base_proto/bitcoin/tw.py b/mmgen/base_proto/bitcoin/tw/common.py similarity index 95% rename from mmgen/base_proto/bitcoin/tw.py rename to mmgen/base_proto/bitcoin/tw/common.py index ac1a6c9e..18273e44 100755 --- a/mmgen/base_proto/bitcoin/tw.py +++ b/mmgen/base_proto/bitcoin/tw/common.py @@ -12,8 +12,8 @@ base_proto.bitcoin.tw: Bitcoin base protocol tracking wallet dependency classes """ -from ...addrdata import TwAddrData -from ...util import vmsg +from ....addrdata import TwAddrData +from ....util import vmsg class BitcoinTwAddrData(TwAddrData): diff --git a/mmgen/base_proto/bitcoin/twctl.py b/mmgen/base_proto/bitcoin/tw/ctl.py similarity index 94% rename from mmgen/base_proto/bitcoin/twctl.py rename to mmgen/base_proto/bitcoin/tw/ctl.py index 98af9cc8..2090efd4 100755 --- a/mmgen/base_proto/bitcoin/twctl.py +++ b/mmgen/base_proto/bitcoin/tw/ctl.py @@ -12,8 +12,8 @@ base_proto.bitcoin.twctl: Bitcoin base protocol tracking wallet control class """ -from ...twctl import TrackingWallet -from ...util import rmsg,write_mode +from ....tw.ctl import TrackingWallet +from ....util import rmsg,write_mode class BitcoinTrackingWallet(TrackingWallet): diff --git a/mmgen/base_proto/bitcoin/twuo.py b/mmgen/base_proto/bitcoin/tw/unspent.py similarity index 97% rename from mmgen/base_proto/bitcoin/twuo.py rename to mmgen/base_proto/bitcoin/tw/unspent.py index 0fbbfa1e..0ab8206a 100755 --- a/mmgen/base_proto/bitcoin/twuo.py +++ b/mmgen/base_proto/bitcoin/tw/unspent.py @@ -12,8 +12,8 @@ base_proto.bitcoin.twuo: Bitcoin base protocol tracking wallet unspent outputs class """ -from ...twuo import TwUnspentOutputs -from ...addr import CoinAddr +from ....tw.unspent import TwUnspentOutputs +from ....addr import CoinAddr class BitcoinTwUnspentOutputs(TwUnspentOutputs): diff --git a/mmgen/base_proto/ethereum/tw/__init__.py b/mmgen/base_proto/ethereum/tw/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/mmgen/base_proto/ethereum/twaddrs.py b/mmgen/base_proto/ethereum/tw/addrs.py similarity index 93% rename from mmgen/base_proto/ethereum/twaddrs.py rename to mmgen/base_proto/ethereum/tw/addrs.py index d8012629..db690bd0 100755 --- a/mmgen/base_proto/ethereum/twaddrs.py +++ b/mmgen/base_proto/ethereum/tw/addrs.py @@ -20,7 +20,7 @@ base_proto.ethereum.twaddrs: Ethereum tracking wallet address list class """ -from ...twaddrs import TwAddrList +from ....tw.addrs import TwAddrList class EthereumTwAddrList(TwAddrList): @@ -28,9 +28,9 @@ class EthereumTwAddrList(TwAddrList): async def __init__(self,proto,usr_addr_list,minconf,showempty,showbtcaddrs,all_labels,wallet=None): - from ...tw import TwLabel - from ...twctl import TrackingWallet - from ...addr import CoinAddr + from ....tw.common import TwLabel + from ....tw.ctl import TrackingWallet + from ....addr import CoinAddr self.proto = proto self.wallet = wallet or await TrackingWallet(self.proto,mode='w') diff --git a/mmgen/base_proto/ethereum/twbal.py b/mmgen/base_proto/ethereum/tw/bal.py similarity index 95% rename from mmgen/base_proto/ethereum/twbal.py rename to mmgen/base_proto/ethereum/tw/bal.py index 59d6f57e..b37aaef5 100755 --- a/mmgen/base_proto/ethereum/twbal.py +++ b/mmgen/base_proto/ethereum/tw/bal.py @@ -20,8 +20,8 @@ base_proto.ethereum.twbal: Ethereum tracking wallet getbalance class """ -from ...twctl import TrackingWallet -from ...twbal import TwGetBalance +from ....tw.ctl import TrackingWallet +from ....tw.bal import TwGetBalance class EthereumTwGetBalance(TwGetBalance): diff --git a/mmgen/base_proto/ethereum/tw.py b/mmgen/base_proto/ethereum/tw/common.py similarity index 91% rename from mmgen/base_proto/ethereum/tw.py rename to mmgen/base_proto/ethereum/tw/common.py index 581bb8a1..7b8565c0 100755 --- a/mmgen/base_proto/ethereum/tw.py +++ b/mmgen/base_proto/ethereum/tw/common.py @@ -20,8 +20,8 @@ base_proto.ethereum.tw: Ethereum tracking wallet dependency classes """ -from ...addrdata import TwAddrData -from ...util import vmsg +from ....addrdata import TwAddrData +from ....util import vmsg class EthereumTwAddrData(TwAddrData): @@ -33,8 +33,8 @@ class EthereumTwAddrData(TwAddrData): } async def get_tw_data(self,wallet=None): - from ...twctl import TrackingWallet - from ...util import vmsg + from ....tw.ctl import TrackingWallet + from ....util import vmsg vmsg('Getting address data from tracking wallet') tw = (wallet or await TrackingWallet(self.proto)).mmid_ordered_dict # emulate the output of RPC 'listaccounts' and 'getaddressesbyaccount' diff --git a/mmgen/base_proto/ethereum/twctl.py b/mmgen/base_proto/ethereum/tw/ctl.py similarity index 96% rename from mmgen/base_proto/ethereum/twctl.py rename to mmgen/base_proto/ethereum/tw/ctl.py index 83940e56..c97f6116 100755 --- a/mmgen/base_proto/ethereum/twctl.py +++ b/mmgen/base_proto/ethereum/tw/ctl.py @@ -20,11 +20,11 @@ base_proto.ethereum.twctl: Ethereum tracking wallet control class """ -from ...util import msg,ymsg,write_mode,die -from ...twctl import TrackingWallet -from ...addr import is_coin_addr,is_mmgen_id -from ...amt import ETHAmt -from .contract import Token,TokenResolve +from ....util import msg,ymsg,write_mode,die +from ....tw.ctl import TrackingWallet +from ....addr import is_coin_addr,is_mmgen_id +from ....amt import ETHAmt +from ..contract import Token,TokenResolve class EthereumTrackingWallet(TrackingWallet): @@ -167,7 +167,7 @@ class EthereumTokenTrackingWallet(EthereumTrackingWallet): if not is_coin_addr(proto,token_addr): die( 'UnrecognizedTokenSymbol', f'Specified token {proto.tokensym!r} could not be resolved!' ) - from ...addr import TokenAddr + from ....addr import TokenAddr self.token = TokenAddr(proto,token_addr) if self.token not in self.data['tokens']: diff --git a/mmgen/base_proto/ethereum/twuo.py b/mmgen/base_proto/ethereum/tw/unspent.py similarity index 96% rename from mmgen/base_proto/ethereum/twuo.py rename to mmgen/base_proto/ethereum/tw/unspent.py index 20f100fb..24dc0df8 100755 --- a/mmgen/base_proto/ethereum/twuo.py +++ b/mmgen/base_proto/ethereum/tw/unspent.py @@ -20,8 +20,8 @@ base_proto.ethereum.twuo: Ethereum tracking wallet unspent outputs class """ -from ...tw import TwLabel -from ...twuo import TwUnspentOutputs +from ....tw.common import TwLabel +from ....tw.unspent import TwUnspentOutputs # No unspent outputs with Ethereum, but naming must be consistent class EthereumTwUnspentOutputs(TwUnspentOutputs): @@ -53,9 +53,9 @@ Actions: [q]uit view, [p]rint to file, pager [v]iew, [w]ide view, display_hdr_fs_fs = display_fs_fs async def __init__(self,proto,*args,**kwargs): - from ...globalvars import g + from ....globalvars import g if g.cached_balances: - from ...color import yellow + from ....color import yellow self.hdr_fmt += '\n' + yellow('WARNING: Using cached balances. These may be out of date!') await super().__init__(proto,*args,**kwargs) diff --git a/mmgen/base_proto/ethereum/tx/new.py b/mmgen/base_proto/ethereum/tx/new.py index 11e10fe3..19fdec21 100755 --- a/mmgen/base_proto/ethereum/tx/new.py +++ b/mmgen/base_proto/ethereum/tx/new.py @@ -20,7 +20,7 @@ from ....opts import opt from ....obj import Int,ETHNonce,MMGenTxID,Str from ....amt import ETHAmt from ....util import msg,line_input,is_int,is_hex_str,make_chksum_6 -from ....twctl import TrackingWallet +from ....tw.ctl import TrackingWallet from ....addr import is_mmgen_id,is_coin_addr from ..contract import Token diff --git a/mmgen/main_addrimport.py b/mmgen/main_addrimport.py index a52e4f3a..9b7ea085 100755 --- a/mmgen/main_addrimport.py +++ b/mmgen/main_addrimport.py @@ -24,7 +24,7 @@ import time from .common import * from .addrlist import AddrList,KeyAddrList -from .tw import TwLabel +from .tw.common import TwLabel ai_msgs = lambda k: { 'rescan': """ @@ -158,9 +158,9 @@ def make_args_list(tw,al,batch,rescan): yield (tw,e.addr,TwLabel(proto,label),rescan,fs,msg_args) async def main(): - from .twctl import TrackingWallet + from .tw.ctl import TrackingWallet if opt.token_addr: - proto.tokensym = 'foo' # hack to trigger 'Token' in base_proto_subclass() + proto.tokensym = 'foo' # hack to trigger 'Token' in base_proto_tw_subclass() tw = await TrackingWallet( proto = proto, diff --git a/mmgen/main_txbump.py b/mmgen/main_txbump.py index 94708ddc..084314ee 100755 --- a/mmgen/main_txbump.py +++ b/mmgen/main_txbump.py @@ -129,7 +129,7 @@ async def main(): kl = get_keylist(orig_tx.proto,opt) sign_and_send = bool(seed_files or kl or kal) - from .twctl import TrackingWallet + from .tw.ctl import TrackingWallet tx = await BumpTX( data = orig_tx.__dict__, send = sign_and_send, diff --git a/mmgen/main_txcreate.py b/mmgen/main_txcreate.py index 7f6f6c31..bf6fa02a 100755 --- a/mmgen/main_txcreate.py +++ b/mmgen/main_txcreate.py @@ -82,7 +82,7 @@ async def main(): proto = init_proto_from_opts(need_amt=True) from .tx import NewTX - from .twctl import TrackingWallet + from .tw.ctl import TrackingWallet tx1 = await NewTX(proto=proto) from .rpc import rpc_init diff --git a/mmgen/main_txdo.py b/mmgen/main_txdo.py index 5d199927..d85cc0d3 100755 --- a/mmgen/main_txdo.py +++ b/mmgen/main_txdo.py @@ -122,7 +122,7 @@ from .txsign import * seed_files = get_seed_files(opt,cmd_args) async def main(): - from .twctl import TrackingWallet + from .tw.ctl import TrackingWallet from .protocol import init_proto_from_opts proto = init_proto_from_opts(need_amt=True) diff --git a/mmgen/tool/rpc.py b/mmgen/tool/rpc.py index 2c5a81a5..b718a51f 100755 --- a/mmgen/tool/rpc.py +++ b/mmgen/tool/rpc.py @@ -21,7 +21,7 @@ tool/rpc.py: JSON/RPC routines for the 'mmgen-tool' utility """ from .common import tool_cmd_base,options_annot_str -from ..tw import TwCommon +from ..tw.common import TwCommon class tool_cmd(tool_cmd_base): "tracking wallet commands using the JSON-RPC interface" @@ -37,7 +37,7 @@ class tool_cmd(tool_cmd_base): async def getbalance(self,minconf=1,quiet=False,pager=False): "list confirmed/unconfirmed, spendable/unspendable balances in tracking wallet" - from ..twbal import TwGetBalance + from ..tw.bal import TwGetBalance return (await TwGetBalance(self.proto,minconf,quiet)).format() async def listaddress(self, @@ -89,7 +89,7 @@ class tool_cmd(tool_cmd_base): from ..addrlist import AddrIdxList usr_addr_list = [MMGenID(self.proto,f'{a[0]}:{i}') for i in AddrIdxList(a[1])] - from ..twaddrs import TwAddrList + from ..tw.addrs import TwAddrList al = await TwAddrList( self.proto, usr_addr_list, minconf, showempty, showbtcaddrs, all_labels ) if not al: from ..util import die @@ -107,7 +107,7 @@ class tool_cmd(tool_cmd_base): wide_show_confs = True ): "view tracking wallet" - from ..twuo import TwUnspentOutputs + from ..tw.unspent import TwUnspentOutputs twuo = await TwUnspentOutputs(self.proto,minconf=minconf) await twuo.get_unspent_data(reverse_sort=reverse) twuo.age_fmt = age_fmt @@ -121,7 +121,7 @@ class tool_cmd(tool_cmd_base): async def add_label(self,mmgen_or_coin_addr:str,label:str): "add descriptive label for address in tracking wallet" - from ..twctl import TrackingWallet + from ..tw.ctl import TrackingWallet await (await TrackingWallet(self.proto,mode='w')).add_label( mmgen_or_coin_addr, label, on_fail='raise' ) return True @@ -132,7 +132,7 @@ class tool_cmd(tool_cmd_base): async def remove_address(self,mmgen_or_coin_addr:str): "remove an address from tracking wallet" - from ..twctl import TrackingWallet + from ..tw.ctl import TrackingWallet ret = await (await TrackingWallet(self.proto,mode='w')).remove_address(mmgen_or_coin_addr) # returns None on failure if ret: from ..util import msg diff --git a/mmgen/tw/__init__.py b/mmgen/tw/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/mmgen/twaddrs.py b/mmgen/tw/addrs.py similarity index 92% rename from mmgen/twaddrs.py rename to mmgen/tw/addrs.py index 6c5a038c..2ae68108 100755 --- a/mmgen/twaddrs.py +++ b/mmgen/tw/addrs.py @@ -20,17 +20,17 @@ twaddrs: Tracking wallet listaddresses class for the MMGen suite """ -from .color import green -from .util import msg,die,base_proto_subclass -from .base_obj import AsyncInit -from .obj import MMGenDict,TwComment -from .addr import CoinAddr,MMGenID -from .tw import TwCommon +from ..color import green +from ..util import msg,die,base_proto_tw_subclass +from ..base_obj import AsyncInit +from ..obj import MMGenDict,TwComment +from ..addr import CoinAddr,MMGenID +from .common import TwCommon class TwAddrList(MMGenDict,TwCommon,metaclass=AsyncInit): def __new__(cls,proto,*args,**kwargs): - return MMGenDict.__new__(base_proto_subclass(cls,proto,'twaddrs'),*args,**kwargs) + return MMGenDict.__new__(base_proto_tw_subclass(cls,proto,'addrs'),*args,**kwargs) def raw_list(self): return [((k if k.type == 'mmgen' else 'Non-MMGen'),self[k]['addr'],self[k]['amt']) for k in self] diff --git a/mmgen/twbal.py b/mmgen/tw/bal.py similarity index 89% rename from mmgen/twbal.py rename to mmgen/tw/bal.py index b2dff2b5..885ae9da 100755 --- a/mmgen/twbal.py +++ b/mmgen/tw/bal.py @@ -20,16 +20,16 @@ twbal: Tracking wallet getbalance class for the MMGen suite """ -from .color import red,green -from .util import base_proto_subclass -from .base_obj import AsyncInit -from .objmethods import MMGenObject -from .rpc import rpc_init +from ..color import red,green +from ..util import base_proto_tw_subclass +from ..base_obj import AsyncInit +from ..objmethods import MMGenObject +from ..rpc import rpc_init class TwGetBalance(MMGenObject,metaclass=AsyncInit): def __new__(cls,proto,*args,**kwargs): - return MMGenObject.__new__(base_proto_subclass(cls,proto,'twbal')) + return MMGenObject.__new__(base_proto_tw_subclass(cls,proto,'bal')) async def __init__(self,proto,minconf,quiet): diff --git a/mmgen/tw.py b/mmgen/tw/common.py similarity index 96% rename from mmgen/tw.py rename to mmgen/tw/common.py index 09866cd9..79c60a40 100755 --- a/mmgen/tw.py +++ b/mmgen/tw/common.py @@ -22,9 +22,9 @@ tw: Tracking wallet dependency classes and helper functions import time -from .objmethods import Hilite,InitErrors,MMGenObject -from .obj import TwComment -from .addr import MMGenID +from ..objmethods import Hilite,InitErrors,MMGenObject +from ..obj import TwComment +from ..addr import MMGenID # mixin class for TwUnspentOutputs,TwAddrList: class TwCommon: diff --git a/mmgen/twctl.py b/mmgen/tw/ctl.py similarity index 93% rename from mmgen/twctl.py rename to mmgen/tw/ctl.py index a8102e88..60998933 100755 --- a/mmgen/twctl.py +++ b/mmgen/tw/ctl.py @@ -20,14 +20,14 @@ twctl: Tracking wallet control class for the MMGen suite """ -from .globalvars import g -from .util import msg,dmsg,write_mode,base_proto_subclass,die -from .base_obj import AsyncInit -from .objmethods import MMGenObject -from .obj import TwComment,get_obj -from .addr import CoinAddr,is_mmgen_id,is_coin_addr -from .rpc import rpc_init -from .tw import TwMMGenID,TwLabel +from ..globalvars import g +from ..util import msg,dmsg,write_mode,base_proto_tw_subclass,die +from ..base_obj import AsyncInit +from ..objmethods import MMGenObject +from ..obj import TwComment,get_obj +from ..addr import CoinAddr,is_mmgen_id,is_coin_addr +from ..rpc import rpc_init +from .common import TwMMGenID,TwLabel class TrackingWallet(MMGenObject,metaclass=AsyncInit): @@ -38,7 +38,7 @@ class TrackingWallet(MMGenObject,metaclass=AsyncInit): importing = False def __new__(cls,proto,*args,**kwargs): - return MMGenObject.__new__(base_proto_subclass(cls,proto,'twctl')) + return MMGenObject.__new__(base_proto_tw_subclass(cls,proto,'ctl')) async def __init__(self,proto,mode='r',token_addr=None): @@ -81,7 +81,7 @@ class TrackingWallet(MMGenObject,metaclass=AsyncInit): )) self.tw_fn = os.path.join(tw_dir,'tracking-wallet.json') - from .fileutil import check_or_create_dir,get_data_from_file + from ..fileutil import check_or_create_dir,get_data_from_file check_or_create_dir(tw_dir) try: @@ -185,7 +185,7 @@ class TrackingWallet(MMGenObject,metaclass=AsyncInit): @write_mode def write_changed(self,data): - from .fileutil import write_data_to_file + from ..fileutil import write_data_to_file write_data_to_file( self.tw_fn, data, @@ -216,7 +216,7 @@ class TrackingWallet(MMGenObject,metaclass=AsyncInit): msg('Data is unchanged\n') async def is_in_wallet(self,addr): - from .twaddrs import TwAddrList + from .addrs import TwAddrList return addr in (await TwAddrList(self.proto,[],0,True,True,True,wallet=self)).coinaddr_list() # returns on failure @@ -230,7 +230,7 @@ class TrackingWallet(MMGenObject,metaclass=AsyncInit): mmaddr = TwMMGenID(self.proto,arg1) if mmaddr and not coinaddr: - from .addrdata import TwAddrData + from ..addrdata import TwAddrData coinaddr = (await TwAddrData(self.proto)).mmaddr2coinaddr(mmaddr) try: @@ -245,7 +245,7 @@ class TrackingWallet(MMGenObject,metaclass=AsyncInit): # Allow for the possibility that BTC addr of MMGen addr was entered. # Do reverse lookup, so that MMGen addr will not be marked as non-MMGen. if not mmaddr: - from .addrdata import TwAddrData + from ..addrdata import TwAddrData mmaddr = (await TwAddrData(proto=self.proto)).coinaddr2mmaddr(coinaddr) if not mmaddr: diff --git a/mmgen/twuo.py b/mmgen/tw/unspent.py similarity index 96% rename from mmgen/twuo.py rename to mmgen/tw/unspent.py index dc8847af..d6e2c882 100755 --- a/mmgen/twuo.py +++ b/mmgen/tw/unspent.py @@ -23,9 +23,9 @@ twuo: Tracking wallet unspent outputs class for the MMGen suite import time from collections import namedtuple -from .globalvars import g -from .color import red,yellow,green -from .util import ( +from ..globalvars import g +from ..color import red,yellow,green +from ..util import ( msg, msg_r, die, @@ -36,19 +36,19 @@ from .util import ( keypress_confirm, line_input, do_pager, - base_proto_subclass + base_proto_tw_subclass ) -from .base_obj import AsyncInit -from .objmethods import MMGenObject -from .obj import ImmutableAttr,ListItemAttr,MMGenListItem,TwComment,get_obj,HexStr,CoinTxID -from .addr import CoinAddr,MMGenID,AddrIdx -from .rpc import rpc_init -from .tw import TwCommon,TwMMGenID,get_tw_label +from ..base_obj import AsyncInit +from ..objmethods import MMGenObject +from ..obj import ImmutableAttr,ListItemAttr,MMGenListItem,TwComment,get_obj,HexStr,CoinTxID +from ..addr import CoinAddr,MMGenID,AddrIdx +from ..rpc import rpc_init +from .common import TwCommon,TwMMGenID,get_tw_label class TwUnspentOutputs(MMGenObject,TwCommon,metaclass=AsyncInit): def __new__(cls,proto,*args,**kwargs): - return MMGenObject.__new__(base_proto_subclass(cls,proto,'twuo')) + return MMGenObject.__new__(base_proto_tw_subclass(cls,proto,'unspent')) txid_w = 64 age_fmts_date_dependent = ('days','date','date_time') @@ -95,7 +95,7 @@ class TwUnspentOutputs(MMGenObject,TwCommon,metaclass=AsyncInit): self.disp_prec = self.get_display_precision() self.rpc = await rpc_init(proto) - from .twctl import TrackingWallet + from .ctl import TrackingWallet self.wallet = await TrackingWallet(proto,mode='w') @property @@ -174,7 +174,7 @@ class TwUnspentOutputs(MMGenObject,TwCommon,metaclass=AsyncInit): return ret def set_term_columns(self): - from .term import get_terminal_size + from ..term import get_terminal_size while True: self.cols = g.terminal_width or get_terminal_size().width if self.cols >= g.min_screen_width: @@ -387,10 +387,10 @@ class TwUnspentOutputs(MMGenObject,TwCommon,metaclass=AsyncInit): return n async def view_and_sort(self,tx): - from .term import get_char + from ..term import get_char prompt = self.prompt.strip() + '\b' no_output,oneshot_msg = False,None - from .opts import opt + from ..opts import opt CUR_HOME,ERASE_ALL = '\033[H','\033[0J' CUR_RIGHT = lambda n: f'\033[{n}C' @@ -464,7 +464,7 @@ class TwUnspentOutputs(MMGenObject,TwCommon,metaclass=AsyncInit): self.proto.dcoin, ','.join(self.sort_info(include_group=False)).lower() ) msg('') - from .fileutil import write_data_to_file + from ..fileutil import write_data_to_file try: write_data_to_file( of, diff --git a/mmgen/tx/__init__.py b/mmgen/tx/__init__.py index 2e5fffa4..2e6f60b5 100755 --- a/mmgen/tx/__init__.py +++ b/mmgen/tx/__init__.py @@ -71,7 +71,7 @@ async def _get_obj_async( _clsname, _modname, *args, **kwargs ): # No tracking wallet required for the Unsigned and Signed(data=unsigned.__dict__) classes used # during signing. if proto and proto.tokensym and clsname in ('New','OnlineSigned'): - from ..twctl import TrackingWallet + from ..tw.ctl import TrackingWallet kwargs['tw'] = await TrackingWallet(proto) return _base_proto_subclass( clsname, modname, proto )(*args,**kwargs) diff --git a/mmgen/tx/new.py b/mmgen/tx/new.py index 939970f9..e2840c87 100755 --- a/mmgen/tx/new.py +++ b/mmgen/tx/new.py @@ -332,7 +332,7 @@ class New(Base): assert isinstance( locktime, (int,type(None)) ), 'locktime must be of type int' - from ..twuo import TwUnspentOutputs + from ..tw.unspent import TwUnspentOutputs if opt.comment_file: self.add_comment(opt.comment_file) diff --git a/mmgen/util.py b/mmgen/util.py index d7714eab..6e061c01 100755 --- a/mmgen/util.py +++ b/mmgen/util.py @@ -643,11 +643,11 @@ 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,modname): +def base_proto_tw_subclass(cls,proto,modname): """ magic module loading and class selection """ - modname = f'mmgen.base_proto.{proto.base_proto.lower()}.{modname}' + modname = f'mmgen.base_proto.{proto.base_proto.lower()}.tw.{modname}' clsname = ( proto.mod_clsname + ('Token' if proto.tokensym else '') diff --git a/setup.cfg b/setup.cfg index 81d2fbb4..311f79e5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -44,16 +44,19 @@ packages = mmgen.base_proto mmgen.base_proto.bitcoin mmgen.base_proto.bitcoin.tx + mmgen.base_proto.bitcoin.tw mmgen.base_proto.ethereum mmgen.base_proto.ethereum.pyethereum mmgen.base_proto.ethereum.rlp mmgen.base_proto.ethereum.rlp.sedes mmgen.base_proto.ethereum.tx + mmgen.base_proto.ethereum.tw mmgen.base_proto.monero mmgen.proto mmgen.share mmgen.tool mmgen.tx + mmgen.tw mmgen.wallet scripts = diff --git a/test/objattrtest.py b/test/objattrtest.py index 79c5aa62..9526999d 100755 --- a/test/objattrtest.py +++ b/test/objattrtest.py @@ -35,7 +35,7 @@ from mmgen.common import * from mmgen.addrlist import * from mmgen.passwdlist import * from mmgen.tx.base import Base -from mmgen.base_proto.bitcoin.twuo import BitcoinTwUnspentOutputs +from mmgen.base_proto.bitcoin.tw.unspent import BitcoinTwUnspentOutputs opts_data = { 'sets': [ diff --git a/test/objattrtest_py_d/oat_common.py b/test/objattrtest_py_d/oat_common.py index 4be91bdb..4e5d5645 100755 --- a/test/objattrtest_py_d/oat_common.py +++ b/test/objattrtest_py_d/oat_common.py @@ -15,7 +15,7 @@ from mmgen.seedsplit import * from mmgen.protocol import * from mmgen.addr import * from mmgen.tx import * -from mmgen.twuo import * +from mmgen.tw.unspent import * from mmgen.key import * from ..include.common import getrand diff --git a/test/objtest.py b/test/objtest.py index 004a641a..d4fab417 100755 --- a/test/objtest.py +++ b/test/objtest.py @@ -35,7 +35,7 @@ from mmgen.seedsplit import * from mmgen.addr import * from mmgen.addrlist import * from mmgen.addrdata import * -from mmgen.tw import * +from mmgen.tw.common import * from mmgen.amt import * from mmgen.key import * from mmgen.rpc import IPPort diff --git a/test/overlay/__init__.py b/test/overlay/__init__.py index 0ae3e372..ef035646 100644 --- a/test/overlay/__init__.py +++ b/test/overlay/__init__.py @@ -41,17 +41,20 @@ def overlay_setup(repo_root): 'mmgen.base_proto', 'mmgen.base_proto.bitcoin', 'mmgen.base_proto.bitcoin.tx', + 'mmgen.base_proto.bitcoin.tw', 'mmgen.base_proto.ethereum', 'mmgen.base_proto.ethereum.pyethereum', 'mmgen.base_proto.ethereum.rlp', 'mmgen.base_proto.ethereum.rlp.sedes', 'mmgen.base_proto.ethereum.tx', + 'mmgen.base_proto.ethereum.tw', 'mmgen.base_proto.monero', 'mmgen.data', 'mmgen.proto', 'mmgen.share', 'mmgen.tool', 'mmgen.tx', + 'mmgen.tw', 'mmgen.wallet' ): process_srcdir(d) diff --git a/test/overlay/fakemods/base_proto/bitcoin/twuo.py b/test/overlay/fakemods/base_proto/bitcoin/tw/unspent.py similarity index 80% rename from test/overlay/fakemods/base_proto/bitcoin/twuo.py rename to test/overlay/fakemods/base_proto/bitcoin/tw/unspent.py index de80eb98..4e4bce37 100644 --- a/test/overlay/fakemods/base_proto/bitcoin/twuo.py +++ b/test/overlay/fakemods/base_proto/bitcoin/tw/unspent.py @@ -1,12 +1,12 @@ import os -from .twuo_orig import * +from .unspent_orig import * if os.getenv('MMGEN_BOGUS_WALLET_DATA'): async def fake_get_unspent_rpc(foo): from decimal import Decimal import json - from mmgen.fileutil import get_data_from_file + from ....fileutil import get_data_from_file return json.loads(get_data_from_file(os.getenv('MMGEN_BOGUS_WALLET_DATA')),parse_float=Decimal) BitcoinTwUnspentOutputs.get_unspent_rpc = fake_get_unspent_rpc diff --git a/test/overlay/fakemods/tw.py b/test/overlay/fakemods/tw/common.py similarity index 96% rename from test/overlay/fakemods/tw.py rename to test/overlay/fakemods/tw/common.py index 7697920a..9b2387fa 100644 --- a/test/overlay/fakemods/tw.py +++ b/test/overlay/fakemods/tw/common.py @@ -1,5 +1,5 @@ import os -from .tw_orig import * +from .common_orig import * if os.getenv('MMGEN_TEST_SUITE_DETERMINISTIC'): def _time_gen(): diff --git a/test/test_py_d/ts_main.py b/test/test_py_d/ts_main.py index 0481959d..c3b01559 100755 --- a/test/test_py_d/ts_main.py +++ b/test/test_py_d/ts_main.py @@ -478,7 +478,7 @@ class TestSuiteMain(TestSuiteBase,TestSuiteShared): cmd_args = self._make_txcreate_cmdline(tx_data) if cmdline_inputs: - from mmgen.tw import TwLabel + from mmgen.tw.common import TwLabel cmd_args = [ '--inputs={},{},{},{},{},{}'.format( TwLabel(self.proto,dfake[0][self.lbl_id]).mmid,dfake[1]['address'],