From 6649fab18bc447991c3a2e3da0dcc48ff32d5811 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Mon, 21 Apr 2025 14:01:16 +0000 Subject: [PATCH] tx.base: new `swap_proto_mod`, `send_asset`, `recv_asset` properties --- mmgen/proto/btc/tx/new_swap.py | 6 ++---- mmgen/proto/eth/tx/new_swap.py | 6 ++---- mmgen/tx/base.py | 18 +++++++++++++++++- mmgen/tx/bump.py | 11 +++-------- mmgen/tx/completed.py | 2 ++ mmgen/tx/info.py | 2 +- mmgen/tx/new_swap.py | 15 +++------------ 7 files changed, 30 insertions(+), 30 deletions(-) diff --git a/mmgen/proto/btc/tx/new_swap.py b/mmgen/proto/btc/tx/new_swap.py index 0aed774b..56ce66cb 100755 --- a/mmgen/proto/btc/tx/new_swap.py +++ b/mmgen/proto/btc/tx/new_swap.py @@ -13,17 +13,15 @@ proto.btc.tx.new_swap: Bitcoin new swap transaction class """ from ....tx.new_swap import NewSwap as TxNewSwap -from ....tx.new_swap import get_swap_proto_mod from .new import New class NewSwap(New, TxNewSwap): desc = 'Bitcoin swap transaction' def update_data_output(self, trade_limit): - sp = get_swap_proto_mod(self.swap_proto) o = self.data_output._asdict() - parsed_memo = sp.Memo.parse(o['data'].decode()) - memo = sp.Memo( + parsed_memo = self.swap_proto_mod.Memo.parse(o['data'].decode()) + memo = self.swap_proto_mod.Memo( self.recv_proto, self.recv_asset, self.recv_proto.coin_addr(parsed_memo.address), diff --git a/mmgen/proto/eth/tx/new_swap.py b/mmgen/proto/eth/tx/new_swap.py index 8eccf0a8..515f17a4 100755 --- a/mmgen/proto/eth/tx/new_swap.py +++ b/mmgen/proto/eth/tx/new_swap.py @@ -13,17 +13,15 @@ proto.eth.tx.new_swap: Ethereum new swap transaction class """ from ....tx.new_swap import NewSwap as TxNewSwap -from ....tx.new_swap import get_swap_proto_mod from .new import New class NewSwap(New, TxNewSwap): desc = 'Ethereum swap transaction' def update_data_output(self, trade_limit): - sp = get_swap_proto_mod(self.swap_proto) data = bytes.fromhex(self.txobj['data']) if self.is_bump else self.usr_contract_data - parsed_memo = sp.Memo.parse(data.decode()) - memo = sp.Memo( + parsed_memo = self.swap_proto_mod.Memo.parse(data.decode()) + memo = self.swap_proto_mod.Memo( self.recv_proto, self.recv_asset, self.recv_proto.coin_addr(parsed_memo.address), diff --git a/mmgen/tx/base.py b/mmgen/tx/base.py index 29d92398..e69a9891 100755 --- a/mmgen/tx/base.py +++ b/mmgen/tx/base.py @@ -26,7 +26,7 @@ from ..obj import ( ) from ..amt import CoinAmtChk from ..addr import MMGenID, CoinAddr -from ..util import msg, ymsg, fmt, remove_dups, make_timestamp, die +from ..util import msg, ymsg, fmt, remove_dups, make_timestamp, die, cached_property class MMGenTxIO(MMGenListItem): vout = ListItemAttr(NonNegativeInt) @@ -220,3 +220,19 @@ class Base(MMGenObject): if not self.cfg.yes: from ..ui import keypress_confirm keypress_confirm(self.cfg, 'Continue?', default_yes=True, do_exit=True) + + # swap methods: + + @cached_property + def swap_proto_mod(self): + from .new_swap import get_swap_proto_mod + return get_swap_proto_mod(self.swap_proto) + + @cached_property + def send_asset(self): + spec = self.proto.coin + (f'.{self.proto.tokensym}' if self.proto.tokensym else '') + return self.swap_proto_mod.SwapAsset(spec, 'send') + + @cached_property + def recv_asset(self): + return self.swap_proto_mod.SwapAsset(self.swap_recv_asset_spec, 'recv') diff --git a/mmgen/tx/bump.py b/mmgen/tx/bump.py index 6637a919..900fc47c 100755 --- a/mmgen/tx/bump.py +++ b/mmgen/tx/bump.py @@ -12,7 +12,7 @@ tx.bump: transaction bump class """ -from .new_swap import NewSwap, get_swap_proto_mod +from .new_swap import NewSwap from .completed import Completed from ..util import msg, ymsg, is_int, die from ..color import pink @@ -36,16 +36,11 @@ class Bump(Completed, NewSwap): self.new_outputs = new_outputs self.orig_rel_fee = self.get_orig_rel_fee() - if self.is_swap: - if new_outputs: + if new_outputs: + if self.is_swap: from .base import Base for attr in self.swap_attrs: setattr(self, attr, getattr(Base, attr)) - else: - sp = get_swap_proto_mod(self.swap_proto) - self.recv_asset = sp.SwapAsset(self.swap_recv_asset_spec, 'recv') - - if new_outputs: self.outputs = self.OutputList(self) self.cfg = kwargs['cfg'] # must use current cfg opts, not those from orig_tx diff --git a/mmgen/tx/completed.py b/mmgen/tx/completed.py index 8bc181fb..cf16adc9 100755 --- a/mmgen/tx/completed.py +++ b/mmgen/tx/completed.py @@ -77,6 +77,8 @@ class Completed(Base): text = data.decode('ascii') p = Memo.parse(text) assert p.function == 'SWAP', f'‘{p.function}’: unsupported function in swap memo ‘{text}’' + aname = p.chain + (f'.{p.asset}' if p.asset != p.chain else '') + assert aname == self.recv_asset.name, f'invalid memo: {aname} != {self.recv_asset.name}' assert p.chain == p.asset, f'{p.chain} != {p.asset}: chain/asset mismatch in swap memo ‘{text}’' proto = init_proto(self.cfg, p.asset, network=self.cfg.network, need_amt=True) if self.swap_recv_addr_mmid: diff --git a/mmgen/tx/info.py b/mmgen/tx/info.py index 257d914b..b7ec085e 100755 --- a/mmgen/tx/info.py +++ b/mmgen/tx/info.py @@ -80,7 +80,7 @@ class TxInfo: if Memo.is_partial_memo(data): p = Memo.parse(data.decode('ascii')) yield ' {} {}\n'.format(magenta('DEX Protocol:'), blue(name)) - yield ' Swap: {}\n'.format(orange(f'{tx.proto.coin} => {p.asset}')) + yield ' Swap: {}\n'.format(orange(f'{tx.send_asset.name} => {tx.recv_asset.name}')) yield ' Dest: {}{}\n'.format( cyan(p.address), orange(f' ({tx.swap_recv_addr_mmid})') if tx.swap_recv_addr_mmid else '') diff --git a/mmgen/tx/new_swap.py b/mmgen/tx/new_swap.py index 0faec14e..6084b84a 100755 --- a/mmgen/tx/new_swap.py +++ b/mmgen/tx/new_swap.py @@ -35,11 +35,7 @@ def get_send_proto(cfg): arg = cfg._args.pop(0) except: cfg._usage() - - global send_asset - send_asset = get_swap_proto_mod(cfg.swap_proto).SwapAsset(arg, 'send') - - return init_swap_proto(cfg, send_asset) + return init_swap_proto(cfg, get_swap_proto_mod(cfg.swap_proto).SwapAsset(arg, 'send')) class NewSwap(New): desc = 'swap transaction' @@ -110,7 +106,6 @@ class NewSwap(New): # arg 4: recv_coin self.swap_recv_asset_spec = arg # this goes into the transaction file - self.recv_asset = sp.SwapAsset(arg, 'recv') self.recv_proto = init_swap_proto(self.cfg, self.recv_asset) # arg 5: recv_spec (receive address spec) @@ -120,7 +115,7 @@ class NewSwap(New): if args_in: # done parsing, all args consumed self.cfg._usage() - sp = get_swap_proto_mod(self.swap_proto) + sp = self.swap_proto_mod args_in = list(cmd_args) args = CmdlineArgs() parse() @@ -149,9 +144,6 @@ class NewSwap(New): memo = sp.Memo(self.recv_proto, self.recv_asset, recv_output.addr) - self.is_token_swap = self.proto.tokensym or self.recv_asset.asset - self.send_asset = send_asset - # this goes into the transaction file: self.swap_recv_addr_mmid = recv_output.mmid @@ -176,8 +168,7 @@ class NewSwap(New): self.outputs[vault_idx] = self.Output(self.proto, **o) async def update_vault_output(self, amt, *, deduct_est_fee=False): - sp = get_swap_proto_mod(self.swap_proto) - c = sp.rpc_client(self, amt) + c = self.swap_proto_mod.rpc_client(self, amt) from ..util import msg from ..term import get_char