@ledgerhq/hw-app-btc
Version:
Ledger Hardware Wallet Bitcoin Application API
39 lines (36 loc) • 1.44 kB
text/typescript
import { BufferWriter, PsbtV2 } from "@ledgerhq/psbtv2";
/**
* This implements the "Transaction Extractor" role of BIP370 (PSBTv2
* https://github.com/bitcoin/bips/blob/master/bip-0370.mediawiki#transaction-extractor). However
* the role is partially documented in BIP174 (PSBTv0
* https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki#transaction-extractor).
*/
export function extract(psbt: PsbtV2): Buffer {
const tx = new BufferWriter();
tx.writeUInt32(psbt.getGlobalTxVersion());
const isSegwit = !!psbt.getInputWitnessUtxo(0);
if (isSegwit) {
tx.writeSlice(Buffer.from([0, 1]));
}
const inputCount = psbt.getGlobalInputCount();
tx.writeVarInt(inputCount);
const witnessWriter = new BufferWriter();
for (let i = 0; i < inputCount; i++) {
tx.writeSlice(psbt.getInputPreviousTxid(i));
tx.writeUInt32(psbt.getInputOutputIndex(i));
tx.writeVarSlice(psbt.getInputFinalScriptsig(i) ?? Buffer.from([]));
tx.writeUInt32(psbt.getInputSequence(i));
if (isSegwit) {
witnessWriter.writeSlice(psbt.getInputFinalScriptwitness(i));
}
}
const outputCount = psbt.getGlobalOutputCount();
tx.writeVarInt(outputCount);
for (let i = 0; i < outputCount; i++) {
tx.writeUInt64(psbt.getOutputAmount(i));
tx.writeVarSlice(psbt.getOutputScript(i));
}
tx.writeSlice(witnessWriter.buffer());
tx.writeUInt32(psbt.getGlobalFallbackLocktime() ?? 0);
return tx.buffer();
}