on master help sign in
bitcoin: sign with correct derivation path
commit8c35f05bb6ce8d033eaee1ae1d8bb0fe57be7215 authorpkova <pyry.kovanen@gmail.com> dateThu 28 Jan 2021, 19:03 (6 years ago) parent42d3e0b
2 files changed+20−8
src/lib/validators.js+13−6 src/views/Bitcoin.js+7−2
src/lib/validators.js+13−6
@@ -143,9 +143,16 @@ export const validatePsbt = base64 => {
143143};
144144
145145export const validateSignablePsbt = hd => base64 => {
146− try {
147− bitcoin.Psbt.fromBase64(base64).signAllInputsHD(hd);
148− } catch (e) {
149− return 'No inputs were signed';
150− }
151−};
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;
154+ } catch (e) {
155+ return false;
156+ }
157+ }) && 'No inputs were signed';
158+ };
src/views/Bitcoin.js+7−2
@@ -75,8 +75,13 @@ export default function Bitcoin() {
7575 }
7676 if (valid) {
7777 const newPsbt = bitcoin.Psbt.fromBase64(values.unsignedTransaction);
78− const hex = newPsbt
79− .signAllInputsHD(hd)
78+ const hex = newPsbt.data.inputs
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)
8085 .finalizeAllInputs()
8186 .extractTransaction()
8287 .toHex();