@kamino-finance/farms-sdk
Version:
118 lines • 5.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.initAllKlendUserObligationFarmsFromFileCommand = initAllKlendUserObligationFarmsFromFileCommand;
const klend_sdk_1 = require("@kamino-finance/klend-sdk");
const web3_js_1 = require("@solana/web3.js");
const Farms_1 = require("../Farms");
const utils_1 = require("./utils");
const utils_2 = require("../utils");
const spl_token_1 = require("@solana/spl-token");
async function initAllKlendUserObligationFarmsFromFileCommand(market, file) {
const admin = process.env.ADMIN;
const rpc = process.env.RPC;
const klendProgramId = new web3_js_1.PublicKey(process.env.KLEND_PROGRAM_ID || "");
const env = (0, utils_1.initializeClient)(rpc, admin, (0, utils_2.getFarmsProgramId)(rpc), false);
const c = env.provider.connection;
const farmsClient = new Farms_1.Farms(env.provider.connection);
const shouldExecute = true;
const lendingMarket = new web3_js_1.PublicKey(market);
const kaminoMarket = await klend_sdk_1.KaminoMarket.load(c, lendingMarket, 450, klendProgramId);
if (!kaminoMarket) {
throw new Error("Kamino market not found");
}
let ixns = [];
const fs = require("fs");
const rawData = fs.readFileSync(file, "utf8");
const obligationAddresses = JSON.parse(rawData);
let startAt = 0;
let stopAt = obligationAddresses.length;
let i = startAt;
for (let i = startAt; i < stopAt; i++) {
const obligationAddress = obligationAddresses[i];
console.log(`Running through obligation ${i}/${obligationAddresses.length} ixns ${ixns.length}`);
let obligation = (await kaminoMarket.getObligationByAddress(new web3_js_1.PublicKey(obligationAddress)));
if (!obligation) {
continue;
}
for (const deposit of obligation.deposits) {
const reserve = kaminoMarket.getReserveByMint(deposit[1].mintAddress);
const reserveFarms = [
[reserve.state.farmCollateral, 0],
// [reserve.state.farmDebt, 1],
];
for (const [reserveFarm, mode] of reserveFarms) {
if (reserveFarm.equals(web3_js_1.PublicKey.default)) {
continue;
}
// For this reserve, do both collateral and debt
const userStatePda = getUserFarmPda(reserveFarm, obligation.obligationAddress, farmsClient.getProgramID());
// Only init if does not exist
if (!(await (0, utils_2.accountExist)(c, userStatePda))) {
ixns.push(getInitIxn(env, obligation, kaminoMarket, reserve, reserveFarm, userStatePda, farmsClient.getProgramID(), mode));
}
}
}
}
// Execute these first
console.log("Executing ixns", ixns.length);
let promises = [];
if (shouldExecute) {
let batchSize = 5;
let thisBatch = [];
let maxConcurrent = 20;
for (let i = 0; i < ixns.length; i++) {
thisBatch.push(ixns[i]);
console.log("Executing ixn", i);
if (thisBatch.length >= batchSize || i === ixns.length - 1) {
promises.push(executeWithoutAwait(env, farmsClient, thisBatch, i, ixns.length).then((sig) => {
console.log(`Init Signature ${sig} for ${i}/${ixns.length}`);
}));
thisBatch = [];
}
if (promises.length >= maxConcurrent || i === ixns.length - 1) {
await Promise.all(promises);
promises = [];
}
}
}
await Promise.all(promises);
}
const executeWithoutAwait = async (env, farmsClient, thisBatch, i, len) => {
let numRetries = 5;
let retry = 0;
while (retry < numRetries) {
try {
const sig = await farmsClient.executeTransaction(thisBatch, env.initialOwner, []);
return sig;
}
catch (e) {
retry += 1;
await (0, utils_2.sleep)(1000);
}
}
return null;
};
const BASE_SEED_USER_STATE = Buffer.from("user");
const getUserFarmPda = (farm, obligation, farmsProgramId) => web3_js_1.PublicKey.findProgramAddressSync([BASE_SEED_USER_STATE, farm.toBytes(), obligation.toBytes()], farmsProgramId)[0];
const getInitIxn = (env, obligation, market, reserve, reserveFarm, userStatePda, farmsProgramId, mode) => {
const args = {
mode,
};
const accts = {
payer: env.initialOwner.publicKey,
owner: obligation.state.owner,
obligation: obligation.obligationAddress,
lendingMarketAuthority: market.getLendingMarketAuthority(),
reserve: reserve.address,
reserveFarmState: reserveFarm,
obligationFarm: userStatePda,
lendingMarket: reserve.state.lendingMarket,
farmsProgram: farmsProgramId,
rent: web3_js_1.SYSVAR_RENT_PUBKEY,
tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
systemProgram: web3_js_1.SystemProgram.programId,
};
const ixn = (0, klend_sdk_1.initObligationFarmsForReserve)(args, accts, market.programId);
return ixn;
};
//# sourceMappingURL=init_all_klend_user_obligation_farms_from_file.js.map