opnet
Version:
The perfect library for building Bitcoin-based applications.
71 lines (70 loc) • 2.63 kB
JavaScript
import { Address, NetEvent } from '@btc-vision/transaction';
import { CallResult } from '../../contracts/CallResult.js';
export class TransactionReceipt {
receipt;
receiptProofs;
events;
rawEvents = {};
rawRevert;
revert;
gasUsed;
specialGasUsed;
constructor(receipt, network) {
this.receipt = receipt.receipt
? Buffer.from(receipt.receipt, 'base64')
: undefined;
this.receiptProofs = receipt.receiptProofs || [];
this.events = receipt.events ? this.parseEvents(receipt.events, network) : {};
this.rawRevert = receipt.revert
? Buffer.from(receipt.revert, 'base64')
: undefined;
this.revert = this.rawRevert ? CallResult.decodeRevertData(this.rawRevert) : undefined;
this.gasUsed = BigInt(receipt.gasUsed || '0x00') || 0n;
this.specialGasUsed = BigInt(receipt.specialGasUsed || '0x00') || 0n;
}
parseEvents(events, network) {
const parsedEvents = {};
if (!Array.isArray(events)) {
for (const [key, value] of Object.entries(events)) {
const ca = Address.fromString(key);
const caP2op = ca.p2op(network);
const v = value.map((event) => {
return this.decodeEvent(event);
});
parsedEvents[caP2op] = v;
this.rawEvents[key] = v;
}
}
else {
for (const event of events) {
const parsedEvent = this.decodeEvent(event);
const contractAddress = event.contractAddress;
const ca = Address.fromString(contractAddress);
const caP2op = ca.p2op(network);
if (!parsedEvents[caP2op]) {
parsedEvents[caP2op] = [];
}
if (!parsedEvents[caP2op]) {
parsedEvents[caP2op] = [];
}
parsedEvents[caP2op].push(parsedEvent);
if (!this.rawEvents[contractAddress]) {
this.rawEvents[contractAddress] = [];
}
this.rawEvents[contractAddress].push(parsedEvent);
}
}
return parsedEvents;
}
decodeEvent(event) {
let eventData;
if (typeof event.data === 'string') {
const buf = Buffer.from(event.data, 'base64');
eventData = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
}
else {
eventData = event.data;
}
return new NetEvent(event.type, eventData);
}
}