electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 5416a4ea8a9d3768a4ad3bc18f6c1396c39e86f1
parent 0abb38cf51daca597997e7baaff5385659168bad
Author: ThomasV <thomasv@electrum.org>
Date:   Sun, 17 Sep 2017 16:54:40 +0200

serialize value for segwit-p2sh inputs too

Diffstat:
Mlib/transaction.py | 20++++++++++++--------
Mlib/wallet.py | 5++++-
2 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/lib/transaction.py b/lib/transaction.py @@ -421,12 +421,15 @@ def parse_input(vds): d['type'] = 'unknown' d['num_sig'] = 0 if scriptSig: - if len(scriptSig) == 8: - d['value'] = struct.unpack_from('<Q', scriptSig, 0)[0] - d['scriptSig'] = '' - else: + if scriptSig[0] == 255: + d['value'] = struct.unpack_from('<Q', scriptSig, 1)[0] + scriptSig = scriptSig[9:] + if scriptSig: d['scriptSig'] = bh2u(scriptSig) parse_scriptSig(d, scriptSig) + else: + d['scriptSig'] = '' + return d @@ -660,6 +663,8 @@ class Transaction: return txin['scriptSig'] pubkeys, sig_list = self.get_siglist(txin, estimate_size) script = ''.join(push_script(x) for x in sig_list) + if self.is_segwit_input(txin): + segwit_value = '' if self.is_txin_complete(txin) or estimate_size else 'ff' + int_to_hex(txin['value'], 8) if _type == 'p2pk': pass elif _type == 'p2sh': @@ -670,11 +675,10 @@ class Transaction: elif _type == 'p2pkh': script += push_script(pubkeys[0]) elif _type in ['p2wpkh', 'p2wsh']: - # if it is not complete we store the value - return '' if self.is_txin_complete(txin) or estimate_size else int_to_hex(txin['value'], 8) + return segwit_value elif _type in ['p2wpkh-p2sh', 'p2wsh-p2sh']: redeem_script = txin.get('redeemScript') or segwit_script(pubkeys[0]) - return push_script(redeem_script) + return segwit_value + push_script(redeem_script) elif _type == 'address': script += push_script(pubkeys[0]) elif _type == 'unknown': @@ -693,7 +697,7 @@ class Transaction: # only for non-segwit if txin['type'] == 'p2pkh': return bitcoin.address_to_script(txin['address']) - elif txin['type'] in ['p2sh', 'p2wsh']: + elif txin['type'] in ['p2sh', 'p2wsh', 'p2wsh-p2sh']: pubkeys, x_pubkeys = self.get_sorted_pubkeys(txin) return multisig_script(pubkeys, txin['num_sig']) elif txin['type'] in ['p2wpkh', 'p2wpkh-p2sh']: diff --git a/lib/wallet.py b/lib/wallet.py @@ -1680,8 +1680,11 @@ class Multisig_Wallet(Deterministic_Wallet): elif self.txin_type == 'p2wsh': witness_script = self.pubkeys_to_redeem_script(pubkey) return bitcoin.script_to_p2wsh(witness_script) + elif self.txin_type == 'p2wsh-p2sh': + redeem_script = self.pubkeys_to_redeem_script(pubkey) + return bitcoin.hash160_to_p2sh(hash_160(bfh(redeem_script))) else: - raise NotImplementedError() + raise NotImplementedError(self.txin_type) #def redeem_script(self, c, i): # pubkeys = self.get_pubkeys(c, i)