on master help sign in
bitcoin: sign with correct derivation path
8c35f05pkova
src/lib/validators.js+13−6
@@ -143,9 +143,16 @@ export const validatePsbt = base64 => {
143};
143};
144
144
145export const validateSignablePsbt = hd => base64 => {
145export const validateSignablePsbt = hd => base64 => {
146− try {
147− bitcoin.Psbt.fromBase64(base64).signAllInputsHD(hd);
146+ const psbt = bitcoin.Psbt.fromBase64(base64);
147+ return !psbt.data.inputs.some((input, idx) => {
148+ try {
149+ // removing already derived part, eg 'm/84'/0'/0'/0/0' becomes '0/0'
150+ const path = input.bip32Derivation[0].path.substring(12);
151+ const prv = hd.derivePath(path).privateKey;
152+ psbt.signInput(idx, bitcoin.ECPair.fromPrivateKey(prv));
153+ return true;
148− } catch (e) {
154+ } catch (e) {
155+ return false;
156+ }
149− return 'No inputs were signed';
157+ }) && 'No inputs were signed';
150− }
158+ };
151−};
src/views/Bitcoin.js+7−2
@@ -75,8 +75,13 @@ export default function Bitcoin() {
75 }
75 }
76 if (valid) {
76 if (valid) {
77 const newPsbt = bitcoin.Psbt.fromBase64(values.unsignedTransaction);
77 const newPsbt = bitcoin.Psbt.fromBase64(values.unsignedTransaction);
78− const hex = newPsbt
78+ const hex = newPsbt.data.inputs
79− .signAllInputsHD(hd)
79+ .reduce((psbt, input, idx) => {
80+ // removing already derived part, eg 'm/84'/0'/0'/0/0' becomes '0/0'
81+ const path = input.bip32Derivation[0].path.substring(12);
82+ const prv = hd.derivePath(path).privateKey;
83+ return psbt.signInput(idx, bitcoin.ECPair.fromPrivateKey(prv));
84+ }, newPsbt)
80 .finalizeAllInputs()
85 .finalizeAllInputs()
81 .extractTransaction()
86 .extractTransaction()
82 .toHex();
87 .toHex();