update signrawtransaction
authorThomasV <thomasv@gitorious>
Sat, 17 Aug 2013 07:53:46 +0000 (09:53 +0200)
committerThomasV <thomasv@gitorious>
Sat, 17 Aug 2013 07:53:46 +0000 (09:53 +0200)
lib/commands.py
lib/wallet.py

index c30b084..250f087 100644 (file)
@@ -131,7 +131,9 @@ class Commands:
 
     def createmultisig(self, num, pubkeys):
         assert isinstance(pubkeys, list)
-        return Transaction.multisig_script(pubkeys, num)
+        redeem_script = Transaction.multisig_script(pubkeys, num)
+        address = hash_160_to_bc_address(hash_160(redeem_script.decode('hex')), 5)
+        return {'address':address, 'redeemScript':redeem_script}
     
     def freeze(self,addr):
         return self.wallet.freeze(addr)
index 685a929..36ddb3c 100644 (file)
@@ -366,15 +366,20 @@ class Wallet:
 
 
     def signrawtransaction(self, tx, input_info, private_keys, password):
+        import deserialize
         unspent_coins = self.get_unspent_coins()
         seed = self.decode_seed(password)
 
-        # convert private_keys to dict 
-        pk = {}
+        # build a list of public/private keys
+        keypairs = {}
         for sec in private_keys:
-            address = address_from_private_key(sec)
-            pk[address] = sec
-        private_keys = pk
+            compressed = is_compressed(sec)
+            pkey = regenerate_key(sec)
+            pubkey = GetPubKey(pkey.pubkey, compressed)
+            keypairs[ pubkey.encode('hex') ] = sec
+
+        # will be filled for each input
+        private_keys = {}
 
         for txin in tx.inputs:
             # convert to own format
@@ -396,26 +401,34 @@ class Wallet:
                     # if neither, we might want to get it from the server..
                     raise
 
-            # find the address:
+            # find the address and fill private_keys
             if txin.get('KeyID'):
                 account, name, sequence = txin.get('KeyID')
-                if name != 'Electrum': continue
+                if name != 'BIP32': continue
                 sec = self.accounts[account].get_private_key(sequence, seed)
                 addr = self.accounts[account].get_address(sequence)
                 txin['address'] = addr
-                private_keys[addr] = sec
+                private_keys[addr] = [sec]
 
-            elif txin.get("redeemScript"):
-                txin['address'] = hash_160_to_bc_address(hash_160(txin.get("redeemScript").decode('hex')), 5)
+            redeem_script = txin.get("redeemScript")
+            if redeem_script:
+                num, redeem_pubkeys = deserialize.parse_redeemScript(redeem_script)
+                addr = hash_160_to_bc_address(hash_160(redeem_script.decode('hex')), 5)
+                txin['address'] = addr
+                private_keys[addr] = []
+                for pubkey in redeem_pubkeys:
+                    if pubkey in keypairs:
+                        private_keys[addr].append( keypairs[pubkey] )
 
             elif txin.get("raw_output_script"):
-                import deserialize
                 addr = deserialize.get_address_from_output_script(txin.get("raw_output_script").decode('hex'))
                 sec = self.get_private_key(addr, password)
                 if sec: 
-                    private_keys[addr] = sec
+                    private_keys[addr] = [sec]
                     txin['address'] = addr
 
+            print txin
+
         tx.sign( private_keys )
 
     def sign_message(self, address, message, password):