UNPKG

@kamino-finance/klend-sdk

Version:

Typescript SDK for interacting with the Kamino Lending (klend) protocol

234 lines 9.66 kB
"use strict"; 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