Browse Source

new class: tw.rpc.TwRPC

The MMGen Project 2 years ago
parent
commit
69b15a4ff9

+ 1 - 2
mmgen/proto/btc/tw/ctl.py

@@ -15,9 +15,8 @@ proto.btc.tw.ctl: Bitcoin base protocol tracking wallet control class
 from ....globalvars import g
 from ....globalvars import g
 from ....tw.ctl import TrackingWallet,write_mode
 from ....tw.ctl import TrackingWallet,write_mode
 from ....util import msg,msg_r,rmsg,vmsg,die,suf,fmt_list
 from ....util import msg,msg_r,rmsg,vmsg,die,suf,fmt_list
-from .rpc import BitcoinTwRPC
 
 
-class BitcoinTrackingWallet(TrackingWallet,BitcoinTwRPC):
+class BitcoinTrackingWallet(TrackingWallet):
 
 
 	def init_empty(self):
 	def init_empty(self):
 		self.data = { 'coin': self.proto.coin, 'addresses': {} }
 		self.data = { 'coin': self.proto.coin, 'addresses': {} }

+ 2 - 1
mmgen/proto/btc/tw/rpc.py

@@ -16,8 +16,9 @@ from ....addr import CoinAddr
 from ....util import die,msg,rmsg
 from ....util import die,msg,rmsg
 from ....obj import MMGenList
 from ....obj import MMGenList
 from ....tw.shared import get_tw_label
 from ....tw.shared import get_tw_label
+from ....tw.rpc import TwRPC
 
 
-class BitcoinTwRPC:
+class BitcoinTwRPC(TwRPC):
 
 
 	async def get_addr_label_pairs(self,twmmid=None):
 	async def get_addr_label_pairs(self,twmmid=None):
 		"""
 		"""

+ 1 - 1
mmgen/proto/btc/tw/txhistory.py

@@ -22,7 +22,7 @@ from ....color import nocolor,red,pink,gray
 from ....obj import TwComment,CoinTxID,Int
 from ....obj import TwComment,CoinTxID,Int
 from .rpc import BitcoinTwRPC
 from .rpc import BitcoinTwRPC
 
 
-class BitcoinTwTransaction(BitcoinTwRPC):
+class BitcoinTwTransaction:
 
 
 	def __init__(self,parent,proto,rpc,
 	def __init__(self,parent,proto,rpc,
 			idx,          # unique numeric identifier of this transaction in listing
 			idx,          # unique numeric identifier of this transaction in listing

+ 1 - 1
mmgen/proto/eth/tw/addresses.py

@@ -18,7 +18,7 @@ from ....addr import CoinAddr
 from .view import EthereumTwView
 from .view import EthereumTwView
 from .rpc import EthereumTwRPC
 from .rpc import EthereumTwRPC
 
 
-class EthereumTwAddresses(EthereumTwView,EthereumTwRPC,TwAddresses):
+class EthereumTwAddresses(TwAddresses,EthereumTwView,EthereumTwRPC):
 
 
 	has_age = False
 	has_age = False
 	prompt = """
 	prompt = """

+ 1 - 2
mmgen/proto/eth/tw/ctl.py

@@ -25,9 +25,8 @@ from ....tw.ctl import TrackingWallet,write_mode
 from ....addr import is_coin_addr,is_mmgen_id
 from ....addr import is_coin_addr,is_mmgen_id
 from ....amt import ETHAmt
 from ....amt import ETHAmt
 from ..contract import Token,TokenResolve
 from ..contract import Token,TokenResolve
-from .rpc import EthereumTwRPC
 
 
-class EthereumTrackingWallet(EthereumTwRPC,TrackingWallet):
+class EthereumTrackingWallet(TrackingWallet):
 
 
 	caps = ('batch',)
 	caps = ('batch',)
 	data_key = 'accounts'
 	data_key = 'accounts'

+ 10 - 8
mmgen/proto/eth/tw/rpc.py

@@ -15,24 +15,26 @@ proto.eth.tw.rpc: Ethereum base protocol tracking wallet RPC class
 from ....tw.ctl import TrackingWallet
 from ....tw.ctl import TrackingWallet
 from ....addr import CoinAddr
 from ....addr import CoinAddr
 from ....tw.shared import TwLabel
 from ....tw.shared import TwLabel
+from ....tw.rpc import TwRPC
 
 
-class EthereumTwRPC:
+class EthereumTwRPC(TwRPC):
 
 
 	async def get_addr_label_pairs(self,twmmid=None):
 	async def get_addr_label_pairs(self,twmmid=None):
-		wallet = (
-			self if isinstance(self,TrackingWallet) else
-			(self.wallet or await TrackingWallet(self.proto,mode='w'))
-		)
+
+		wallet = self.wallet or await TrackingWallet(self.proto,mode='w')
 
 
 		ret = [(
 		ret = [(
 				TwLabel( self.proto, mmid + ' ' + d['comment'] ),
 				TwLabel( self.proto, mmid + ' ' + d['comment'] ),
 				CoinAddr( self.proto, d['addr'] )
 				CoinAddr( self.proto, d['addr'] )
 			) for mmid,d in wallet.mmid_ordered_dict.items() ]
 			) for mmid,d in wallet.mmid_ordered_dict.items() ]
 
 
-		if wallet is not self:
-			del wallet
-
 		if twmmid:
 		if twmmid:
 			ret = [e for e in ret if e[0].mmid == twmmid]
 			ret = [e for e in ret if e[0].mmid == twmmid]
 
 
+		if wallet is not self.wallet:
+			del wallet
+
 		return ret or None
 		return ret or None
+
+class EthereumTokenTwRPC(EthereumTwRPC):
+	pass

+ 4 - 2
mmgen/tw/ctl.py

@@ -220,7 +220,8 @@ class TrackingWallet(MMGenObject,metaclass=AsyncInit):
 			msg(f'{addrspec!r}: invalid address for this network')
 			msg(f'{addrspec!r}: invalid address for this network')
 			return None
 			return None
 
 
-		pairs = await self.get_addr_label_pairs(twmmid)
+		from .rpc import TwRPC
+		pairs = await TwRPC(proto=self.proto,rpc=self.rpc,wallet=self).get_addr_label_pairs(twmmid)
 
 
 		if not pairs:
 		if not pairs:
 			msg(f'MMGen address {twmmid!r} not found in tracking wallet')
 			msg(f'MMGen address {twmmid!r} not found in tracking wallet')
@@ -270,7 +271,8 @@ class TrackingWallet(MMGenObject,metaclass=AsyncInit):
 
 
 		if await self.set_label(res.coinaddr,lbl):
 		if await self.set_label(res.coinaddr,lbl):
 			# redundant paranoia step:
 			# redundant paranoia step:
-			pairs = await self.get_addr_label_pairs(res.twmmid)
+			from .rpc import TwRPC
+			pairs = await TwRPC(proto=self.proto,rpc=self.rpc,wallet=self).get_addr_label_pairs(res.twmmid)
 			assert pairs[0][0].comment == comment, f'{pairs[0][0].comment!r} != {comment!r}'
 			assert pairs[0][0].comment == comment, f'{pairs[0][0].comment!r} != {comment!r}'
 
 
 			desc = '{} address {} in tracking wallet'.format(
 			desc = '{} address {} in tracking wallet'.format(

+ 25 - 0
mmgen/tw/rpc.py

@@ -0,0 +1,25 @@
+#!/usr/bin/env python3
+#
+# mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet
+# Copyright (C)2013-2022 The MMGen Project <mmgen@tuta.io>
+# Licensed under the GNU General Public License, Version 3:
+#   https://www.gnu.org/licenses
+# Public project repositories:
+#   https://github.com/mmgen/mmgen
+#   https://gitlab.com/mmgen/mmgen
+
+"""
+tw.rpc: Tracking wallet RPC class for the MMGen suite
+"""
+
+from ..objmethods import MMGenObject
+
+class TwRPC:
+
+	def __new__(cls,proto,*args,**kwargs):
+		return MMGenObject.__new__(proto.base_proto_subclass(cls,'tw','rpc'))
+
+	def __init__(self,proto,rpc,wallet):
+		self.proto = proto
+		self.rpc = rpc
+		self.wallet = wallet