solana-dex-parser
Version:
Solana Dex Transaction Parser
106 lines • 4.08 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getFinalSwap = exports.getPubkeyString = exports.getTranferTokenMint = exports.getAMMs = exports.getTradeType = exports.absBigInt = exports.hexToUint8Array = exports.getProgramName = exports.getInstructionData = void 0;
const bs58_1 = __importDefault(require("bs58"));
const constants_1 = require("./constants");
const web3_js_1 = require("@solana/web3.js");
/**
* Get instruction data
*/
const getInstructionData = (instruction) => {
if ('data' in instruction) {
if (typeof instruction.data === 'string')
return Buffer.from(bs58_1.default.decode(instruction.data)); // compatible with both bs58 v4.0.1 and v6.0.0
if (instruction.data instanceof Uint8Array)
return Buffer.from(instruction.data);
}
return instruction.data;
};
exports.getInstructionData = getInstructionData;
/**
* Get the name of a program by its ID
* @param programId - The program ID to look up
* @returns The name of the program or 'Unknown' if not found
*/
const getProgramName = (programId) => Object.values(constants_1.DEX_PROGRAMS).find((dex) => dex.id === programId)?.name || 'Unknown';
exports.getProgramName = getProgramName;
/**
* Convert a hex string to Uint8Array
* @param hex - Hex string to convert
* @returns Uint8Array representation of the hex string
*/
const hexToUint8Array = (hex) => new Uint8Array(hex.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
exports.hexToUint8Array = hexToUint8Array;
const absBigInt = (value) => {
return value < 0n ? -value : value;
};
exports.absBigInt = absBigInt;
const getTradeType = (inMint, outMint) => {
if (inMint == constants_1.TOKENS.SOL)
return 'BUY';
if (outMint == constants_1.TOKENS.SOL)
return 'SELL';
if (Object.values(constants_1.TOKENS).includes(inMint))
return 'BUY';
return 'SELL';
};
exports.getTradeType = getTradeType;
const getAMMs = (transferActionKeys) => {
const amms = Object.values(constants_1.DEX_PROGRAMS).filter((it) => it.tags.includes('amm'));
return transferActionKeys
.map((it) => {
const item = Object.values(amms).find((amm) => it.split(':')[0] == amm.id);
if (item)
return item.name;
return null;
})
.filter((it) => it != null);
};
exports.getAMMs = getAMMs;
const getTranferTokenMint = (token1, token2) => {
if (token1 == token2)
return token1;
if (token1 && token1 != constants_1.TOKENS.SOL)
return token1;
if (token2 && token2 != constants_1.TOKENS.SOL)
return token2;
return token1 || token2;
};
exports.getTranferTokenMint = getTranferTokenMint;
const getPubkeyString = (value) => {
if (typeof value === 'string')
return value;
if (value instanceof web3_js_1.PublicKey)
return value.toBase58();
if ('type' in value && value.type == 'Buffer')
return bs58_1.default.encode(value.data);
return value;
};
exports.getPubkeyString = getPubkeyString;
const getFinalSwap = (trades, dexInfo) => {
if (trades.length == 1)
return trades[0];
if (trades.length >= 2) {
const inputTrade = trades[0];
const outputTrade = trades[trades.length - 1];
return {
type: (0, exports.getTradeType)(inputTrade.inputToken.mint, outputTrade.outputToken.mint),
inputToken: inputTrade.inputToken,
outputToken: outputTrade.outputToken,
user: inputTrade.user,
programId: inputTrade.programId,
amm: dexInfo?.amm || inputTrade.amm,
route: dexInfo?.route || inputTrade.route || '',
slot: inputTrade.slot,
timestamp: inputTrade.timestamp,
signature: inputTrade.signature,
idx: inputTrade.idx,
};
}
return null;
};
exports.getFinalSwap = getFinalSwap;
//# sourceMappingURL=utils.js.map