solana-dex-parser
Version:
Solana Dex Transaction Parser
186 lines • 8.03 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PumpswapEventParser = void 0;
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 PumpswapEventParser {
constructor(adapter) {
this.adapter = adapter;
this.eventParsers = {
CREATE: {
discriminator: constants_1.DISCRIMINATORS.PUMPSWAP.CREATE_POOL,
decode: this.decodeCreateEvent.bind(this),
},
ADD: {
discriminator: constants_1.DISCRIMINATORS.PUMPSWAP.ADD_LIQUIDITY,
decode: this.decodeAddLiquidity.bind(this),
},
REMOVE: {
discriminator: constants_1.DISCRIMINATORS.PUMPSWAP.REMOVE_LIQUIDITY,
decode: this.decodeRemoveLiquidity.bind(this),
},
BUY: {
discriminator: constants_1.DISCRIMINATORS.PUMPSWAP.BUY,
decode: this.decodeBuyEvent.bind(this),
},
SELL: {
discriminator: constants_1.DISCRIMINATORS.PUMPSWAP.SELL,
decode: this.decodeSellEvent.bind(this),
},
};
}
processEvents() {
const instructions = new instruction_classifier_1.InstructionClassifier(this.adapter).getInstructions(constants_1.DEX_PROGRAMS.PUMP_SWAP.id);
return this.parseInstructions(instructions);
}
parseInstructions(instructions) {
return instructions
.map(({ instruction, outerIndex, innerIndex }) => {
try {
const data = (0, utils_1.getInstructionData)(instruction);
const discriminator = 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;
const event = {
type: type,
data: eventData,
slot: this.adapter.slot,
timestamp: this.adapter.blockTime || 0,
signature: this.adapter.signature,
idx: `${outerIndex}-${innerIndex ?? 0}`,
};
return event;
}
}
}
catch (error) {
console.error('Failed to parse Pumpswap event:', error);
}
return null;
})
.filter((event) => event !== null);
}
decodeBuyEvent(data) {
const reader = new binary_reader_1.BinaryReader(data);
return {
timestamp: Number(reader.readI64()),
baseAmountOut: reader.readU64(),
maxQuoteAmountIn: reader.readU64(),
userBaseTokenReserves: reader.readU64(),
userQuoteTokenReserves: reader.readU64(),
poolBaseTokenReserves: reader.readU64(),
poolQuoteTokenReserves: reader.readU64(),
quoteAmountIn: reader.readU64(),
lpFeeBasisPoints: reader.readU64(),
lpFee: reader.readU64(),
protocolFeeBasisPoints: reader.readU64(),
protocolFee: reader.readU64(),
quoteAmountInWithLpFee: reader.readU64(),
userQuoteAmountIn: reader.readU64(),
pool: reader.readPubkey(),
user: reader.readPubkey(),
userBaseTokenAccount: reader.readPubkey(),
userQuoteTokenAccount: reader.readPubkey(),
protocolFeeRecipient: reader.readPubkey(),
protocolFeeRecipientTokenAccount: reader.readPubkey(),
};
}
decodeSellEvent(data) {
const reader = new binary_reader_1.BinaryReader(data);
return {
timestamp: Number(reader.readI64()),
baseAmountIn: reader.readU64(),
minQuoteAmountOut: reader.readU64(),
userBaseTokenReserves: reader.readU64(),
userQuoteTokenReserves: reader.readU64(),
poolBaseTokenReserves: reader.readU64(),
poolQuoteTokenReserves: reader.readU64(),
quoteAmountOut: reader.readU64(),
lpFeeBasisPoints: reader.readU64(),
lpFee: reader.readU64(),
protocolFeeBasisPoints: reader.readU64(),
protocolFee: reader.readU64(),
quoteAmountOutWithoutLpFee: reader.readU64(),
userQuoteAmountOut: reader.readU64(),
pool: reader.readPubkey(),
user: reader.readPubkey(),
userBaseTokenAccount: reader.readPubkey(),
userQuoteTokenAccount: reader.readPubkey(),
protocolFeeRecipient: reader.readPubkey(),
protocolFeeRecipientTokenAccount: reader.readPubkey(),
};
}
decodeAddLiquidity(data) {
const reader = new binary_reader_1.BinaryReader(data);
return {
timestamp: Number(reader.readI64()),
lpTokenAmountOut: reader.readU64(),
maxBaseAmountIn: reader.readU64(),
maxQuoteAmountIn: reader.readU64(),
userBaseTokenReserves: reader.readU64(),
userQuoteTokenReserves: reader.readU64(),
poolBaseTokenReserves: reader.readU64(),
poolQuoteTokenReserves: reader.readU64(),
baseAmountIn: reader.readU64(),
quoteAmountIn: reader.readU64(),
lpMintSupply: reader.readU64(),
pool: reader.readPubkey(),
user: reader.readPubkey(),
userBaseTokenAccount: reader.readPubkey(),
userQuoteTokenAccount: reader.readPubkey(),
userPoolTokenAccount: reader.readPubkey(),
};
}
decodeCreateEvent(data) {
const reader = new binary_reader_1.BinaryReader(data);
return {
timestamp: Number(reader.readI64()),
index: reader.readU16(),
creator: reader.readPubkey(),
baseMint: reader.readPubkey(),
quoteMint: reader.readPubkey(),
baseMintDecimals: reader.readU8(),
quoteMintDecimals: reader.readU8(),
baseAmountIn: reader.readU64(),
quoteAmountIn: reader.readU64(),
poolBaseAmount: reader.readU64(),
poolQuotAmount: reader.readU64(),
minimumLiquidity: reader.readU64(),
initialLiquidity: reader.readU64(),
lpTokenAmountOut: reader.readU64(),
poolBump: reader.readU8(),
pool: reader.readPubkey(),
lpMint: reader.readPubkey(),
userBaseTokenAccount: reader.readPubkey(),
userQuoteTokenAccount: reader.readPubkey(),
};
}
decodeRemoveLiquidity(data) {
const reader = new binary_reader_1.BinaryReader(data);
return {
timestamp: Number(reader.readI64()),
lpTokenAmountIn: reader.readU64(),
minBaseAmountOut: reader.readU64(),
minQuoteAmountOut: reader.readU64(),
userBaseTokenReserves: reader.readU64(),
userQuoteTokenReserves: reader.readU64(),
poolBaseTokenReserves: reader.readU64(),
poolQuoteTokenReserves: reader.readU64(),
baseAmountOut: reader.readU64(),
quoteAmountOut: reader.readU64(),
lpMintSupply: reader.readU64(),
pool: reader.readPubkey(),
user: reader.readPubkey(),
userBaseTokenAccount: reader.readPubkey(),
userQuoteTokenAccount: reader.readPubkey(),
userPoolTokenAccount: reader.readPubkey(),
};
}
}
exports.PumpswapEventParser = PumpswapEventParser;
//# sourceMappingURL=parser-pumpswap-event.js.map