@kamino-finance/klend-sdk
Version:
Typescript SDK for interacting with the Kamino Lending (klend) protocol
234 lines • 9.66 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.updateReferrerStateAndShortUrl = exports.createReferrerStateAndShortUrl = exports.initAllReferrerTokenStates = void 0;
exports.isShortUrlAvailable = isShortUrlAvailable;
exports.getReferrerShortUrl = getReferrerShortUrl;
exports.getReferrerForShortUrl = getReferrerForShortUrl;
exports.getUserMetadatasByReferrer = getUserMetadatasByReferrer;
exports.getAllUserMetadatas = getAllUserMetadatas;
exports.getTotalUsersReferred = getTotalUsersReferred;
exports.getReferralsRanking = getReferralsRanking;
exports.getUserReferralRanking = getUserReferralRanking;
const web3_js_1 = require("@solana/web3.js");
const utils_1 = require("../utils");
const instructions_1 = require("./instructions");
const lib_1 = require("../lib");
const decimal_js_1 = __importDefault(require("decimal.js"));
/**
* Initialize all referrer token states for a given referrer
* @param referrer
* @param kaminoMarket
*/
const initAllReferrerTokenStates = async ({ referrer, kaminoMarket, }) => {
const ixns = await (0, instructions_1.getInitAllReferrerTokenStateIxns)({ referrer: referrer.publicKey, kaminoMarket });
const tx = await (0, utils_1.buildVersionedTransaction)(kaminoMarket.getConnection(), referrer.publicKey, ixns);
console.log('Init Referral Token States');
return await (0, utils_1.buildAndSendTxnWithLogs)(kaminoMarket.getConnection(), tx, referrer, [referrer]);
};
exports.initAllReferrerTokenStates = initAllReferrerTokenStates;
/**
* Initialize referrer state and short url
* @param connection
* @param referrer
* @param shortUrl
*/
const createReferrerStateAndShortUrl = async ({ connection, referrer, shortUrl, programId = lib_1.PROGRAM_ID, }) => {
const ixn = (0, instructions_1.getInitReferrerStateAndShortUrlIxns)({ referrer: referrer.publicKey, shortUrl, programId });
const tx = await (0, utils_1.buildVersionedTransaction)(connection, referrer.publicKey, [ixn]);
console.log('Init ReferrerState for referrer ' + referrer.publicKey.toBase58() + ' and shortUrl ' + shortUrl);
return await (0, utils_1.buildAndSendTxnWithLogs)(connection, tx, referrer, [referrer]);
};
exports.createReferrerStateAndShortUrl = createReferrerStateAndShortUrl;
/**
* Initialize referrer state and short url
* @param connection
* @param referrer
* @param newShortUrl
*/
const updateReferrerStateAndShortUrl = async ({ connection, referrer, newShortUrl, programId = lib_1.PROGRAM_ID, }) => {
const deleteIxn = await (0, instructions_1.getDeleteReferrerStateAndShortUrlIxns)({
referrer: referrer.publicKey,
connection,
programId,
});
const initIxn = (0, instructions_1.getInitReferrerStateAndShortUrlIxns)({
referrer: referrer.publicKey,
shortUrl: newShortUrl,
programId,
});
const tx = await (0, utils_1.buildVersionedTransaction)(connection, referrer.publicKey, [deleteIxn, initIxn]);
console.log('Update ReferrerState for referrer ' + referrer.publicKey.toBase58() + ' and shortUrl ' + newShortUrl);
return await (0, utils_1.buildAndSendTxnWithLogs)(connection, tx, referrer, [referrer]);
};
exports.updateReferrerStateAndShortUrl = updateReferrerStateAndShortUrl;
/**
* Check if short URL available - also checks if short URL is valid (ascii-alphanumeric plus '_' '-', max 32 chars)
* @param connection
* @param shortUrl
* @param programId
*/
async function isShortUrlAvailable(connection, shortUrl, programId = lib_1.PROGRAM_ID) {
if (shortUrl.length > 32) {
return false;
}
if (!/^[a-zA-Z0-9-_]+$/.test(shortUrl)) {
return false;
}
const [shortUrlAddress] = (0, utils_1.shortUrlPda)(shortUrl, programId);
const info = await connection.getAccountInfo(shortUrlAddress);
return info === null;
}
/**
* Get referrer short URL address and shortUrl
* @param connection
* @param referrer
* @param programId
*/
async function getReferrerShortUrl(connection, referrer, programId = lib_1.PROGRAM_ID) {
const [referrerStateAddress] = (0, utils_1.referrerStatePda)(referrer, programId);
const referrerState = await lib_1.ReferrerState.fetch(connection, referrerStateAddress, programId);
const shortUrlState = await lib_1.ShortUrl.fetch(connection, referrerState.shortUrl, programId);
const shortUrlAddress = referrerState ? referrerState.shortUrl : null;
const shortUrl = shortUrlState ? shortUrlState.shortUrl : null;
return [shortUrlAddress, shortUrl];
}
/**
* Get referrer for a given Short URL
* @param connection
* @param shortUrl
* @param programId
*/
async function getReferrerForShortUrl(connection, shortUrl, programId = lib_1.PROGRAM_ID) {
const [shortUrlAddress] = (0, utils_1.shortUrlPda)(shortUrl, programId);
const shortUrlState = await lib_1.ShortUrl.fetch(connection, shortUrlAddress, programId);
return shortUrlState.referrer;
}
/**
* Get referrer all UserMetadata user accounts linked to a given referrer
* @param connection
* @param referrer
* @param programId
*/
async function getUserMetadatasByReferrer(connection, referrer, programId = lib_1.PROGRAM_ID) {
const userMetadatas = await connection.getProgramAccounts(programId, {
filters: [
{
dataSize: lib_1.UserMetadata.layout.span + 8,
},
{
memcmp: {
offset: 8,
bytes: referrer.toBase58(),
},
},
],
});
return userMetadatas.map((userMetadata) => {
if (userMetadata.account === null) {
throw new Error('Invalid account');
}
if (!userMetadata.account.owner.equals(programId)) {
throw new Error("account doesn't belong to this program");
}
const userMetadataAccount = lib_1.UserMetadata.decode(userMetadata.account.data);
if (!userMetadataAccount) {
throw Error('Could not parse obligation.');
}
return userMetadataAccount;
});
}
/**
* Get referrer all UserMetadata user accounts
* @param connection
* @param referrer
* @param programId
*/
async function getAllUserMetadatas(connection, programId = lib_1.PROGRAM_ID) {
const userMetadatas = await connection.getProgramAccounts(programId, {
filters: [
{
dataSize: lib_1.UserMetadata.layout.span + 8,
},
],
});
return userMetadatas.map((userMetadata) => {
if (userMetadata.account === null) {
throw new Error('Invalid account');
}
if (!userMetadata.account.owner.equals(programId)) {
throw new Error("account doesn't belong to this program");
}
const userMetadataAccount = lib_1.UserMetadata.decode(userMetadata.account.data);
if (!userMetadataAccount) {
throw Error('Could not parse obligation.');
}
return userMetadataAccount;
});
}
/**
* Get referrer all UserMetadata user accounts linked to a given referrer
* @param connection
* @param referrer
* @param programId
*/
async function getTotalUsersReferred(connection, referrer, programId = lib_1.PROGRAM_ID) {
const userMetadatas = await getUserMetadatasByReferrer(connection, referrer, programId);
return userMetadatas.length;
}
/**
* Get ReferralRank array of all referrers ordered by how much they've earned in USD
* @param connection
* @param kaminoMarket
*/
async function getReferralsRanking(connection, kaminoMarket) {
const referrersUsersReferred = new utils_1.PublicKeyMap();
// counting users referred for each referrer
const userMetadatas = await getAllUserMetadatas(connection, kaminoMarket.programId);
for (const userMetadata of userMetadatas) {
const referrer = userMetadata.referrer;
const usersReferred = referrersUsersReferred.get(referrer);
if (usersReferred) {
referrersUsersReferred.set(referrer, usersReferred + 1);
}
else {
referrersUsersReferred.set(referrer, 1);
}
}
const referralsRankArray = [];
for (const referrer of referrersUsersReferred.keys()) {
const referrerTokenStates = await kaminoMarket.getAllReferrerFeesCumulative(referrer);
let totalEarningsUsd = new decimal_js_1.default(0);
// calculating earnings for each referrer
for (const reserve of kaminoMarket.reserves.values()) {
totalEarningsUsd = totalEarningsUsd.add(referrerTokenStates.get(reserve.getLiquidityMint()).mul(reserve.getOracleMarketPrice()));
}
referralsRankArray.push({
referrer: new web3_js_1.PublicKey(referrer),
totalUsersReferred: referrersUsersReferred.get(referrer),
totalEarningsUsd: totalEarningsUsd,
});
}
referralsRankArray.sort((a, b) => {
return b.totalEarningsUsd.comparedTo(a.totalEarningsUsd);
});
return referralsRankArray;
}
/**
* Get ReferralRank array of all referrers ordered by how much they've earned in USD
* @param connection
* @param user
* @param kaminoMarket
*/
async function getUserReferralRanking(connection, user, kaminoMarket) {
const referralsRanking = await getReferralsRanking(connection, kaminoMarket);
for (let index = 0; index < referralsRanking.length; index++) {
if (user.equals(referralsRanking[index].referrer)) {
return index + 1;
}
}
return undefined;
}
//# sourceMappingURL=operations.js.map
;