import { BN } from "@coral-xyz/anchor";
import { Connection, PublicKey, Signer, Transaction, TransactionInstruction, TransactionSignature } from "@solana/web3.js";
import { UserFarm } from "./models";
import { FarmState } from "./rpc_client/accounts";
import Decimal from "decimal.js";
import { Keypair } from "@solana/web3.js";
import { GlobalConfigOptionKind, FarmConfigOptionKind } from "./rpc_client/types/index";
import { FarmAndKey, UserAndKey } from "./models";
import { OraclePrices } from "@kamino-finance/scope-sdk";
import { KaminoMarket, Position, PubkeyHashMap, PublicKeySet } from "@kamino-finance/klend-sdk";
import { Web3Client } from "./utils/sendTransactionsUtils";
export declare const farmsId: PublicKey;
export interface UserPointsBreakdown {
    totalPoints: Decimal;
    currentBoost: Decimal;
    currentPointsPerDay: Decimal;
    perPositionBoost: PubkeyHashMap<PublicKey, Decimal>;
    perPositionPointsPerDay: PubkeyHashMap<PublicKey, Decimal>;
}
export interface RewardCurvePoint {
    startTs: number;
    rps: number;
}
export declare class Farms {
    private readonly _connection;
    private readonly _provider;
    private readonly _farmsProgramId;
    constructor(connection: Connection);
    getConnection(): Connection;
    getProgramID(): PublicKey;
    getAllUserStatesForUser(user: PublicKey): Promise<Array<UserAndKey>>;
    getAllUserStates(): Promise<UserAndKey[]>;
    getAllUserStatesWithFilter(isFarmDelegated: boolean): Promise<UserAndKey[]>;
    /**
     * Get all farms user states from an async generator filled with batches of max 100 user states each
     * @example
     * const userStateGenerator = farms.batchGetAllUserStates();
     * for await (const userStates of userStateGenerator) {
     *   console.log('got a batch of user states:', userStates.length);
     * }
     */
    batchGetAllUserStates(): AsyncGenerator<UserAndKey[], void, unknown>;
    getAllUserStatesForFarm(farm: PublicKey): Promise<UserAndKey[]>;
    getFarmsForMint(mint: PublicKey): Promise<Array<FarmAndKey>>;
    getAllFarmStates(): Promise<FarmAndKey[]>;
    getAllFarmStatesByPubkeys(keys: PublicKey[]): Promise<FarmAndKey[]>;
    getStakedAmountForMintForFarm(mint: PublicKey, farm: PublicKey): Promise<Decimal>;
    getStakedAmountForMint(mint: PublicKey): Promise<Decimal>;
    getLockupDurationAndExpiry(farm: PublicKey, user: PublicKey, timestampNow: number): Promise<{
        lockupRemainingDuration: number;
        farmLockupOriginalDuration: number;
        farmLockupExpiry: number;
    }>;
    getUserStateKeysForDelegatedFarm(user: PublicKey, farm: PublicKey, delegatees?: PublicKey[]): Promise<Array<UserAndKey>>;
    getUserStateKeysForDelegatedFarmDeterministic(user: PublicKey, farm: PublicKey, delegatees: PublicKey[]): Promise<Array<UserAndKey>>;
    getAllFarmsForUser(user: PublicKey, timestamp: Decimal, strategiesToInclude?: PublicKeySet<PublicKey>, vaultsToInclude?: PublicKeySet<PublicKey>): Promise<PubkeyHashMap<PublicKey, UserFarm>>;
    getUserStateKeyForUndelegatedFarm(user: PublicKey, farmAddress: PublicKey): Promise<UserAndKey>;
    getUserTokensInUndelegatedFarm(user: PublicKey, farm: PublicKey, tokenDecimals: number): Promise<Decimal>;
    getUserForUndelegatedFarm(user: PublicKey, farmAddress: PublicKey, timestamp: Decimal): Promise<UserFarm>;
    executeTransaction(ix: TransactionInstruction[], signer: Keypair, extraSigners?: Signer[], web3Client?: Web3Client, priorityFeeMultiplier?: number): Promise<TransactionSignature>;
    createNewUserIx(user: PublicKey, farm: PublicKey, authority?: PublicKey, delegatee?: PublicKey): TransactionInstruction;
    createNewUser(user: Keypair, farm: PublicKey, priorityFeeMultiplier: number, web3Client?: Web3Client, authority?: Keypair, delegatee?: Keypair): Promise<TransactionSignature>;
    stakeIx(user: PublicKey, farm: PublicKey, amountLamports: Decimal, stakeTokenMint: PublicKey, scopePrices: PublicKey): TransactionInstruction;
    stake(user: Keypair, farm: PublicKey, amountLamports: Decimal, stakeTokenMint: PublicKey, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    unstakeIx(user: PublicKey, farm: PublicKey, amountLamports: string, scopePrices: PublicKey): TransactionInstruction;
    unstake(user: Keypair, farm: PublicKey, sharesAmount: string, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    withdrawUnstakedDepositIx(user: PublicKey, userState: PublicKey, farmState: PublicKey, stakeTokenMint: PublicKey): TransactionInstruction;
    withdrawUnstakedDeposit(user: Keypair, farmState: PublicKey, tokenMint: PublicKey, userState: PublicKey, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    claimForUserForFarmRewardIx(user: PublicKey, farm: PublicKey, rewardMint: PublicKey, isDelegated: boolean, rewardIndex?: number, delegatees?: PublicKey[]): Promise<[
        [PublicKey, TransactionInstruction][],
        TransactionInstruction[]
    ]>;
    claimForUserForFarmReward(user: Keypair, farm: PublicKey, rewardMint: PublicKey, isDelegated: boolean, rewardIndex: number | undefined, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    claimForUserForFarmAllRewardsIx(user: PublicKey, farm: PublicKey, isDelegated: boolean, delegatees?: PublicKey[]): Promise<Array<TransactionInstruction>>;
    claimForUserForFarmAllRewards(user: Keypair, farm: PublicKey, isDelegated: boolean, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<Array<TransactionSignature>>;
    transferOwnershipIx(user: PublicKey, userState: PublicKey, newUser: PublicKey): TransactionInstruction;
    transferOwnership(user: Keypair, userState: PublicKey, newUser: PublicKey, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    transferOwnershipAllUserStatesIx(user: PublicKey, newUser: PublicKey): Promise<Array<TransactionInstruction>>;
    transferOwnershipAllUserStates(user: Keypair, newUser: PublicKey, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<Array<TransactionSignature>>;
    createFarmIx(admin: PublicKey, farm: Keypair, globalConfig: PublicKey, stakeTokenMint: PublicKey): Promise<TransactionInstruction[]>;
    createFarmDelegatedIx(admin: PublicKey, farm: Keypair, globalConfig: PublicKey, farmDelegate: PublicKey): Promise<TransactionInstruction[]>;
    createFarm(admin: Keypair, globalConfig: PublicKey, farm: Keypair, mint: PublicKey, mode: string | undefined, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    createFarmDelegated(admin: Keypair, globalConfig: PublicKey, farm: Keypair, farmDelegate: Keypair, mode: string | undefined, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<string>;
    addRewardToFarmIx(admin: PublicKey, globalConfig: PublicKey, farm: PublicKey, mint: PublicKey, tokenProgram: PublicKey): Promise<TransactionInstruction>;
    addRewardToFarm(admin: Keypair, globalConfig: PublicKey, farm: PublicKey, mint: PublicKey, tokenProgram: PublicKey, mode: string | undefined, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    addRewardAmountToFarmIx(payer: PublicKey, farm: PublicKey, mint: PublicKey, amount: Decimal, rewardIndexOverride?: number, decimalsOverride?: number, tokenProgramOverride?: PublicKey, scopePricesOverride?: PublicKey): Promise<TransactionInstruction>;
    withdrawRewardAmountFromFarmIx(payer: PublicKey, farm: PublicKey, mint: PublicKey, amount: Decimal, rewardIndexOverride?: number, decimalsOverride?: number, tokenProgramOverride?: PublicKey, scopePricesOverride?: PublicKey): Promise<TransactionInstruction[]>;
    addRewardAmountToFarm(payer: Keypair, farm: PublicKey, mint: PublicKey, amount: Decimal, mode: string, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    updateFarmConfigIx(admin: PublicKey, farm: PublicKey, mint: PublicKey, mode: FarmConfigOptionKind, value: number | PublicKey | number[] | RewardCurvePoint[] | BN, rewardIndexOverride?: number, scopePricesOverride?: PublicKey, newFarm?: boolean): Promise<TransactionInstruction>;
    updateFarmConfig(admin: Keypair, farm: PublicKey, mint: PublicKey, updateMode: FarmConfigOptionKind, value: number | PublicKey, mode: string | undefined, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    refreshFarmIx(farm: PublicKey, scopePrices: PublicKey): Promise<TransactionInstruction>;
    refreshFarm(payer: Keypair, farm: PublicKey, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    refreshUserIx(userState: PublicKey, farmState: PublicKey, scopePrices: PublicKey): Promise<TransactionInstruction>;
    refreshUser(payer: Keypair, userState: PublicKey, farmState: PublicKey, scopePrices: PublicKey, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    createGlobalConfigIxs(admin: PublicKey, globalConfig: Keypair): Promise<TransactionInstruction[]>;
    createGlobalConfig(admin: Keypair, globalConfig: Keypair, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    updateGlobalConfigIx(admin: PublicKey, globalConfig: PublicKey, mode: GlobalConfigOptionKind, flagValue: string, flagValueType: string): Promise<TransactionInstruction>;
    updateGlobalConfigAdminIx(admin: PublicKey, globalConfig: PublicKey): Promise<TransactionInstruction>;
    updateFarmAdminIx(admin: PublicKey, farm: PublicKey): Promise<TransactionInstruction>;
    updateGlobalConfig(admin: Keypair, globalConfig: PublicKey, updateMode: GlobalConfigOptionKind, flagValue: string, flagValueType: string, mode: string, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    updateGlobalConfigAdmin(admin: Keypair, globalConfig: PublicKey, mode: string, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    updateFarmAdmin(admin: Keypair, farm: PublicKey, mode: string, priorityFeeMultiplier: number, web3Client?: Web3Client): Promise<TransactionSignature>;
    withdrawTreasuryIx(admin: PublicKey, globalConfig: PublicKey, rewardMint: PublicKey, rewardTokenProgram: PublicKey, amount: BN, withdrawAta?: PublicKey): Promise<TransactionInstruction>;
    withdrawTreasury(admin: Keypair, globalConfig: PublicKey, rewardMint: PublicKey, rewardTokenProgram: PublicKey, amount: BN, priorityFeeMultiplier: number, withdrawAta?: PublicKey, web3Client?: Web3Client): Promise<TransactionSignature>;
    updateFarmRpsForRewardIx(payer: PublicKey, rewardMint: PublicKey, farm: PublicKey, rewardsPerSecond: number): Promise<TransactionInstruction>;
    topUpFarmForRewardIx(payer: PublicKey, rewardMint: PublicKey, farm: PublicKey, amountToTopUp: Decimal): Promise<TransactionInstruction>;
    processTxn(admin: Keypair, ixns: TransactionInstruction[], mode: string, priorityFeeMultiplier: number, debugMessage?: string, extraSigners?: Signer[], web3Client?: Web3Client): Promise<TransactionSignature>;
    fetchMultipleFarmStatesWithCheckedSize(keys: PublicKey[]): Promise<(FarmState | null)[]>;
}
export declare function getCurrentTimeUnit(farm: FarmState, slot: number, timestamp: number): Promise<Decimal>;
export declare function getCurrentRps(farm: FarmState, rewardIndex: number, slot: number, timestamp: number): Promise<number>;
export declare function printMultisigTx(tx: Transaction): Promise<void>;
export declare function printSimulateTx(conn: Connection, tx: Transaction): Promise<void>;
export declare const calcAvgBoost: (dollarValueBoosts: [Decimal, Decimal][]) => Decimal;
export declare const calculatePointsPerDay: (kaminoMarket: KaminoMarket, user: PublicKey, mint: PublicKey, farmPubkeyToFarmStates: PubkeyHashMap<PublicKey, FarmState>, pointsMint: PublicKey, pointsFactor: number, position: Position, isCollateral: boolean, finalBoost: Decimal, scopePrices: OraclePrices | null) => Decimal;
//# sourceMappingURL=Farms.d.ts.map