proto.eth.contract: ResolvedToken cleanups

This commit is contained in:
The MMGen Project 2025-04-21 14:01:16 +00:00
commit 7ecc376c7b
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
6 changed files with 29 additions and 30 deletions

View file

@ -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

View file

@ -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()
}
}

View file

@ -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

View file

@ -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'])

View file

@ -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'],

View file

@ -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(