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):
 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.cfg = cfg
 		self.proto = proto
 		self.proto = proto
 		self.addr = TokenAddr(proto, addr)
 		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
 		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):
 	async def get_balance(self, acct_addr):
 		return self.proto.coin_amt(
 		return self.proto.coin_amt(
@@ -166,14 +166,9 @@ class Token(Contract):
 
 
 class ResolvedToken(Token, metaclass=AsyncInit):
 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')
 			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.ctl import TwCtl, write_mode, label_addr_pair
 from ....tw.shared import TwLabel
 from ....tw.shared import TwLabel
 from ....addr import is_coin_addr, is_mmgen_id, CoinAddr
 from ....addr import is_coin_addr, is_mmgen_id, CoinAddr
-from ..contract import Token, ResolvedToken
+from ..contract import Token
 
 
 class EthereumTwCtl(TwCtl):
 class EthereumTwCtl(TwCtl):
 
 
@@ -214,7 +214,11 @@ class EthereumTokenTwCtl(EthereumTwCtl):
 
 
 	async def rpc_get_balance(self, addr):
 	async def rpc_get_balance(self, addr):
 		return await Token(
 		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):
 	async def get_eth_balance(self, addr, *, force_rpc=False):
 		cache = self.cur_eth_balances
 		cache = self.cur_eth_balances
@@ -235,10 +239,10 @@ class EthereumTokenTwCtl(EthereumTwCtl):
 		once, upon token import.  Thereafter, token address, symbol and decimals are resolved
 		once, upon token import.  Thereafter, token address, symbol and decimals are resolved
 		either from the tracking wallet (online operations) or transaction file (when signing).
 		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] = {
 		self.data['tokens'][tokenaddr] = {
 			'params': {
 			'params': {
 				'symbol': await t.get_symbol(),
 				'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()
 	async def make_txobj(self): # called by create_serialized()
 		await super().make_txobj()
 		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 = self.txobj
 		o['token_addr'] = t.addr
 		o['token_addr'] = t.addr
 		o['decimals'] = t.decimals
 		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']
 		assert self.twctl.token == o['to']
 		o['token_addr'] = TokenAddr(self.proto, o['to'])
 		o['token_addr'] = TokenAddr(self.proto, o['to'])
 		o['decimals']   = self.twctl.decimals
 		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['amt'] = t.transferdata2amt(o['data'])
 		o['token_to'] = t.transferdata2sendaddr(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 = self.txobj
 		o['token_addr'] = TokenAddr(self.proto, d['token_addr'])
 		o['token_addr'] = TokenAddr(self.proto, d['token_addr'])
 		o['decimals'] = Int(d['decimals'])
 		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['data'] = t.create_token_data(o['to'], o['amt'], op='transfer')
 		o['token_to'] = t.transferdata2sendaddr(o['data'])
 		o['token_to'] = t.transferdata2sendaddr(o['data'])
 
 
 	async def do_sign(self, o, wif):
 	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(
 		tx_in = t.make_tx_in(
 			gas      = self.gas,
 			gas      = self.gas,
 			gasPrice = o['gasPrice'],
 			gasPrice = o['gasPrice'],

+ 5 - 5
test/cmdtest_d/ethdev.py

@@ -275,7 +275,7 @@ class CmdTestEthdevMethods:
 
 
 		if get_receipt:
 		if get_receipt:
 			if (await self.get_tx_receipt(txid)).status == 0:
 			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':
 		if key == 'Token':
 			imsg(f'\nToken MM{num} deployed!')
 			imsg(f'\nToken MM{num} deployed!')
@@ -318,8 +318,8 @@ class CmdTestEthdevMethods:
 				tk = await ResolvedToken(
 				tk = await ResolvedToken(
 					self.cfg,
 					self.cfg,
 					self.proto,
 					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_r('\n' + await tk.info())
 				imsg('dev token balance (pre-send): {}'.format(await tk.get_balance(dfl_devaddr)))
 				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]})')
 				imsg(f'Sending {amt} {self.proto.dcoin} to address {usr_addrs[i]} ({usr_mmaddrs[i]})')
@@ -339,8 +339,8 @@ class CmdTestEthdevMethods:
 				tk = await ResolvedToken(
 				tk = await ResolvedToken(
 					self.cfg,
 					self.cfg,
 					self.proto,
 					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('Token: {}'.format(await tk.get_symbol()))
 				imsg(f'dev token balance: {await tk.get_balance(dfl_devaddr)}')
 				imsg(f'dev token balance: {await tk.get_balance(dfl_devaddr)}')
 				imsg('usr token balance: {} ({} {})'.format(
 				imsg('usr token balance: {} ({} {})'.format(