solana-dex-parser
Version:
Solana Dex Transaction Parser
217 lines • 10.1 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.processCompiledExtraAction = exports.isCompiledExtraAction = exports.processCompiledTransferCheck = exports.processCompiledNatvieTransfer = exports.processCompiledTransfer = exports.isCompiledTransferCheck = exports.isCompiledNativeTransfer = exports.isCompiledTransfer = void 0;
const constants_1 = require("./constants");
const types_1 = require("./types");
const utils_1 = require("./utils");
const isCompiledTransfer = (instruction) => {
const data = (0, utils_1.getInstructionData)(instruction);
return instruction.programId == constants_1.TOKEN_PROGRAM_ID && data[0] == constants_1.SPL_TOKEN_INSTRUCTION_TYPES.Transfer;
};
exports.isCompiledTransfer = isCompiledTransfer;
const isCompiledNativeTransfer = (instruction) => {
const data = (0, utils_1.getInstructionData)(instruction);
return instruction.programId == constants_1.TOKENS.NATIVE && data[0] == constants_1.SYSTEM_INSTRUCTION_TYPES.Transfer;
};
exports.isCompiledNativeTransfer = isCompiledNativeTransfer;
const isCompiledTransferCheck = (instruction) => {
const data = (0, utils_1.getInstructionData)(instruction);
return ((instruction.programId == constants_1.TOKEN_PROGRAM_ID || instruction.programId == constants_1.TOKEN_2022_PROGRAM_ID) &&
data[0] == constants_1.SPL_TOKEN_INSTRUCTION_TYPES.TransferChecked);
};
exports.isCompiledTransferCheck = isCompiledTransferCheck;
const processCompiledTransfer = (instruction, idx, adapter) => {
const accounts = instruction.accounts;
const data = (0, utils_1.getInstructionData)(instruction);
const amount = data.readBigUInt64LE(1);
let authority;
const [source, destination] = [accounts[0], accounts[1]]; // source, destination,amount, authority
if (data[0] == constants_1.SPL_TOKEN_INSTRUCTION_TYPES.Transfer)
authority = accounts[2];
const [token1, token2] = [adapter.splTokenMap.get(destination)?.mint, adapter.splTokenMap.get(source)?.mint];
if (!token1 && !token2)
return null;
let mint = (0, utils_1.getTranferTokenMint)(token1, token2);
if (!mint && instruction.programId == constants_1.TOKENS.NATIVE)
mint = constants_1.TOKENS.SOL;
if (!mint)
return null;
const decimals = adapter.splDecimalsMap.get(mint);
if (typeof decimals === 'undefined')
return null;
const [sourceBalance, destinationBalance] = adapter.getTokenAccountBalance([source, destination]);
const [sourcePreBalance, destinationPreBalance] = adapter.getTokenAccountPreBalance([source, destination]);
return {
type: 'transfer',
programId: instruction.programId,
info: {
authority: authority,
destination: destination || '',
destinationOwner: adapter.getTokenAccountOwner(destination || ''),
mint,
source: source || '',
tokenAmount: {
amount: amount.toString(),
decimals,
uiAmount: (0, types_1.convertToUiAmount)(amount, decimals),
},
sourceBalance: sourceBalance,
sourcePreBalance: sourcePreBalance,
destinationBalance: destinationBalance,
destinationPreBalance: destinationPreBalance,
},
idx: idx,
timestamp: adapter.blockTime,
signature: adapter.signature,
};
};
exports.processCompiledTransfer = processCompiledTransfer;
const processCompiledNatvieTransfer = (instruction, idx, adapter) => {
const accounts = instruction.accounts;
const data = (0, utils_1.getInstructionData)(instruction);
const amount = data.readBigUInt64LE(4);
const [source, destination] = [accounts[0], accounts[1]]; // source,amount,destination
const decimals = 9;
const [sourceBalance, destinationBalance] = adapter.getAccountBalance([source, destination]);
const [sourcePreBalance, destinationPreBalance] = adapter.getAccountPreBalance([source, destination]);
return {
type: 'transfer',
programId: instruction.programId,
info: {
destination: destination || '',
destinationOwner: adapter.getTokenAccountOwner(destination || ''),
mint: constants_1.TOKENS.SOL,
source: source || '',
tokenAmount: {
amount: amount.toString(),
decimals,
uiAmount: (0, types_1.convertToUiAmount)(amount, decimals),
},
sourceBalance: sourceBalance,
sourcePreBalance: sourcePreBalance,
destinationBalance: destinationBalance,
destinationPreBalance: destinationPreBalance,
},
idx: idx,
timestamp: adapter.blockTime,
signature: adapter.signature,
};
};
exports.processCompiledNatvieTransfer = processCompiledNatvieTransfer;
const processCompiledTransferCheck = (instruction, idx, adapter) => {
const accounts = instruction.accounts;
if (!accounts)
null;
const [source, mint, destination, authority] = [accounts[0], accounts[1], accounts[2], accounts[3]]; // source, mint, destination, authority,amount,decimals
const data = (0, utils_1.getInstructionData)(instruction);
const amount = data.readBigUInt64LE(1);
const decimals = adapter.splDecimalsMap.get(mint) || data.readUint8(9);
const [sourceBalance, destinationBalance] = adapter.getTokenAccountBalance([source, destination]);
const [sourcePreBalance, destinationPreBalance] = adapter.getTokenAccountPreBalance([source, destination]);
return {
type: 'transferChecked',
programId: instruction.programId,
info: {
authority: authority,
destination: destination || '',
destinationOwner: adapter.getTokenAccountOwner(destination || ''),
mint,
source: source || '',
tokenAmount: {
amount: amount.toString(),
decimals,
uiAmount: (0, types_1.convertToUiAmount)(amount, decimals),
},
sourceBalance: sourceBalance,
sourcePreBalance: sourcePreBalance,
destinationBalance: destinationBalance,
destinationPreBalance: destinationPreBalance,
},
idx: idx,
timestamp: adapter.blockTime,
signature: adapter.signature,
};
};
exports.processCompiledTransferCheck = processCompiledTransferCheck;
const isCompiledExtraAction = (instruction, type) => {
if (instruction.programId != constants_1.TOKEN_PROGRAM_ID && instruction.programId != constants_1.TOKEN_2022_PROGRAM_ID)
return false;
const data = (0, utils_1.getInstructionData)(instruction);
const instructionType = data[0];
const typeMap = {
mintTo: constants_1.SPL_TOKEN_INSTRUCTION_TYPES.MintTo,
burn: constants_1.SPL_TOKEN_INSTRUCTION_TYPES.Burn,
mintToChecked: constants_1.SPL_TOKEN_INSTRUCTION_TYPES.MintToChecked,
burnChecked: constants_1.SPL_TOKEN_INSTRUCTION_TYPES.BurnChecked,
};
return typeMap[type] === instructionType;
};
exports.isCompiledExtraAction = isCompiledExtraAction;
const processCompiledExtraAction = (instruction, idx, adapter, type) => {
const accounts = instruction.accounts;
if (!accounts)
return null;
const data = (0, utils_1.getInstructionData)(instruction);
let source, destination, authority, mint, decimals;
const amount = data.readBigUInt64LE(1);
switch (data[0]) {
case constants_1.SPL_TOKEN_INSTRUCTION_TYPES.MintTo:
if (accounts.length < 2)
return null;
[mint, destination, authority] = [accounts[0], accounts[1], accounts[2]]; // mint, destination, authority, amount
break;
case constants_1.SPL_TOKEN_INSTRUCTION_TYPES.MintToChecked:
if (accounts.length < 3)
return null;
[mint, destination, authority] = [accounts[0], accounts[1], accounts[2]]; // mint, destination, authority, amount,decimals
decimals = data.readUint8(9);
break;
case constants_1.SPL_TOKEN_INSTRUCTION_TYPES.Burn:
if (accounts.length < 2)
return null;
[source, mint, authority] = [accounts[0], accounts[1], accounts[2]]; // account, mint, authority, amount
break;
case constants_1.SPL_TOKEN_INSTRUCTION_TYPES.BurnChecked:
if (accounts.length < 3)
return null;
[source, mint, authority] = [accounts[0], accounts[1], accounts[2]]; // account, mint, authority, amount,decimals
decimals = data.readUint8(9);
break;
}
mint = mint || (destination && adapter.splTokenMap.get(destination)?.mint);
if (!mint)
return null;
decimals = decimals || adapter.splDecimalsMap.get(mint);
if (!decimals)
return null;
const [sourceBalance, destinationBalance] = adapter.getTokenAccountBalance([source || '', destination || '']);
const [sourcePreBalance, destinationPreBalance] = adapter.getTokenAccountPreBalance([
source || '',
destination || '',
]);
return {
type: type,
programId: instruction.programId,
info: {
authority: authority,
destination: destination || '',
destinationOwner: adapter.getTokenAccountOwner(destination || ''),
mint,
source: source || '',
tokenAmount: {
amount: amount.toString(),
decimals,
uiAmount: (0, types_1.convertToUiAmount)(amount, decimals),
},
sourceBalance: sourceBalance,
sourcePreBalance: sourcePreBalance,
destinationBalance: destinationBalance,
destinationPreBalance: destinationPreBalance,
},
idx: idx,
timestamp: adapter.blockTime,
signature: adapter.signature,
};
};
exports.processCompiledExtraAction = processCompiledExtraAction;
//# sourceMappingURL=transfer-compiled-utils.js.map
;