diff --git a/plugins/ledger/ledger.py b/plugins/ledger/ledger.py index 6538aa670..326788357 100644 --- a/plugins/ledger/ledger.py +++ b/plugins/ledger/ledger.py @@ -257,28 +257,27 @@ class Ledger_KeyStore(Hardware_KeyStore): p2shTransaction = False pin = "" self.get_client() # prompt for the PIN before displaying the dialog if necessary - rawTx = tx.serialize() + # Fetch inputs of the transaction to sign + derivations = self.get_tx_derivations(tx) for txin in tx.inputs(): if txin.get('is_coinbase'): self.give_error("Coinbase not supported") # should never happen redeemScript = None - signingPos = -1 - xpub, s = parse_xpubkey(txin['x_pubkeys'][0]) - hwAddress = "%s/%d/%d" % (self.get_derivation()[2:], s[0], s[1]) if len(txin['pubkeys']) > 1: p2shTransaction = True if 'redeemScript' in txin: redeemScript = txin['redeemScript'] - if p2shTransaction: - chipPublicKey = compress_public_key(self.get_client().getWalletPublicKey(hwAddress)['publicKey']) - for currentIndex, key in enumerate(txin['pubkeys']): - if chipPublicKey == key.decode('hex'): - signingPos = currentIndex - break - if signingPos == -1: - self.give_error("No matching key for multisignature input") # should never happen + + for i, x_pubkey in enumerate(txin['x_pubkeys']): + if x_pubkey in derivations: + signingPos = i + s = derivations.get(x_pubkey) + hwAddress = "%s/%d/%d" % (self.get_derivation()[2:], s[0], s[1]) + break + else: + self.give_error("No matching x_key for sign_transaction") # should never happen inputs.append([txin['prev_tx'].raw, txin['prevout_n'], redeemScript, txin['prevout_hash'], signingPos ]) inputsPaths.append(hwAddress)