hadeswap-sdk-public
Version:
HadeSwap SDK for interacting with protocol
192 lines (191 loc) • 9.88 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTradeTransactionsFromSignatures = exports.getActivity = void 0;
const types_1 = require("../types");
const getActivity = ({ programId,
// fromThisSignature,
untilThisSignature, connection, }) => __awaiter(void 0, void 0, void 0, function* () {
const LIMIT = 100;
let allSignatures = [];
let currentLastSignature = (yield connection.getConfirmedSignaturesForAddress2(programId, {
limit: 1,
}, 'confirmed'))[0].signature;
let newSignatureInfosLatestToPast = yield connection.getConfirmedSignaturesForAddress2(programId, {
limit: LIMIT,
before: currentLastSignature,
until: untilThisSignature,
}, 'confirmed');
currentLastSignature = newSignatureInfosLatestToPast[newSignatureInfosLatestToPast.length - 1].signature;
allSignatures = [...allSignatures, ...newSignatureInfosLatestToPast];
while (newSignatureInfosLatestToPast.length === LIMIT) {
newSignatureInfosLatestToPast = yield connection.getConfirmedSignaturesForAddress2(programId, {
limit: LIMIT,
before: currentLastSignature,
until: untilThisSignature,
}, 'confirmed');
currentLastSignature = newSignatureInfosLatestToPast[newSignatureInfosLatestToPast.length - 1].signature;
allSignatures = [...allSignatures, ...newSignatureInfosLatestToPast];
}
const tradeTransactions = yield (0, exports.getTradeTransactionsFromSignatures)({
signatures: allSignatures,
connection,
});
let allTradeActivities = [];
// console.log('tradeTransactions: ', tradeTransactions.length);
for (let tradeTxn of tradeTransactions) {
const tradeActivities = yield parseTransactionInfoToTradeActivities({ tradeTxn, connection });
allTradeActivities = [...allTradeActivities, ...tradeActivities];
}
return allTradeActivities;
});
exports.getActivity = getActivity;
const getTradeTransactionsFromSignatures = ({ signatures, connection, }) => __awaiter(void 0, void 0, void 0, function* () {
const tradeTransactions = [];
for (let signatureInfo of signatures) {
const currentTransactionInfo = yield connection.getParsedTransaction(signatureInfo.signature, 'confirmed');
// console.log('signatureInfo.signature: ', signatureInfo.signature);
// console.log(
// ' currentTransactionInfo?.transaction.signatures: ',
// currentTransactionInfo?.transaction.signatures.length,
// );
// console.log(
// ' currentTransactionInfo?.meta?.innerInstructions?.length: ',
// currentTransactionInfo?.meta?.innerInstructions?.length,
// );
// console.log(
// ' currentTransactionInfo?.transaction.message.instructions.length: ',
// currentTransactionInfo?.transaction.message.instructions.length,
// );
if (!currentTransactionInfo || !isTradeTransactionInfo(currentTransactionInfo))
continue;
tradeTransactions.push(currentTransactionInfo);
}
return tradeTransactions;
});
exports.getTradeTransactionsFromSignatures = getTradeTransactionsFromSignatures;
const isTradeTransactionInfo = (currentTransactionInfo) => {
var _a, _b;
return ((_b = (_a = currentTransactionInfo.meta) === null || _a === void 0 ? void 0 : _a.logMessages) === null || _b === void 0 ? void 0 : _b.find(isTradeInstructionLog)) !== undefined;
};
const parseTransactionInfoToTradeActivities = ({ tradeTxn, connection, }) => __awaiter(void 0, void 0, void 0, function* () {
var _a, _b, _c;
// console.log(currentTransactionInfo);
const tradeLogs = (_b = (_a = tradeTxn.meta) === null || _a === void 0 ? void 0 : _a.logMessages) === null || _b === void 0 ? void 0 : _b.reduce((tradeLogs, log) => (isTradeInstructionLog(log) ? [...tradeLogs, log] : tradeLogs), []);
const innerInstructions = (_c = tradeTxn.meta) === null || _c === void 0 ? void 0 : _c.innerInstructions;
// console.log('innerInstructions: ', innerInstructions.length);
const programInstructions = tradeTxn.transaction.message.instructions;
// console.log('programInstructions: ', innerInstructions.length);
const tradeActivities = [];
for (let i = 0; i < innerInstructions.length; i++) {
const currentInnerInstruction = innerInstructions[i];
const currentProgramInstruction = programInstructions[i];
const currentLog = tradeLogs[i];
const currentSignature = tradeTxn.transaction.signatures[0];
const blockTime = tradeTxn.blockTime;
const parsedTradeActivity = yield TRADE_TRANSACTION_PARSERS[currentLog]({
innerInstruction: currentInnerInstruction,
programInstruction: currentProgramInstruction,
signature: currentSignature,
blockTime,
connection,
});
if (!parsedTradeActivity)
continue;
tradeActivities.push(parsedTradeActivity);
}
return tradeActivities;
});
const isTradeInstructionLog = (log) => log === TradeInstruction.BuyNftFromPair ||
log === TradeInstruction.SellNftToTokenToNftPair ||
log === TradeInstruction.SellNftToLiquidityPair;
var TradeInstruction;
(function (TradeInstruction) {
TradeInstruction["BuyNftFromPair"] = "Program log: Instruction: BuyNftFromPair";
TradeInstruction["SellNftToTokenToNftPair"] = "Program log: Instruction: SellNftToTokenToNftPair";
TradeInstruction["SellNftToLiquidityPair"] = "Program log: Instruction: SellNftToLiquidityPair";
})(TradeInstruction || (TradeInstruction = {}));
const TRADE_TRANSACTION_PARSERS = {
[TradeInstruction.BuyNftFromPair]: ({ innerInstruction, programInstruction, signature, blockTime, connection, }) => __awaiter(void 0, void 0, void 0, function* () {
const solAmount = getTransferAmountFromInnerInstructions(innerInstruction);
const orderType = types_1.OrderType.Buy;
const pair = programInstruction.accounts[1];
const userTaker = programInstruction.accounts[2];
const userMaker = programInstruction.accounts[9];
const nftMint = programInstruction.accounts[6];
return {
timestamp: blockTime,
signature: signature,
pair: pair.toBase58(),
orderType: orderType,
pairType: null,
nftMint: nftMint.toBase58(),
solAmount: solAmount,
userMaker: userMaker.toBase58(),
userTaker: userTaker.toBase58(),
};
}),
[TradeInstruction.SellNftToTokenToNftPair]: ({ innerInstruction, programInstruction, signature, blockTime, connection, }) => __awaiter(void 0, void 0, void 0, function* () {
const solAmount = getTransferAmountFromInnerInstructions(innerInstruction);
const orderType = types_1.OrderType.Sell;
const pair = programInstruction.accounts[0];
const userTaker = programInstruction.accounts[2];
const userMaker = programInstruction.accounts[7];
const nftMint = programInstruction.accounts[3];
return {
timestamp: blockTime,
signature: signature,
pair: pair.toBase58(),
orderType: orderType,
pairType: types_1.PairType.TokenForNFT,
nftMint: nftMint.toBase58(),
solAmount: solAmount,
userMaker: userMaker.toBase58(),
userTaker: userTaker.toBase58(),
};
}),
[TradeInstruction.SellNftToLiquidityPair]: ({ innerInstruction, programInstruction, signature, blockTime, connection, }) => __awaiter(void 0, void 0, void 0, function* () {
const solAmount = getTransferAmountFromInnerInstructions(innerInstruction);
const orderType = types_1.OrderType.Sell;
const pair = programInstruction.accounts[1];
const userTaker = programInstruction.accounts[3];
// const userMaker = programInstruction.accounts[7];
const nftMint = programInstruction.accounts[4];
return {
timestamp: blockTime,
signature: signature,
pair: pair.toBase58(),
orderType: orderType,
pairType: types_1.PairType.LiquidityProvision,
nftMint: nftMint.toBase58(),
solAmount: solAmount,
userMaker: null,
userTaker: userTaker.toBase58(),
};
}),
};
const getTransferAmountFromInnerInstructions = (innerInstruction) => {
return innerInstruction.instructions
.filter((instruction) => instruction.program === InnerProgramTypes.System)
.filter((instruction) => instruction.parsed.type === InnerInstructionTypes.Transfer)
.reduce((amount, instruction) => {
return amount + instruction.parsed.info.lamports;
}, 0);
};
var InnerProgramTypes;
(function (InnerProgramTypes) {
InnerProgramTypes["System"] = "system";
InnerProgramTypes["SplToken"] = "spl-token";
})(InnerProgramTypes || (InnerProgramTypes = {}));
var InnerInstructionTypes;
(function (InnerInstructionTypes) {
InnerInstructionTypes["Transfer"] = "transfer";
})(InnerInstructionTypes || (InnerInstructionTypes = {}));