tfix #2352 - electrum - Electrum Bitcoin wallet (HTM) git clone https://git.parazyd.org/electrum (DIR) Log (DIR) Files (DIR) Refs (DIR) Submodules --- (DIR) commit 9140c1fc8946a10966d767a727ca6e0150a7d203 (DIR) parent 7c93d787ed2a21a057f1cf9bf223d3089f98dc62 (HTM) Author: ThomasV <thomasv@electrum.org> Date: Tue, 18 Apr 2017 10:43:24 +0200 fix #2352 Diffstat: M plugins/ledger/ledger.py | 40 ++++++++++---------------------- 1 file changed, 12 insertions(+), 28 deletions(-) --- (DIR) diff --git a/plugins/ledger/ledger.py b/plugins/ledger/ledger.py t@@ -11,7 +11,7 @@ from electrum.bitcoin import TYPE_ADDRESS, int_to_hex, var_int from electrum.i18n import _ from electrum.plugins import BasePlugin, hook from electrum.keystore import Hardware_KeyStore, parse_xpubkey -from electrum.transaction import push_script +from electrum.transaction import push_script, Transaction from ..hw_wallet import HW_PluginBase from electrum.util import format_satoshis_plain, print_error, is_verbose t@@ -300,11 +300,14 @@ class Ledger_KeyStore(Hardware_KeyStore): self.give_error("No matching x_key for sign_transaction") # should never happen redeemScript = txin.get('redeemScript') - if segwitTransaction and not redeemScript: - pkh = bitcoin.hash_160(pubkeys[0].decode('hex')).encode('hex') - redeemScript = '76a9' + push_script(pkh) + '88ac' + if not redeemScript: + if segwitTransaction: + pkh = bitcoin.hash_160(pubkeys[0].decode('hex')).encode('hex') + redeemScript = '76a9' + push_script(pkh) + '88ac' + elif p2shTransaction: + redeemScript = Transaction.get_preimage_script(txin) - inputs.append([txin['prev_tx'].raw, txin['prevout_n'], redeemScript, txin['prevout_hash'], signingPos, txin['sequence'] ]) + inputs.append([txin['prev_tx'].raw, txin['prevout_n'], redeemScript, txin['prevout_hash'], signingPos, txin.get('sequence', 0xffffffff) ]) inputsPaths.append(hwAddress) pubKeys.append(pubkeys) t@@ -429,29 +432,10 @@ class Ledger_KeyStore(Hardware_KeyStore): finally: self.handler.clear_dialog() - # Reformat transaction - inputIndex = 0 - if segwitTransaction: - for txin in tx.inputs(): - txin['signatures'] = [str(signatures[inputIndex][0:-1]).encode('hex')] - inputIndex = inputIndex + 1 - else: - while inputIndex < len(inputs): - if p2shTransaction: - signaturesPack = [signatures[inputIndex]] * len(pubKeys[inputIndex]) - inputScript = get_p2sh_input_script(redeemScripts[inputIndex], signaturesPack) - preparedTrustedInputs.append([ ("\x00" * 4) + chipInputs[inputIndex]['value'], inputScript ]) - else: - inputScript = get_regular_input_script(signatures[inputIndex], pubKeys[inputIndex][0].decode('hex')) - preparedTrustedInputs.append([ chipInputs[inputIndex]['value'], inputScript ]) - inputIndex = inputIndex + 1 - updatedTransaction = format_transaction(transactionOutput, preparedTrustedInputs) - updatedTransaction = hexlify(updatedTransaction) - - if reorganize: - tx.update(updatedTransaction) - else: - tx.update_signatures(updatedTransaction) + for i, txin in enumerate(tx.inputs()): + signingPos = inputs[i][4] + txin['signatures'][signingPos] = str(signatures[i]).encode('hex') + tx.raw = tx.serialize() self.signing = False