Browse Source

proto.eth.contract: `ResolvedToken` cleanups

The MMGen Project 7 months ago
parent
commit
7ecc376c7b

+ 12 - 17
mmgen/proto/eth/contract.py

@@ -96,17 +96,17 @@ class Contract:
 
 class Token(Contract):
 
-	def __init__(self, cfg, proto, addr, decimals, *, rpc=None):
-		if type(self).__name__ == 'Token':
-			from ...util2 import get_keccak
-			self.keccak_256 = get_keccak(cfg)
+	def __init__(self, cfg, proto, addr, *, decimals=None, rpc=None):
+		from ...util2 import get_keccak
+		self.keccak_256 = get_keccak(cfg)
 		self.cfg = cfg
 		self.proto = proto
 		self.addr = TokenAddr(proto, addr)
-		assert isinstance(decimals, int), f'decimals param must be int instance, not {type(decimals)}'
-		self.decimals = decimals
-		self.base_unit = Decimal('10') ** -self.decimals
 		self.rpc = rpc
+		if decimals:
+			assert isinstance(decimals, int), f'decimals param must be int instance, not {type(decimals)}'
+			self.decimals = decimals
+			self.base_unit = Decimal('10') ** -self.decimals
 
 	async def get_balance(self, acct_addr):
 		return self.proto.coin_amt(
@@ -166,14 +166,9 @@ class Token(Contract):
 
 class ResolvedToken(Token, metaclass=AsyncInit):
 
-	async def __init__(self, cfg, proto, rpc, addr):
-		from ...util2 import get_keccak
-		self.keccak_256 = get_keccak(cfg)
-		self.cfg = cfg
-		self.proto = proto
-		self.rpc = rpc
-		self.addr = TokenAddr(proto, addr)
-		decimals = await self.get_decimals() # requires self.addr!
-		if not decimals:
+	async def __init__(self, cfg, proto, addr, *, rpc):
+		Token.__init__(self, cfg, proto, addr, rpc=rpc)
+		self.decimals = await self.get_decimals()
+		if not self.decimals:
 			die('TokenNotInBlockchain', f'Token {addr!r} not in blockchain')
-		Token.__init__(self, cfg, proto, addr, decimals, rpc=rpc)
+		self.base_unit = Decimal('10') ** -self.decimals

+ 8 - 4
mmgen/proto/eth/tw/ctl.py

@@ -24,7 +24,7 @@ from ....util import msg, ymsg, die
 from ....tw.ctl import TwCtl, write_mode, label_addr_pair
 from ....tw.shared import TwLabel
 from ....addr import is_coin_addr, is_mmgen_id, CoinAddr
-from ..contract import Token, ResolvedToken
+from ..contract import Token
 
 class EthereumTwCtl(TwCtl):
 
@@ -214,7 +214,11 @@ class EthereumTokenTwCtl(EthereumTwCtl):
 
 	async def rpc_get_balance(self, addr):
 		return await Token(
-			self.cfg, self.proto, self.token, self.decimals, rpc=self.rpc).get_balance(addr)
+			self.cfg,
+			self.proto,
+			self.token,
+			decimals = self.decimals,
+			rpc = self.rpc).get_balance(addr)
 
 	async def get_eth_balance(self, addr, *, force_rpc=False):
 		cache = self.cur_eth_balances
@@ -235,10 +239,10 @@ class EthereumTokenTwCtl(EthereumTwCtl):
 		once, upon token import.  Thereafter, token address, symbol and decimals are resolved
 		either from the tracking wallet (online operations) or transaction file (when signing).
 		"""
-		t = await ResolvedToken(self.cfg, self.proto, self.rpc, tokenaddr)
+		t = Token(self.cfg, self.proto, tokenaddr, rpc=self.rpc)
 		self.data['tokens'][tokenaddr] = {
 			'params': {
 				'symbol': await t.get_symbol(),
-				'decimals': t.decimals
+				'decimals': await t.get_decimals()
 			}
 		}

+ 1 - 1
mmgen/proto/eth/tx/new.py

@@ -211,7 +211,7 @@ class TokenNew(TokenBase, New):
 
 	async def make_txobj(self): # called by create_serialized()
 		await super().make_txobj()
-		t = Token(self.cfg, self.proto, self.twctl.token, self.twctl.decimals)
+		t = Token(self.cfg, self.proto, self.twctl.token, decimals=self.twctl.decimals)
 		o = self.txobj
 		o['token_addr'] = t.addr
 		o['decimals'] = t.decimals

+ 1 - 1
mmgen/proto/eth/tx/online.py

@@ -71,7 +71,7 @@ class TokenOnlineSigned(TokenSigned, OnlineSigned):
 		assert self.twctl.token == o['to']
 		o['token_addr'] = TokenAddr(self.proto, o['to'])
 		o['decimals']   = self.twctl.decimals
-		t = Token(self.cfg, self.proto, o['token_addr'], o['decimals'])
+		t = Token(self.cfg, self.proto, o['token_addr'], decimals=o['decimals'])
 		o['amt'] = t.transferdata2amt(o['data'])
 		o['token_to'] = t.transferdata2sendaddr(o['data'])
 

+ 2 - 2
mmgen/proto/eth/tx/unsigned.py

@@ -107,12 +107,12 @@ class TokenUnsigned(TokenCompleted, Unsigned):
 		o = self.txobj
 		o['token_addr'] = TokenAddr(self.proto, d['token_addr'])
 		o['decimals'] = Int(d['decimals'])
-		t = Token(self.cfg, self.proto, o['token_addr'], o['decimals'])
+		t = Token(self.cfg, self.proto, o['token_addr'], decimals=o['decimals'])
 		o['data'] = t.create_token_data(o['to'], o['amt'], op='transfer')
 		o['token_to'] = t.transferdata2sendaddr(o['data'])
 
 	async def do_sign(self, o, wif):
-		t = Token(self.cfg, self.proto, o['token_addr'], o['decimals'])
+		t = Token(self.cfg, self.proto, o['token_addr'], decimals=o['decimals'])
 		tx_in = t.make_tx_in(
 			gas      = self.gas,
 			gasPrice = o['gasPrice'],

+ 5 - 5
test/cmdtest_d/ethdev.py

@@ -275,7 +275,7 @@ class CmdTestEthdevMethods:
 
 		if get_receipt:
 			if (await self.get_tx_receipt(txid)).status == 0:
-				die(2, f'Contract {num}:{key} failed to execute. Aborting')
+				die(2, f'Contract {num}:{key} failed to deploy. Aborting')
 
 		if key == 'Token':
 			imsg(f'\nToken MM{num} deployed!')
@@ -318,8 +318,8 @@ class CmdTestEthdevMethods:
 				tk = await ResolvedToken(
 					self.cfg,
 					self.proto,
-					rpc,
-					self.read_from_tmpfile(f'token_addr{i+1}').strip())
+					self.read_from_tmpfile(f'token_addr{i+1}').strip(),
+					rpc = rpc)
 				imsg_r('\n' + await tk.info())
 				imsg('dev token balance (pre-send): {}'.format(await tk.get_balance(dfl_devaddr)))
 				imsg(f'Sending {amt} {self.proto.dcoin} to address {usr_addrs[i]} ({usr_mmaddrs[i]})')
@@ -339,8 +339,8 @@ class CmdTestEthdevMethods:
 				tk = await ResolvedToken(
 					self.cfg,
 					self.proto,
-					rpc,
-					self.read_from_tmpfile(f'token_addr{i+1}').strip())
+					self.read_from_tmpfile(f'token_addr{i+1}').strip(),
+					rpc = rpc)
 				imsg('Token: {}'.format(await tk.get_symbol()))
 				imsg(f'dev token balance: {await tk.get_balance(dfl_devaddr)}')
 				imsg('usr token balance: {} ({} {})'.format(