UNPKG

@kamino-finance/klend-sdk

Version:

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

100 lines 5.8 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.FARMS_GLOBAL_CONFIG_MAINNET = void 0; exports.getFarmStakeIxs = getFarmStakeIxs; exports.getFarmUserStatePDA = getFarmUserStatePDA; exports.getFarmUnstakeIx = getFarmUnstakeIx; exports.getFarmWithdrawUnstakedDepositIx = getFarmWithdrawUnstakedDepositIx; exports.getFarmUnstakeAndWithdrawIxs = getFarmUnstakeAndWithdrawIxs; exports.getSetupFarmIxsWithFarm = getSetupFarmIxsWithFarm; exports.getUserSharesInFarm = getUserSharesInFarm; exports.setVaultIdForFarmIx = setVaultIdForFarmIx; exports.getSharesInFarmUserPosition = getSharesInFarmUserPosition; const anchor_1 = require("@coral-xyz/anchor"); const farms_sdk_1 = require("@kamino-finance/farms-sdk"); const web3_js_1 = require("@solana/web3.js"); const decimal_1 = __importDefault(require("decimal.js/decimal")); exports.FARMS_GLOBAL_CONFIG_MAINNET = new web3_js_1.PublicKey('6UodrBjL2ZreDy7QdR4YV1oxqMBjVYSEyrFpctqqwGwL'); async function getFarmStakeIxs(connection, user, lamportsToStake, farmAddress, fetchedFarmState) { const farmState = fetchedFarmState ? fetchedFarmState : await farms_sdk_1.FarmState.fetch(connection, farmAddress); if (!farmState) { throw new Error(`Farm state not found for ${farmAddress}`); } const farmClient = new farms_sdk_1.Farms(connection); const scopePricesArg = farmState.scopePrices.equals(web3_js_1.PublicKey.default) ? farmClient.getProgramID() : farmState.scopePrices; const stakeIxs = []; const userState = (0, farms_sdk_1.getUserStatePDA)(farmClient.getProgramID(), farmAddress, user); const userStateExists = await connection.getAccountInfo(userState); if (!userStateExists) { const createUserIx = farmClient.createNewUserIx(user, farmAddress); stakeIxs.push(createUserIx); } const stakeIx = farmClient.stakeIx(user, farmAddress, lamportsToStake, farmState.token.mint, scopePricesArg); stakeIxs.push(stakeIx); return stakeIxs; } async function getFarmUserStatePDA(connection, user, farm) { const farmClient = new farms_sdk_1.Farms(connection); return (0, farms_sdk_1.getUserStatePDA)(farmClient.getProgramID(), farm, user); } async function getFarmUnstakeIx(connection, user, lamportsToUnstake, farmAddress, fetchedFarmState) { const farmState = fetchedFarmState ? fetchedFarmState : await farms_sdk_1.FarmState.fetch(connection, farmAddress); if (!farmState) { throw new Error(`Farm state not found for ${farmAddress}`); } const farmClient = new farms_sdk_1.Farms(connection); const scopePricesArg = farmState.scopePrices.equals(web3_js_1.PublicKey.default) ? farmClient.getProgramID() : farmState.scopePrices; const userState = (0, farms_sdk_1.getUserStatePDA)(farmClient.getProgramID(), farmAddress, user); if (!userState) { throw new Error(`User state not found for ${user}`); } const scaledLamportsToUnstake = new anchor_1.BN(lamportsToUnstake.floor().toString()).mul(new anchor_1.BN(farms_sdk_1.WAD.toString())); return farmClient.unstakeIx(user, farmAddress, scaledLamportsToUnstake.toString(), scopePricesArg); } // withdrawing from a farm is a 2 step operation: first we unstake the tokens from the farm, then we withdraw them async function getFarmWithdrawUnstakedDepositIx(connection, user, farm, stakeTokenMint) { const farmClient = new farms_sdk_1.Farms(connection); const userState = (0, farms_sdk_1.getUserStatePDA)(farmClient.getProgramID(), farm, user); return farmClient.withdrawUnstakedDepositIx(user, userState, farm, stakeTokenMint); } async function getFarmUnstakeAndWithdrawIxs(connection, user, lamportsToUnstake, farmAddress, fetchedFarmState) { const farmState = fetchedFarmState ? fetchedFarmState : await farms_sdk_1.FarmState.fetch(connection, farmAddress); if (!farmState) { throw new Error(`Farm state not found for ${farmAddress}`); } const unstakeIx = await getFarmUnstakeIx(connection, user, lamportsToUnstake, farmAddress, farmState); const withdrawIx = await getFarmWithdrawUnstakedDepositIx(connection, user, farmAddress, farmState.token.mint); return { unstakeIx, withdrawIx }; } async function getSetupFarmIxsWithFarm(connection, farmAdmin, farmTokenMint) { const farmClient = new farms_sdk_1.Farms(connection); const farm = new web3_js_1.Keypair(); const ixs = await farmClient.createFarmIx(farmAdmin.publicKey, farm, exports.FARMS_GLOBAL_CONFIG_MAINNET, farmTokenMint); return { farm, setupFarmIxs: ixs }; } async function getUserSharesInFarm(connection, user, farm, farmTokenDecimals) { const farmClient = new farms_sdk_1.Farms(connection); const userStatePDA = (0, farms_sdk_1.getUserStatePDA)(farmClient.getProgramID(), farm, user); // if the user state does not exist, return 0 const userState = await connection.getAccountInfo(userStatePDA); if (!userState) { return new decimal_1.default(0); } // if the user state exists, return the user shares return farmClient.getUserTokensInUndelegatedFarm(user, farm, farmTokenDecimals); } async function setVaultIdForFarmIx(connection, farmAdmin, farm, vault) { const farmClient = new farms_sdk_1.Farms(connection); return farmClient.updateFarmConfigIx(farmAdmin, farm, web3_js_1.PublicKey.default, new farms_sdk_1.FarmConfigOption.UpdateVaultId(), vault); } function getSharesInFarmUserPosition(userState, tokenDecimals) { return (0, farms_sdk_1.lamportsToCollDecimal)(new decimal_1.default((0, farms_sdk_1.scaleDownWads)(userState.activeStakeScaled)), tokenDecimals); } //# sourceMappingURL=farm_utils.js.map