UNPKG

@mihalex/farms-sdk-tests

Version:
274 lines 13.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.setupFarmsEnvironment = exports.setUpFarm = exports.setUpFarmWithAirdrops = exports.createFarmAccounts = exports.createFarmAccountsWithAirdrops = exports.setUpUser = exports.createUser = exports.setUpGlobalConfig = exports.setUpGlobalConfigWithAirdrop = exports.createGlobalAccounts = exports.createGlobalAccountsWithAirdrop = exports.setUpProgram = exports.SIZE_FARM_STATE = exports.SIZE_GLOBAL_CONFIG = void 0; const web3_js_1 = require("@solana/web3.js"); const anchor = __importStar(require("@coral-xyz/anchor")); const utils_1 = require("./utils"); const decimal_js_1 = __importDefault(require("decimal.js")); const market_1 = require("@project-serum/serum/lib/market"); const utils_2 = require("./utils"); const accounts_1 = require("../rpc_client/accounts"); const Farms_1 = require("../Farms"); const types_1 = require("../rpc_client/types"); exports.SIZE_GLOBAL_CONFIG = 2136; exports.SIZE_FARM_STATE = 8336; function setUpProgram(args) { // Cluster & admin if (!args.clusterOverride) { throw new Error("Cluster is required"); } if (!args.adminFilePath) { throw new Error("Admin is required"); } const cluster = args.clusterOverride; const config = { commitment: anchor.AnchorProvider.defaultOptions().commitment, confirmTransactionInitialTimeout: 220000, }; const connection = new web3_js_1.Connection((0, utils_1.endpointFromCluster)(cluster), config); const payer = (0, utils_2.parseKeypairFile)(args.adminFilePath); // @ts-ignore const wallet = new anchor.Wallet(payer); const provider = new anchor.AnchorProvider(connection, wallet, anchor.AnchorProvider.defaultOptions()); const initialOwner = payer; anchor.setProvider(provider); // Programs const farmsProgramId = args.programOverride || (0, utils_1.getFarmsProgramId)(cluster); const program = new anchor.Program(utils_2.FarmsIdl, farmsProgramId); return { initialOwner, provider, program, cluster: cluster, }; } exports.setUpProgram = setUpProgram; async function createGlobalAccountsWithAirdrop(env, owner = env.initialOwner, rewardTokens) { const globalConfig = web3_js_1.Keypair.generate(); let rewardAtas = new Array(); let treasuryVaults = new Array(); for (let index = 0; index < rewardTokens.length; index++) { rewardAtas.push(await (0, utils_1.setupAta)(env.provider, rewardTokens[index], owner)); treasuryVaults.push(await (0, utils_1.getTreasuryVaultPDA)(env.program.programId, globalConfig.publicKey, rewardTokens[index])); } let treasuryVaultAuthority = await (0, utils_1.getTreasuryAuthorityPDA)(env.program.programId, globalConfig.publicKey); const globalAccounts = { globalAdmin: owner, globalConfig, treasuryVaults, globalAdminRewardAtas: rewardAtas, treasuryVaultAuthority, }; return globalAccounts; } exports.createGlobalAccountsWithAirdrop = createGlobalAccountsWithAirdrop; async function createGlobalAccounts(env, owner = env.initialOwner) { let bufferSpaceZeroAccount = 0; const globalConfig = await (0, utils_1.createGlobalConfigPublicKeyRentExempt)(env.provider, env.program.programId); let rewardAtas = new Array(); let treasuryVaults = new Array(); let treasuryVaultAuthority = await (0, utils_1.getTreasuryAuthorityPDA)(env.program.programId, globalConfig.publicKey); const globalAccounts = { globalAdmin: owner, globalConfig, treasuryVaults, globalAdminRewardAtas: rewardAtas, treasuryVaultAuthority, }; return globalAccounts; } exports.createGlobalAccounts = createGlobalAccounts; async function setUpGlobalConfigWithAirdrop(env, owner = env.initialOwner, rewardTokens) { const globalAccounts = await createGlobalAccountsWithAirdrop(env, owner, rewardTokens); const farmClient = new Farms_1.Farms(env.provider.connection); await farmClient.createGlobalConfig(globalAccounts.globalAdmin, globalAccounts.globalConfig); return globalAccounts; } exports.setUpGlobalConfigWithAirdrop = setUpGlobalConfigWithAirdrop; async function setUpGlobalConfig(env, owner = env.initialOwner) { const globalAccounts = await createGlobalAccounts(env, owner); const farmClient = new Farms_1.Farms(env.provider.connection); await farmClient.createGlobalConfig(globalAccounts.globalAdmin, globalAccounts.globalConfig); return globalAccounts; } exports.setUpGlobalConfig = setUpGlobalConfig; async function createUser(env, farmAccounts, solAirdropAmount, tokenAirdropAmount, rewardAirdropAmounts, owner) { if (!owner) { owner = new anchor.web3.Keypair(); } const userState = await (0, utils_1.getUserStatePDA)(env.program.programId, farmAccounts.farmState.publicKey, owner.publicKey); if (solAirdropAmount.gt(0)) { await (0, utils_1.solAirdrop)(env.provider, owner.publicKey, solAirdropAmount); await (0, utils_1.sleep)(1000); } let farmState = await accounts_1.FarmState.fetch(env.provider.connection, farmAccounts.farmState.publicKey); if (!farmState) { throw new Error("Farm state not found"); } const tokenAta = await (0, utils_1.setupAta)(env.provider, farmState.token.mint, owner); let rewardAtas = new Array(); for (let index = 0; index < farmState.numRewardTokens.toNumber(); index++) { rewardAtas.push(await (0, utils_1.setupAta)(env.provider, farmState.rewardInfos[index].token.mint, owner)); } await (0, utils_1.sleep)(2000); if (tokenAirdropAmount.gt(0)) { await (0, utils_1.mintTo)(env.provider, farmState.token.mint, tokenAta, (0, utils_1.collToLamportsDecimal)(tokenAirdropAmount, farmState.token.decimals.toNumber()).toNumber()); } const testingUser = { owner, userState: userState, tokenAta, rewardAtas, }; return testingUser; } exports.createUser = createUser; async function setUpUser(env, farmAccounts, rewardTokens, owner) { if (!owner) { owner = new anchor.web3.Keypair(); } const solAirdropAmount = new decimal_js_1.default(5); const tokenAirdropAmount = new decimal_js_1.default(2000000); let rewardAirdropAmounts = new Array(rewardTokens.length); rewardAirdropAmounts.fill(new decimal_js_1.default(20000000)); const userAccounts = await createUser(env, farmAccounts, solAirdropAmount, tokenAirdropAmount, rewardAirdropAmounts, owner); const farmClient = new Farms_1.Farms(env.provider.connection); await farmClient.createNewUser(userAccounts.owner, farmAccounts.farmState.publicKey); return userAccounts; } exports.setUpUser = setUpUser; async function createFarmAccountsWithAirdrops(env, rewardTokens, tokenMint, solAirdropAmount, rewardAirdropAmounts, farmAdmin) { if (!farmAdmin) { farmAdmin = new anchor.web3.Keypair(); } const farmState = web3_js_1.Keypair.generate(); if (solAirdropAmount.gt(0)) { await (0, utils_1.solAirdrop)(env.provider, farmAdmin.publicKey, solAirdropAmount); await (0, utils_1.sleep)(1000); } const farmVault = await (0, utils_1.getFarmVaultPDA)(env.program.programId, farmState.publicKey, tokenMint); const farmVaultAuthority = await (0, utils_1.getFarmAuthorityPDA)(env.program.programId, farmState.publicKey); let rewardVaults = new Array(); let adminRewardAtas = new Array(); for (let index = 0; index < rewardTokens.length; index++) { rewardVaults.push(await (0, utils_1.getRewardVaultPDA)(env.program.programId, farmState.publicKey, rewardTokens[index])); adminRewardAtas.push(await (0, utils_1.setupAta)(env.provider, rewardTokens[index], farmAdmin)); } await (0, utils_1.sleep)(2000); for (let index = 0; index < rewardTokens.length; index++) { let tokenDecimals = await (0, market_1.getMintDecimals)(env.provider.connection, rewardTokens[index]); if (rewardAirdropAmounts[index].gt(0)) { await (0, utils_1.mintTo)(env.provider, rewardTokens[index], adminRewardAtas[index], (0, utils_1.collToLamportsDecimal)(rewardAirdropAmounts[index], tokenDecimals).toNumber()); } } let farmAccounts = { farmAdmin: farmAdmin, farmState: farmState, tokenMint, farmVault, rewardVaults, farmVaultAuthority, rewardMints: rewardTokens, adminRewardAtas, }; return farmAccounts; } exports.createFarmAccountsWithAirdrops = createFarmAccountsWithAirdrops; async function createFarmAccounts(env, rewardTokens, tokenMint, farmAdmin) { const farmState = web3_js_1.Keypair.generate(); const farmVault = await (0, utils_1.getFarmVaultPDA)(env.program.programId, farmState.publicKey, tokenMint); const farmVaultAuthority = await (0, utils_1.getFarmAuthorityPDA)(env.program.programId, farmState.publicKey); let rewardVaults = new Array(); let adminRewardAtas = new Array(); let farmAccounts = { farmAdmin: farmAdmin, farmState: farmState, tokenMint, farmVault, rewardVaults, farmVaultAuthority, rewardMints: rewardTokens, adminRewardAtas, }; return farmAccounts; } exports.createFarmAccounts = createFarmAccounts; async function setUpFarmWithAirdrops(env, globalAccounts, rewardTokens, farmAdmin, tokenMint) { if (!farmAdmin) { farmAdmin = new anchor.web3.Keypair(); } const solAirdropAmount = new decimal_js_1.default(5); let rewardAirdropAmounts = new Array(rewardTokens.length); rewardAirdropAmounts.fill(new decimal_js_1.default(10000)); if (!tokenMint) { tokenMint = await (0, utils_1.createMint)(env.provider, env.initialOwner.publicKey); } const farmAccounts = await createFarmAccountsWithAirdrops(env, rewardTokens, tokenMint, solAirdropAmount, rewardAirdropAmounts); const farmClient = new Farms_1.Farms(env.provider.connection); await farmClient.createFarm(farmAccounts.farmAdmin, globalAccounts.globalConfig.publicKey, farmAccounts.farmState, tokenMint); return farmAccounts; } exports.setUpFarmWithAirdrops = setUpFarmWithAirdrops; async function setUpFarm(env, globalConfig, tokenMint, farmAdmin) { let rewardTokens = new Array(); const farmAccounts = await createFarmAccounts(env, rewardTokens, tokenMint, farmAdmin); const farmClient = new Farms_1.Farms(env.provider.connection); await farmClient.createFarm(farmAccounts.farmAdmin, globalConfig, farmAccounts.farmState, tokenMint); return farmAccounts; } exports.setUpFarm = setUpFarm; async function setupFarmsEnvironment(env, numRewardTokens, minClaimDurationSeconds = 60, rewardRps = 50) { let rewardTokens = Array(); for (let i = 0; i < numRewardTokens; i++) { rewardTokens.push(await (0, utils_1.createMint)(env.provider, env.initialOwner.publicKey)); } const globalAccounts = await setUpGlobalConfigWithAirdrop(env, env.initialOwner, rewardTokens); const farmAccounts = await setUpFarmWithAirdrops(env, globalAccounts, rewardTokens); const farmsClient = new Farms_1.Farms(env.provider.connection); for (let i = 0; i < numRewardTokens; i++) { await farmsClient.addRewardToFarm(farmAccounts.farmAdmin, globalAccounts.globalConfig.publicKey, farmAccounts.farmState.publicKey, rewardTokens[i]); } for (let i = 0; i < numRewardTokens; i++) { await farmsClient.addRewardAmountToFarm(farmAccounts.farmAdmin, farmAccounts.farmState.publicKey, rewardTokens[i], new decimal_js_1.default(100)); } for (let i = 0; i < numRewardTokens; i++) { await farmsClient.updateRewardToFarm(farmAccounts.farmAdmin, farmAccounts.farmState.publicKey, rewardTokens[i], new types_1.FarmConfigOption.UpdateRewardRps(), rewardRps); await farmsClient.updateRewardToFarm(farmAccounts.farmAdmin, farmAccounts.farmState.publicKey, rewardTokens[i], new types_1.FarmConfigOption.UpdateRewardMinClaimDuration(), minClaimDurationSeconds); } const userAccounts = await setUpUser(env, farmAccounts, rewardTokens); return { farmsClient, farmAccounts, globalAccounts, userAccounts, rewardTokens, }; } exports.setupFarmsEnvironment = setupFarmsEnvironment; //# sourceMappingURL=setup.js.map