diff --git a/mmgen/proto/eth/contract.py b/mmgen/proto/eth/contract.py index af2fd566..48120944 100755 --- a/mmgen/proto/eth/contract.py +++ b/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 diff --git a/mmgen/proto/eth/tw/ctl.py b/mmgen/proto/eth/tw/ctl.py index 650c4996..53b07c0b 100755 --- a/mmgen/proto/eth/tw/ctl.py +++ b/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() } } diff --git a/mmgen/proto/eth/tx/new.py b/mmgen/proto/eth/tx/new.py index 0d7d6d3f..e58a35e8 100755 --- a/mmgen/proto/eth/tx/new.py +++ b/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 diff --git a/mmgen/proto/eth/tx/online.py b/mmgen/proto/eth/tx/online.py index f5146e3b..ed4a2f26 100755 --- a/mmgen/proto/eth/tx/online.py +++ b/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']) diff --git a/mmgen/proto/eth/tx/unsigned.py b/mmgen/proto/eth/tx/unsigned.py index c108f83b..1bfe0850 100755 --- a/mmgen/proto/eth/tx/unsigned.py +++ b/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'], diff --git a/test/cmdtest_d/ethdev.py b/test/cmdtest_d/ethdev.py index 2e61933e..27ea6b82 100755 --- a/test/cmdtest_d/ethdev.py +++ b/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(