UNPKG

solana-dex-parser

Version:

Solana Dex Transaction Parser

124 lines 5.88 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RaydiumLaunchpadEventParser = void 0; const borsh_1 = require("borsh"); const buffer_1 = require("buffer"); const constants_1 = require("../../constants"); const instruction_classifier_1 = require("../../instruction-classifier"); const utils_1 = require("../../utils"); const raydium_lcp_create_layout_1 = require("./layouts/raydium-lcp-create.layout"); const raydium_lcp_trade_layout_1 = require("./layouts/raydium-lcp-trade.layout"); class RaydiumLaunchpadEventParser { constructor(adapter) { this.adapter = adapter; this.EventsParsers = { CREATE: { discriminators: [constants_1.DISCRIMINATORS.RAYDIUM_LCP.CREATE_EVENT], slice: 16, decode: this.decodeCreateEvent.bind(this), }, TRADE: { discriminators: [ constants_1.DISCRIMINATORS.RAYDIUM_LCP.BUY_EXACT_IN, constants_1.DISCRIMINATORS.RAYDIUM_LCP.BUY_EXACT_OUT, constants_1.DISCRIMINATORS.RAYDIUM_LCP.SELL_EXACT_IN, constants_1.DISCRIMINATORS.RAYDIUM_LCP.SELL_EXACT_OUT, ], slice: 8, decode: this.decodeTradeInstruction.bind(this), }, COMPLETE: { discriminators: [constants_1.DISCRIMINATORS.RAYDIUM_LCP.MIGRATE_TO_AMM, constants_1.DISCRIMINATORS.RAYDIUM_LCP.MIGRATE_TO_CPSWAP], slice: 8, decode: this.decodeCompleteInstruction.bind(this), }, }; } processEvents() { const instructions = new instruction_classifier_1.InstructionClassifier(this.adapter).getInstructions(constants_1.DEX_PROGRAMS.RAYDIUM_LCP.id); return this.parseInstructions(instructions); } parseInstructions(instructions) { return instructions .map(({ instruction, outerIndex, innerIndex }) => { try { const data = (0, utils_1.getInstructionData)(instruction); for (const [type, parser] of Object.entries(this.EventsParsers)) { const discriminator = buffer_1.Buffer.from(data.slice(0, parser.slice)); if (parser.discriminators.some((it) => discriminator.equals(it))) { const options = { instruction, outerIndex, innerIndex, }; const eventData = parser.decode(data, options); 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 RaydiumLCP event:', error); } return null; }) .filter((event) => event !== null); } decodeTradeInstruction(data, options) { const eventInstruction = this.adapter.getInnerInstruction(options.outerIndex, options.innerIndex ? options.innerIndex + 1 : 0); // find inner instruction if (!eventInstruction) { throw new Error('Event instruction not found'); } // get event data from inner instruction const eventData = (0, utils_1.getInstructionData)(eventInstruction).slice(16); const layout = (0, borsh_1.deserializeUnchecked)(raydium_lcp_trade_layout_1.RaydiumLCPTradeLayout.schema, raydium_lcp_trade_layout_1.RaydiumLCPTradeLayout, buffer_1.Buffer.from(eventData)); const event = layout.toObject(); // get instruction accounts const accounts = this.adapter.getInstructionAccounts(options.instruction); event.user = accounts[0]; event.baseMint = accounts[9]; event.quoteMint = accounts[10]; return event; } decodeCreateEvent(data, options) { const eventInstruction = this.adapter.instructions[options.outerIndex]; // find outer instruction if (!eventInstruction) { throw new Error('Event instruction not found'); } // parse event data const eventData = data.slice(16); const event = raydium_lcp_create_layout_1.PoolCreateEventLayout.deserialize(eventData).toObject(); // get instruction accounts const accounts = this.adapter.getInstructionAccounts(eventInstruction); event.baseMint = accounts[6]; event.quoteMint = accounts[7]; return event; } decodeCompleteInstruction(data, options) { const discriminator = buffer_1.Buffer.from(data.slice(0, 8)); const accounts = this.adapter.getInstructionAccounts(options.instruction); const [baseMint, quoteMint, poolMint, lpMint] = discriminator.equals(constants_1.DISCRIMINATORS.RAYDIUM_LCP.MIGRATE_TO_AMM) ? [accounts[1], accounts[2], accounts[13], accounts[16]] : [accounts[1], accounts[2], accounts[5], accounts[7]]; const amm = discriminator.equals(constants_1.DISCRIMINATORS.RAYDIUM_LCP.MIGRATE_TO_AMM) ? constants_1.DEX_PROGRAMS.RAYDIUM_V4.name : constants_1.DEX_PROGRAMS.RAYDIUM_CPMM.name; return { baseMint, quoteMint, poolMint, lpMint, amm, }; } } exports.RaydiumLaunchpadEventParser = RaydiumLaunchpadEventParser; //# sourceMappingURL=parser-raydium-launchpad-event.js.map