various fixes, renames and cleanups

This commit is contained in:
The MMGen Project 2026-10-19 09:06:07 +00:00
commit 648664ed9f
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
10 changed files with 61 additions and 52 deletions

View file

@ -30,14 +30,15 @@ def die2(exit_val, s):
sys.stderr.write(s+'\n')
sys.exit(exit_val)
def fmt_opt_val(opt, val):
def fmt_opt_val(opt_in, val):
opt = opt_in.replace('_', '-')
match val:
case True:
return '--{}'.format(opt.replace('_', '-'))
return f'--{opt}'
case False:
return '--no-{}'.format(opt.replace('_', '-'))
return f'--no-{opt}'
case _:
return '--{}={}'.format(opt.replace('_', '-'), val)
return f'--{opt}={val}'
class GlobalConstants(Lockable):
"""

View file

@ -30,7 +30,7 @@ class TwTxHistory(TwView):
colhdr_fmt_method = None
item_separator = '\n\n'
has_wallet = False
has_twctl = False
show_txid = False
show_unconfirmed = False
show_total_amt = False

View file

@ -81,7 +81,7 @@ class TwView(MMGenObject, metaclass=AsyncInit):
is_account_based = False
has_age = False
has_used = False
has_wallet = True
has_twctl = True
has_amt2 = False
dates_set = False
reverse = False
@ -200,7 +200,7 @@ class TwView(MMGenObject, metaclass=AsyncInit):
self.proto = proto
if have_rpc := 'rpc_init' in proto.mmcaps:
self.rpc = await rpc_init(cfg, proto)
if self.has_wallet:
if self.has_twctl:
from .ctl import TwCtl
self.twctl = await TwCtl(cfg, proto, mode='w', no_rpc=not have_rpc)
self.amt_iwidth_keys = {'amt': 'iwidth'} | ({'amt2': 'iwidth2'} if self.has_amt2 else {})

View file

@ -142,12 +142,6 @@ class NewSwap(BaseSwapMethods, New):
await parse()
if self.refnum:
recv_output, parsed_ref_memo = await self.parse_network_memo(
data = self.swap_proto_rpc.validate_refnum(self.proto.coin, self.refnum),
recv_asset_spec = self.swap_recv_asset_spec,
recv_twmmid = args.recv_spec)
self.swap_cfg = self.swap_proto_mod.SwapCfg(self.cfg)
if self.cfg.quote:
@ -170,7 +164,12 @@ class NewSwap(BaseSwapMethods, New):
if args.send_amt and not (chg_output or self.proto.is_vm):
chg_output = await self.get_chg_output(None, addrfiles)
if not self.refnum:
if self.refnum:
recv_output, parsed_ref_memo = await self.parse_network_memo(
data = self.swap_proto_rpc.validate_refnum(self.proto.coin, self.refnum),
recv_asset_spec = self.swap_recv_asset_spec,
recv_twmmid = args.recv_spec)
else:
recv_output = await self.get_swap_output(
self.recv_proto,
args.recv_spec,
@ -210,7 +209,7 @@ class NewSwap(BaseSwapMethods, New):
'On the second pass, both amount and trade limit must remain unchanged!')
from ..rpc import rpc_init
if not args.send_amt:
die(1, 'With --memoless first pass, you must supply a send amount')
die(1, 'With --memoless (reference request transaction), you must supply a send amount')
self.rpc = await rpc_init(self.cfg, self.proto)
qd = self.swap_proto_mod.quote_client(self, args.send_amt)
await self.display_quote_loop(qd, deduct_est_fee=False)

View file

@ -13,7 +13,6 @@ test.cmdtest_d.httpd.thornode.rpc: Thornode RPC HTTP server
import re, json
from wsgiref.util import request_uri
from mmgen.util import is_int
from mmgen.cfg import Config
from . import ThornodeServer
@ -125,31 +124,31 @@ class ThornodeRPCServer(ThornodeServer):
return self.lastblock_info
def get_refnum(m, length):
return self.memo_info[m[1].lower()[:8]] # 0c7454c0
return self.memo_info[m[1].lower()[:8]]
def validate_refnum(m, length):
mi = self.memo_info['0c7454c0']
assert m[1] == mi['asset']
assert m[2] == mi['reference']
return mi
for v in self.memo_info.values():
if v['asset'] == m[1] and v['reference'] == m[2]:
return v
def validate_amt(m, length):
mi = self.memo_info['0c7454c0']
assert m[1] == mi['asset']
assert is_int(m[2])
from mmgen.swap.util import get_swap_asset, init_swap_proto # pylint: disable=all
from mmgen.swap.proto.thorchain.memoless import THORChainMemolessAmount # pylint: disable=all
cfg = Config()
swap_asset = get_swap_asset(cfg, m[1], sanitize_input=True)
amt = init_swap_proto(cfg, swap_asset).coin_amt(int(m[2]), from_unit='atomic')
ma = THORChainMemolessAmount(amt)
a = THORChainMemolessAmount(amt)
assert a.refnum == int(mi['reference']), f'{a.refnum} != {int(mi["reference"])}'
for v in self.memo_info.values():
if v['asset'] == m[1] and int(v['reference']) == ma.refnum:
mi = v
break
else:
raise ValueError(f'No reference matching asset {m[1]} and refnum {ma.refnum}')
return {
'reference': a.refnum,
'reference': ma.refnum,
'available': True,
'can_register': True,
'expires_at': 9999999999,

View file

@ -21,7 +21,13 @@ from ...include.common import eth_inbound_addr, thorchain_router_addr_file
from . import ThornodeServer
# https://thornode.ninerealms.com/thorchain/quote/swap?from_asset=BCH.BCH&to_asset=LTC.LTC&amount=1000000
prices = {'BTC': 97000, 'LTC': 115, 'BCH': 330, 'ETH': 2304, 'MM1': 0.998, 'RUNE': 1.4}
prices = {
'BTC': 97000,
'LTC': 115,
'BCH': 330,
'ETH': 2304,
'MM1': 0.998,
'RUNE': 1.4}
gas_rate_units = {'ETH': 'gwei', 'BTC': 'satsperbyte'}
recommended_gas_rate = {'ETH': '1', 'BTC': '6'}

View file

@ -820,11 +820,11 @@ class CmdTestSwap(
def _memoless_swaptxcreate(
self,
args,
opts,
*,
add_opts = ['--memoless'],
refreq = False,
refnum = False):
t = self._swaptxcreate(args, add_opts=add_opts)
t = self._swaptxcreate(args, add_opts=opts)
if refnum:
return self._swaptxcreate_ui_common(t, inputs='2')
if args[-1] == 'BCH': # no dest addr
@ -846,7 +846,7 @@ class CmdTestSwap(
def memoless_swaptxcreate(self):
return self._memoless_swaptxcreate(
['LTC', '2.345', f'{self.subsid}:B:1', 'BCH'], # no dest addr
add_opts = ['--no-refreq'])
opts = ['--no-refreq'])
def rune_txcreate_refreq(self):
self.get_file_with_ext('rawtx', delete_all=True)
@ -868,6 +868,7 @@ class CmdTestSwap(
self.get_file_with_ext('rawtx', delete_all=True)
return self._memoless_swaptxcreate(
['LTC', '2.345', f'{self.subsid}:B:1', 'BCH', f'{self.sid}:C:2'],
opts = ['--memoless'],
refreq = True)
refreq_swaptxsign = rune_txsign_refreq
@ -880,7 +881,10 @@ class CmdTestSwap(
def _refnum_swaptxcreate(self, args, *, chg_addr=None, dest_addr=None):
data = json.loads(self.read_from_tmpfile('memo_info.json'))
return self._memoless_swaptxcreate(args, add_opts=[f'--refnum={data["reference"]}'], refnum=True)
return self._memoless_swaptxcreate(
args,
opts = [f'--refnum={data["reference"]}'],
refnum = True)
def refnum_swaptxcreate1(self):
return self._refnum_swaptxcreate(['LTC', '2.345', f'{self.subsid}:B:1', 'BCH', f'{self.sid}:C:2'])

View file

@ -117,8 +117,8 @@ class CmdTestXMRAutosign(CmdTestXMRWallet, CmdTestAutosignThreaded):
self.burn_addr = make_burn_addr(cfg)
self.xmrwallets_opt = f'--xmrwallets={self.users[self.user].kal_range}'
self.autosign_opts = ['--autosign'] # mmgen-xmrwallet opts
self.autosign_setup_opts = [f'--xmrwallets={self.users[self.user].kal_range}']
def create_tmp_wallets(self):
self.spawn(msg_only=True)
@ -216,10 +216,10 @@ class CmdTestXMRAutosign(CmdTestXMRWallet, CmdTestAutosignThreaded):
return self._delete_files('.dump')
def gen_kafile_miner(self):
return self.gen_kafiles(['miner'])
return self._gen_kafiles(['miner'])
def gen_vkafile_user(self):
return self.gen_kafiles([self.user], add_opts=['--viewkeys'])
return self._gen_kafiles([self.user], add_opts=['--viewkeys'])
def create_wallet_miner(self):
return self.create_wallets_miner()
@ -246,7 +246,7 @@ class CmdTestXMRAutosign(CmdTestXMRWallet, CmdTestAutosignThreaded):
mn_type = 'mmgen',
mn_file = self.users[self.user].mmwords,
use_dfl_wallet = None,
add_opts = [self.xmrwallets_opt],
add_opts = self.autosign_setup_opts,
expect_args = ['Continue with Monero setup? (Y/n): ', 'n'])
def autosign_xmr_setup_redo(self):
@ -263,7 +263,7 @@ class CmdTestXMRAutosign(CmdTestXMRWallet, CmdTestAutosignThreaded):
self.insert_device()
t = self.spawn(
'mmgen-autosign',
self.opts + [self.xmrwallets_opt] + ['xmr_setup'],
self.opts + self.autosign_setup_opts + ['xmr_setup'],
no_passthru_opts = True)
if write_viewkeys:
t.written_to_file('View keys')

View file

@ -128,12 +128,12 @@ class CmdTestXMRWallet(CmdTestBase):
for v in self.users.values():
run(['mkdir', '-p', v.udir])
self.tx_relay_daemon_parm = 'localhost:{}'.format(self.users[self.tx_relay_user].md.rpc_port)
self.tx_relay_daemon_proxy_parm = (
# must be IP, not 'localhost':
self.tx_relay_daemon_parm + f':127.0.0.1:{TestProxy.port}')
TestProxy(self, cfg)
if self.tx_relay_user:
self.tx_relay_daemon_parm = 'localhost:{}'.format(self.users[self.tx_relay_user].md.rpc_port)
self.tx_relay_daemon_proxy_parm = (
# must be IP, not 'localhost':
self.tx_relay_daemon_parm + f':127.0.0.1:{TestProxy.port}')
TestProxy(self, cfg)
if not cfg.no_daemon_stop:
atexit.register(stop_daemons, self)
@ -218,8 +218,8 @@ class CmdTestXMRWallet(CmdTestBase):
test_connection = False)
kafile_suf, fn_stem = (
('vkeys', 'MoneroWatchOnlyWallet') if autosign else
('akeys', 'MoneroWallet'))
('.vkeys', 'MoneroWatchOnlyWallet') if autosign else
('.akeys', 'MoneroWallet'))
self.users[user] = ud(
cfg = usr_cfg,
@ -229,7 +229,7 @@ class CmdTestXMRWallet(CmdTestBase):
udir = udir,
twdir = wd.wallet_dir,
kal_range = kal_range,
kafile = str(udir / f'{sid}-XMR-M[{kal_range}].{kafile_suf}'),
kafile = str(udir / f'{sid}-XMR-M[{kal_range}]{kafile_suf}'),
walletfile_fs = str(wd.wallet_dir / f'{sid}-{{}}-{fn_stem}'),
addrfile_fs = str(wd.wallet_dir / f'{sid}-{{}}-{fn_stem}.address.txt'),
md = md,
@ -255,9 +255,9 @@ class CmdTestXMRWallet(CmdTestBase):
return self.spawn('mmgen-tool', ['--coin=xmr', f'--rpc-port={rpc_port}', 'daemon_version'])
def gen_kafiles_miner_alice(self):
return self.gen_kafiles(['miner', 'alice'])
return self._gen_kafiles(['miner', 'alice'])
def gen_kafiles(self, users, add_opts=[]):
def _gen_kafiles(self, users, add_opts=[]):
for user, data in self.users.items():
if not user in users:
continue

View file

@ -3,9 +3,9 @@ from .asset_orig import *
class overlay_fake_THORChainSwapAsset:
assets_data = {
'ETH.MM1': THORChainSwapAsset._ad('MM1 Token (ETH)', None, 'ETH.MM1', None, 18, True),
'ETH.JUNK': THORChainSwapAsset._ad('Junk Token (ETH)', None, 'ETH.JUNK', None, 6, True),
'ETH.NONE': THORChainSwapAsset._ad('Unavailable Token (ETH)', None, 'ETH.NONE', None, 18, True)}
'ETH.MM1': THORChainSwapAsset._ad('MM1 Token (ETH)', None, 'ETH.MM1', None, 18, True),
'ETH.JUNK': THORChainSwapAsset._ad('Junk Token (ETH)', None, 'ETH.JUNK', None, 6, True),
'ETH.NONE': THORChainSwapAsset._ad('Banned Token (ETH)', None, 'ETH.NONE', None, 18, True)}
evm_contracts = {
'ETH.MM1': 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeef'}