Browse Source

tx.new_swap: improve parsing of chg arg

The MMGen Project 7 months ago
parent
commit
ccfd3ee8c7
1 changed files with 25 additions and 21 deletions
  1. 25 21
      mmgen/tx/new_swap.py

+ 25 - 21
mmgen/tx/new_swap.py

@@ -67,17 +67,25 @@ class NewSwap(New):
 		self.confirm_autoselected_addr(res.twmmid, full_desc)
 		return ret(proto.coin, proto.network, res.addr, res.twmmid)
 
+	async def get_chg_output(self, arg, addrfiles):
+		chg_output = await self.get_swap_output(self.proto, arg, addrfiles, 'change address')
+		self.check_addr_is_wallet_addr(
+			chg_output,
+			message = 'Change address is not an MMGen wallet address!')
+		return chg_output
+
 	async def process_swap_cmdline_args(self, cmd_args, addrfiles):
 
 		class CmdlineArgs: # listed in command-line order
-			# send_coin      # required: uppercase coin symbol
-			send_amt  = None # optional: Omit to skip change addr and send value of all inputs minus fees
-							 #           to vault
-			chg_spec  = None # optional: change address spec, e.g. ‘B’ ‘DEADBEEF:B’ ‘DEADBEEF:B:1’ or coin
-							 #           address.  Omit for autoselected change address. Use of non-wallet
-							 #           change address will emit warning and prompt user for confirmation
-			# recv_coin      # required: uppercase coin symbol
-			recv_spec = None # optional: destination address spec. Same rules as for chg_spec
+			# send_coin       # required: uppercase coin symbol
+			send_amt  = None  # optional: Omit to skip change addr and send value of all inputs minus fees
+							  #           to vault
+			# chg_spec = None # optional: change address spec, e.g. ‘B’ ‘DEADBEEF:B’ ‘DEADBEEF:B:1’ or
+							  #           coin address.  Omit for autoselected change address.  Use of
+							  #           non-wallet change address will emit warning and prompt user
+							  #           for confirmation
+			# recv_coin       # required: uppercase coin symbol
+			recv_spec = None  # optional: destination address spec. Same rules as for chg_spec
 
 		def get_arg():
 			try:
@@ -85,7 +93,7 @@ class NewSwap(New):
 			except:
 				self.cfg._usage()
 
-		def parse():
+		async def parse():
 
 			# arg 1: send_coin - already popped and parsed by get_send_proto()
 
@@ -99,10 +107,10 @@ class NewSwap(New):
 				arg = get_arg()
 
 			# arg 3: chg_spec (change address spec)
-			if args.send_amt and not self.proto.is_evm:
-				if not arg in sp.SwapAsset.recv: # is change arg
-					args.chg_spec = arg
-					arg = get_arg()
+			if args.send_amt and not (self.proto.is_evm or arg in sp.SwapAsset.recv): # is change arg
+				nonlocal chg_output
+				chg_output = await self.get_chg_output(arg, addrfiles)
+				arg = get_arg()
 
 			# arg 4: recv_coin
 			self.swap_recv_asset_spec = arg # this goes into the transaction file
@@ -118,16 +126,12 @@ class NewSwap(New):
 		sp = self.swap_proto_mod
 		args_in = list(cmd_args)
 		args = CmdlineArgs()
-		parse()
+		chg_output = None
 
-		chg_output = (
-			await self.get_swap_output(self.proto, args.chg_spec, addrfiles, 'change address')
-			if args.send_amt and not self.proto.is_evm else None)
+		await parse()
 
-		if chg_output:
-			self.check_addr_is_wallet_addr(
-				chg_output,
-				message = 'Change address is not an MMGen wallet address!')
+		if args.send_amt and not (chg_output or self.proto.is_evm):
+			chg_output = await self.get_chg_output(None, addrfiles)
 
 		recv_output = await self.get_swap_output(
 			self.recv_proto,