@kamino-finance/klend-sdk
Version:
Typescript SDK for interacting with the Kamino Lending (klend) protocol
100 lines • 5.8 kB
JavaScript
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
;