solana-dex-parser
Version:
Solana Dex Transaction Parser
99 lines • 4.25 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PumpfunEventParser = void 0;
const bs58_1 = __importDefault(require("bs58"));
const buffer_1 = require("buffer");
const constants_1 = require("../../constants");
const instruction_classifier_1 = require("../../instruction-classifier");
const utils_1 = require("../../utils");
const binary_reader_1 = require("../binary-reader");
class PumpfunEventParser {
constructor(adapter) {
this.adapter = adapter;
this.eventParsers = {
TRADE: {
discriminator: constants_1.DISCRIMINATORS.PUMPFUN.TRADE_EVENT,
decode: this.decodeTradeEvent.bind(this),
},
CREATE: {
discriminator: constants_1.DISCRIMINATORS.PUMPFUN.CREATE_EVENT,
decode: this.decodeCreateEvent.bind(this),
},
COMPLETE: {
discriminator: constants_1.DISCRIMINATORS.PUMPFUN.COMPLETE_EVENT,
decode: this.decodeCompleteEvent.bind(this),
},
};
}
processEvents() {
const instructions = new instruction_classifier_1.InstructionClassifier(this.adapter).getInstructions(constants_1.DEX_PROGRAMS.PUMP_FUN.id);
return this.parseInstructions(instructions);
}
parseInstructions(instructions) {
return instructions
.map(({ instruction, outerIndex, innerIndex }) => {
try {
const data = (0, utils_1.getInstructionData)(instruction);
const discriminator = buffer_1.Buffer.from(data.slice(0, 16));
for (const [type, parser] of Object.entries(this.eventParsers)) {
if (discriminator.equals(parser.discriminator)) {
const eventData = parser.decode(data.slice(16));
if (!eventData)
return null;
return {
type: type,
data: eventData,
slot: this.adapter.slot,
timestamp: this.adapter.blockTime || 0,
signature: this.adapter.signature,
idx: `${outerIndex}-${innerIndex ?? 0}`,
};
}
}
}
catch (error) {
console.error('Failed to parse Pumpfun event:', error);
}
return null;
})
.filter((event) => event !== null);
}
decodeTradeEvent(data) {
const reader = new binary_reader_1.BinaryReader(data);
return {
mint: bs58_1.default.encode(buffer_1.Buffer.from(reader.readFixedArray(32))),
solAmount: reader.readU64(),
tokenAmount: reader.readU64(),
isBuy: reader.readU8() === 1,
user: bs58_1.default.encode(reader.readFixedArray(32)),
timestamp: reader.readI64(),
virtualSolReserves: reader.readU64(),
virtualTokenReserves: reader.readU64(),
};
}
decodeCreateEvent(data) {
const reader = new binary_reader_1.BinaryReader(data);
return {
name: reader.readString(),
symbol: reader.readString(),
uri: reader.readString(),
mint: bs58_1.default.encode(buffer_1.Buffer.from(reader.readFixedArray(32))),
bondingCurve: bs58_1.default.encode(reader.readFixedArray(32)),
user: bs58_1.default.encode(reader.readFixedArray(32)),
};
}
decodeCompleteEvent(data) {
const reader = new binary_reader_1.BinaryReader(data);
return {
user: bs58_1.default.encode(reader.readFixedArray(32)),
mint: bs58_1.default.encode(buffer_1.Buffer.from(reader.readFixedArray(32))),
bondingCurve: bs58_1.default.encode(reader.readFixedArray(32)),
timestamp: reader.readI64(),
};
}
}
exports.PumpfunEventParser = PumpfunEventParser;
//# sourceMappingURL=parser-pumpfun-event.js.map