2020-12-17 22:31:45 +03:00
|
|
|
const bitcoin = require('bitcoinjs-lib');
|
|
|
|
const ecpair = bitcoin.ECPair;
|
|
|
|
const crypto = bitcoin.crypto;
|
|
|
|
const bscript = bitcoin.script;
|
|
|
|
const bip39 = require('bip39');
|
|
|
|
const LOCK_TIME = 0;
|
|
|
|
const SIGHASH_ALL = 1;
|
2021-02-02 14:21:20 +03:00
|
|
|
let NETWORK;
|
|
|
|
|
|
|
|
/*
|
|
|
|
Usage:
|
|
|
|
var p = require("./psbt_sign.js")
|
|
|
|
var psbt = PSBT_STRING_BASE64
|
|
|
|
const mnemonics = MNEMONICS_STRING
|
|
|
|
|
|
|
|
p.run("TESTNET", mnemonics, psbt)
|
|
|
|
p.run("MAIN", mnemonics, psbt)
|
|
|
|
*/
|
2020-12-17 22:31:45 +03:00
|
|
|
|
|
|
|
const isSegwitTx = (rawTx) => {
|
|
|
|
return rawTx.substring(8, 12) === '0001';
|
|
|
|
};
|
|
|
|
|
2020-12-18 12:11:48 +03:00
|
|
|
// const PATHS = ["m/84'/0'/0'/0/0", "m/84'/0'/0'/1/0"];
|
2020-12-17 22:31:45 +03:00
|
|
|
|
2021-02-02 14:21:20 +03:00
|
|
|
const run = async(network, mnemonics, psbtStr) => {
|
|
|
|
let NETWORK;
|
|
|
|
if (network === "MAIN") {
|
|
|
|
NETWORK = bitcoin.networks.bitcoin;
|
|
|
|
}
|
|
|
|
else if (network = "TESTNET") {
|
|
|
|
NETWORK = bitcoin.networks.testnet;
|
|
|
|
}
|
|
|
|
|
2020-12-17 22:31:45 +03:00
|
|
|
const psbt = bitcoin.Psbt.fromBase64(psbtStr);
|
2020-12-18 12:11:48 +03:00
|
|
|
const is = psbt.data.inputs;
|
2020-12-17 22:31:45 +03:00
|
|
|
const seed = await bip39.mnemonicToSeed(mnemonics);
|
|
|
|
const node = bitcoin.bip32.fromSeed(seed, NETWORK);
|
|
|
|
|
2020-12-18 12:11:48 +03:00
|
|
|
for(let i=0; i<is.length; i++) {
|
|
|
|
const der = is[i].bip32Derivation[0];
|
|
|
|
const walletDer = node.derivePath(der.path);
|
2020-12-17 22:31:45 +03:00
|
|
|
|
2020-12-18 12:11:48 +03:00
|
|
|
if(0 === Buffer.compare(der.pubkey, walletDer.publicKey)) {
|
|
|
|
console.log(`Signing ${der.path}`);
|
|
|
|
psbt.signInput(i, bitcoin.ECPair.fromPrivateKey(walletDer.privateKey));
|
|
|
|
}
|
|
|
|
const validate = await psbt.validateSignaturesOfAllInputs();
|
|
|
|
await psbt.finalizeAllInputs();
|
|
|
|
const hex = psbt.extractTransaction().toHex();
|
|
|
|
console.log({ validate, hex});
|
|
|
|
}
|
2020-12-17 22:31:45 +03:00
|
|
|
return;
|
|
|
|
};
|
|
|
|
|
|
|
|
exports.run = run;
|