UNPKG

opnet

Version:

The perfect library for building Bitcoin-based applications.

134 lines (111 loc) 4.28 kB
import { Network } from '@btc-vision/bitcoin'; import { BigNumberish } from '../common/CommonTypes.js'; import { OPNetTransactionTypes } from '../interfaces/opnet/OPNetTransactionTypes.js'; import { ITransactionBase } from './interfaces/ITransactionBase.js'; import { ProofOfWorkChallenge, RawProofOfWorkChallenge, } from './interfaces/ProofOfWorkChallenge.js'; import { TransactionInput } from './metadata/TransactionInput.js'; import { ITransactionOutput, TransactionOutput } from './metadata/TransactionOutput.js'; import { TransactionReceipt } from './metadata/TransactionReceipt.js'; /** * @description This class is used to provide a base transaction. * @class Transaction * @implements {ITransactionBase<T>} * @template T * @category Transactions * @abstract */ export abstract class TransactionBase<T extends OPNetTransactionTypes> extends TransactionReceipt implements ITransactionBase<T> { /** * @description The transaction ID (hash). */ public readonly id: string; /** * @description The transaction "hash". */ public readonly hash: string; /** * @description The index of the transaction in the block. */ public readonly index: number; /** * @description Returns the amount of satoshi that were burned in the transaction. */ public readonly burnedBitcoin: BigNumberish; /** * @description The priority fee of the transaction. */ public readonly priorityFee: BigNumberish; /** * @description The maximum amount of gas that can be spent by the transaction. */ public readonly maxGasSat: BigNumberish; /** * @description The inputs of the transaction. */ public readonly inputs: TransactionInput[]; /** * @description The outputs of the transaction. */ public readonly outputs: TransactionOutput[]; /** * @description The type of the transaction. */ public readonly OPNetType: T; /** * @description The amount of gas used by the transaction. */ public readonly gasUsed: bigint; /** * @description Special gas used by the transaction. */ public readonly specialGasUsed: bigint; /** * @description The proof of work challenge. */ public readonly pow?: ProofOfWorkChallenge; /** * @description The block number in which the transaction was included. */ public readonly blockNumber?: bigint; protected constructor(transaction: ITransactionBase<T>, network: Network) { super( { receipt: transaction.receipt, receiptProofs: transaction.receiptProofs, events: transaction.events, revert: transaction.revert, gasUsed: transaction.gasUsed, specialGasUsed: transaction.specialGasUsed, }, network, ); this.id = transaction.id; this.hash = transaction.hash; this.index = transaction.index; if (transaction.blockNumber) this.blockNumber = BigInt(transaction.blockNumber); this.burnedBitcoin = BigInt(transaction.burnedBitcoin) || 0n; this.priorityFee = BigInt(transaction.priorityFee) || 0n; this.inputs = transaction.inputs.map((input) => new TransactionInput(input)); this.outputs = transaction.outputs.map( (output) => new TransactionOutput(output as ITransactionOutput), ); this.OPNetType = transaction.OPNetType; this.gasUsed = BigInt(transaction.gasUsed || '0x00') || 0n; this.specialGasUsed = BigInt(transaction.specialGasUsed || '0x00') || 0n; if (transaction.pow) { this.pow = this.decodeProofOfWorkChallenge(transaction.pow as RawProofOfWorkChallenge); } this.maxGasSat = this.burnedBitcoin + (this.pow?.reward || 0n) - this.priorityFee; } private decodeProofOfWorkChallenge(challenge: RawProofOfWorkChallenge): ProofOfWorkChallenge { return { preimage: Buffer.from(challenge.preimage, 'base64'), reward: BigInt(challenge.reward) || 0n, difficulty: BigInt(challenge.difficulty || '0'), version: challenge.version || 0, }; } }