implementing mksendmanytx
authornelisky <nelisky.btc@gmail.com>
Mon, 8 Apr 2013 22:36:26 +0000 (23:36 +0100)
committerThomasV <thomasv@gitorious>
Sun, 18 Aug 2013 00:07:59 +0000 (02:07 +0200)
A simple argument parsing change from mktx to allow passing multiple recipients

electrum
lib/commands.py

index 6de03f1..c20c3be 100755 (executable)
--- a/electrum
+++ b/electrum
@@ -337,6 +337,16 @@ if __name__ == '__main__':
     elif cmd in ['payto', 'mktx']:
         domain = [options.from_addr] if options.from_addr else None
         args = [ 'mktx', args[1], Decimal(args[2]), Decimal(options.tx_fee) if options.tx_fee else None, options.change_addr, domain ]
+        
+    elif cmd == 'mksendmanytx':
+        domain = [options.from_addr] if options.from_addr else None
+        outputs = []
+        for i in range(1, len(args), 2):
+            if len(args) < i+2:
+                print_msg("Error: Mismatched arguments.")
+                exit(1)
+            outputs.append((args[i], Decimal(args[i+1])))
+        args = [ 'mksendmanytx', outputs, Decimal(options.tx_fee) if options.tx_fee else None, options.change_addr, domain ]        
 
     elif cmd == 'help':
         if len(args) < 2:
index 250f087..0641dbe 100644 (file)
@@ -60,6 +60,7 @@ register_command('importprivkey',        1, 1, True,  True,  'Import a private k
 register_command('listaddresses',        3, 3, False, True,  'Returns your list of addresses.', '', listaddr_options)
 register_command('listunspent',          0, 0, False, True,  'Returns a list of unspent inputs in your wallet.')
 register_command('mktx',                 5, 5, True,  True,  'Create a signed transaction', 'mktx <recipient> <amount> [label]', payto_options)
+register_command('mksendmanytx',         4, 4, True,  True,  'Create a signed transaction', 'mktx <recipient> <amount> [<recipient> <amount> ...]', payto_options)
 register_command('payto',                5, 5, True,  False, 'Create and broadcast a transaction.', "payto <recipient> <amount> [label]\n<recipient> can be a bitcoin address or a label", payto_options)
 register_command('password',             0, 0, True,  True,  'Change your password')
 register_command('prioritize',           1, 1, False, True,  'Coins at prioritized addresses are spent first.', 'prioritize <address>')
@@ -207,10 +208,11 @@ class Commands:
         return self.wallet.verify_message(address, signature, message)
 
 
-    def _mktx(self, to_address, amount, fee = None, change_addr = None, domain = None):
+    def _mktx(self, outputs, fee = None, change_addr = None, domain = None):
 
-        if not is_valid(to_address):
-            raise BaseException("Invalid Bitcoin address", to_address)
+        for to_address, amount in outputs:
+            if not is_valid(to_address):
+                raise BaseException("Invalid Bitcoin address", to_address)
 
         if change_addr:
             if not is_valid(change_addr):
@@ -225,25 +227,35 @@ class Commands:
                     raise BaseException("address not in wallet", addr)
 
         for k, v in self.wallet.labels.items():
-            if v == to_address:
-                to_address = k
-                print_msg("alias", to_address)
-                break
             if change_addr and v == change_addr:
                 change_addr = k
 
-        amount = int(100000000*amount)
+        final_outputs = []
+        for to_address, amount in outputs:
+            for k, v in self.wallet.labels.items():
+                if v == to_address:
+                    to_address = k
+                    print_msg("alias", to_address)
+                    break
+
+            amount = int(100000000*amount)
+            final_outputs.append((to_address, amount))
+            
         if fee: fee = int(100000000*fee)
-        return self.wallet.mktx( [(to_address, amount)], self.password, fee , change_addr, domain)
+        return self.wallet.mktx(final_outputs, self.password, fee , change_addr, domain)
 
 
     def mktx(self, to_address, amount, fee = None, change_addr = None, domain = None):
-        tx = self._mktx(to_address, amount, fee, change_addr, domain)
+        tx = self._mktx([(to_address, amount)], fee, change_addr, domain)
+        return tx.as_dict()
+
+    def mksendmanytx(self, outputs, fee = None, change_addr = None, domain = None):
+        tx = self._mktx(outputs, fee, change_addr, domain)
         return tx.as_dict()
 
 
     def payto(self, to_address, amount, fee = None, change_addr = None, domain = None):
-        tx = self._mktx(to_address, amount, fee, change_addr, domain)
+        tx = self._mktx([(to_address, amount)], fee, change_addr, domain)
         r, h = self.wallet.sendtx( tx )
         return h