UNPKG

@kamino-finance/farms-sdk

Version:
118 lines 5.22 kB
"use strict"; 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