@btc-vision/transaction
Version:
OPNet transaction library allows you to create and sign transactions for the OPNet network.
180 lines (147 loc) • 4.44 kB
text/typescript
import {
Network,
Psbt,
PsbtInputExtended,
PsbtOutputExtended,
Signer,
Transaction,
} from '@btc-vision/bitcoin';
import { ITweakedTransactionData, TweakedTransaction } from '../shared/TweakedTransaction.js';
export interface PsbtTransactionData extends ITweakedTransactionData {
readonly psbt: Psbt;
readonly signer: Signer;
readonly network: Network;
}
/*export interface IWBTCUTXODocument {
readonly vault: string;
readonly blockId: bigint;
readonly hash: string;
readonly value: bigint;
readonly outputIndex: number;
readonly output: string;
}
export interface VaultUTXOs {
readonly vault: string;
readonly publicKeys: string[];
readonly minimum: number;
readonly utxos: IWBTCUTXODocument[];
}*/
export type FromBase64Params = Omit<PsbtTransactionData, 'psbt'>;
/**
* @description PSBT Transaction processor.
* */
export class PsbtTransaction extends TweakedTransaction {
public readonly logColor: string = '#00ffe1';
public feesAddition: bigint = 10000n; // add 80000 satoshis to the fees
/**
* @description The transaction
* @protected
*/
protected readonly transaction: Psbt;
/**
* @description Sign hash types
* @protected
*/
protected readonly sighashTypes: number[] | undefined = [];
constructor(data: PsbtTransactionData) {
super(data);
this.signer = data.signer;
this.network = data.network;
this.transaction = data.psbt;
this.ignoreSignatureError();
this.tweakSigner();
this.internalInit();
}
public static fromBase64(data: string, params: FromBase64Params): PsbtTransaction {
const psbt = Psbt.fromBase64(data, {
network: params.network,
});
return new PsbtTransaction({
...params,
psbt,
});
}
public static fromHex(data: string, params: FromBase64Params): PsbtTransaction {
const psbt = Psbt.fromHex(data, {
network: params.network,
});
return new PsbtTransaction({
...params,
psbt,
});
}
public static from(params: FromBase64Params): PsbtTransaction {
const psbt = new Psbt({ network: params.network });
return new PsbtTransaction({
...params,
psbt,
});
}
/**
* @description Extract the transaction
*/
public extractTransaction(): Transaction {
return this.transaction.extractTransaction();
}
/**
* Final tx hex string.
*/
public final(): string {
return this.extractTransaction().toHex();
}
/**
* Get the psbt as a hex string
*/
public toHex(): string {
return this.transaction.toHex();
}
/**
* @description Add an input to the transaction
* @param input
* @param checkPartialSigs
*/
public addInput(input: PsbtInputExtended, checkPartialSigs: boolean = false): void {
this.transaction.addInput(input, checkPartialSigs);
}
/**
* @description Add an output to the transaction
* @param output
*/
public addOutput(output: PsbtOutputExtended): void {
if (!output.value) return;
this.transaction.addOutput(output);
}
/**
* Attempt to finalize all inputs
* @returns {boolean} True if all inputs were finalized
*/
public attemptFinalizeInputs(n: number = 1): boolean {
try {
const inputs = this.transaction.data.inputs;
for (let i = n; i < inputs.length; i++) {
const input = inputs[i];
if (input.finalScriptWitness) {
this.transaction.finalizeTaprootInput(i, input.finalScriptWitness);
} else {
this.transaction.finalizeInput(i);
}
}
return true;
} catch (e) {
this.warn((e as Error).stack || "Couldn't finalize inputs");
return false;
}
}
public getPSBT(): Psbt {
return this.transaction;
}
/*private getTotalOutputAmount(vaults: VaultUTXOs[]): bigint {
let total = BigInt(0);
for (const vault of vaults) {
for (const utxo of vault.utxos) {
total += BigInt(utxo.value);
}
}
return total;
}*/
}