@hubbleprotocol/farms-sdk
Version:
129 lines • 6.28 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
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");
function initAllKlendUserObligationFarmsFromFileCommand(market, file) {
return __awaiter(this, void 0, void 0, function* () {
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 = yield 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 = (yield 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 (!(yield (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) {
yield Promise.all(promises);
promises = [];
}
}
}
yield Promise.all(promises);
});
}
const executeWithoutAwait = (env, farmsClient, thisBatch, i, len) => __awaiter(void 0, void 0, void 0, function* () {
let numRetries = 5;
let retry = 0;
while (retry < numRetries) {
try {
const sig = yield farmsClient.executeTransaction(thisBatch, env.initialOwner, []);
return sig;
}
catch (e) {
retry += 1;
yield (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
;