import { Connection, PublicKey, TransactionInstruction } from '@solana/web3.js';
import { TokenAmount } from './safe-math';
import { TokenInfo } from './tokens';
export interface IdoPoolInfo {
    startTime: number;
    endTime: number;
    startWithdrawTime: number;
    minDepositLimit: TokenAmount;
    maxDepositLimit: TokenAmount;
    stakePoolId: PublicKey;
    minStakeLimit: TokenAmount;
    quoteTokenDeposited: TokenAmount;
}
export interface IdoLotteryPoolInfo {
    status: number;
    nonce: number;
    startTime: number;
    endTime: number;
    startWithdrawTime: number;
    numerator: number;
    denominator: number;
    quoteTokenDeposited: TokenAmount;
    baseTokenSupply: TokenAmount;
    perUserMaxLottery: number;
    perUserMinLottery: number;
    perLotteryNeedMinStake: number;
    perLotteryWorthQuoteAmount: TokenAmount;
    totalWinLotteryLimit: number;
    totalDepositUserNumber: number;
    currentLotteryNumber: number;
    luckyInfos: Array<{
        luckyTailDigits: number;
        luckyTailNumber: number;
        luckyWithinNumber: number;
        luckyNumberExist: number;
    }>;
    quoteTokenMint: PublicKey;
    baseTokenMint: PublicKey;
    quoteTokenVault: PublicKey;
    baseTokenVault: PublicKey;
    stakePoolId: PublicKey;
    stakeProgramId: PublicKey;
    checkProgramId: PublicKey;
    idoOwner: PublicKey;
    poolSeedId: PublicKey;
}
export interface IdoUserInfo {
    deposited: TokenAmount;
    snapshoted: boolean;
}
export interface IdoLotteryUserInfo {
    deposited: TokenAmount;
    snapshoted: boolean;
    eligibleTicketAmount: number;
    quoteTokenDeposited: number;
    quoteTokenWithdrawn: number;
    baseTokenWithdrawn: number;
    lotteryBeginNumber: number;
    lotteryEndNumber: number;
}
export interface IdoPool {
    base: TokenInfo;
    quote: TokenInfo;
    version: number;
    programId: string;
    snapshotProgramId: string;
    isRayPool: boolean;
    isPrivate: boolean;
    status?: string;
    idoId: string;
    baseVault: string;
    quoteVault: string;
    info?: IdoPoolInfo | IdoLotteryPoolInfo;
    userInfo?: IdoUserInfo | IdoLotteryUserInfo;
    price: TokenAmount;
    raise: TokenAmount;
    seedId?: string;
}
export declare const IDO_POOLS: IdoPool[];
export declare function getIdoPoolById(idoId: string): IdoPool;
export declare const IDO_POOL_INFO_LAYOUT: any;
export declare const IDO_LOTTERY_POOL_INFO_LAYOUT: any;
export declare const IDO_USER_INFO_LAYOUT: any;
export declare const IDO_LOTTERY_USER_INFO_LAYOUT: any;
export declare const IDO_LOTTERY_SNAPSHOT_DATA_LAYOUT: any;
export declare function findAssociatedIdoInfoAddress(idoId: PublicKey, walletAddress: PublicKey, programId: PublicKey): Promise<PublicKey>;
export declare function findAssociatedIdoCheckAddress(idoId: PublicKey, walletAddress: PublicKey, snapshotProgramId: PublicKey): Promise<PublicKey>;
export declare function purchase({ connection, wallet, poolInfo, userQuoteTokenAccount, stakeInfoAccount, amount, }: {
    connection: Connection;
    wallet: any;
    poolInfo: IdoPool;
    userQuoteTokenAccount: string;
    stakeInfoAccount: string;
    amount: string | number;
}): Promise<string>;
export declare function claim({ connection, wallet, poolInfo, userBaseTokenAccount, userQuoteTokenAccount, aim, }: {
    connection: Connection;
    wallet: any;
    poolInfo: IdoPool;
    userBaseTokenAccount: string;
    userQuoteTokenAccount: string;
    /**
     * this is only for lottery
     * the property indicate which coin user want to withdraw
     */
    aim?: 'quote' | 'base';
}): Promise<string>;
interface PurchaseInstructionKeys {
    idoId: PublicKey;
    authority: PublicKey;
    poolQuoteTokenAccount: PublicKey;
    userQuoteTokenAccount: PublicKey;
    userIdoInfo: PublicKey;
    userStakeInfo: PublicKey;
    userIdoCheck: PublicKey;
    userOwner: PublicKey;
}
interface PurchaseInstructionKeysV3 {
    idoId: PublicKey;
    authority: PublicKey;
    poolQuoteTokenAccount: PublicKey;
    userQuoteTokenAccount: PublicKey;
    userIdoInfo: PublicKey;
    userIdoCheck: PublicKey;
    userOwner: PublicKey;
}
interface PurchaseInstructionKeysPrivate {
    idoId: PublicKey;
    authority: PublicKey;
    poolQuoteTokenAccount: PublicKey;
    userQuoteTokenAccount: PublicKey;
    userIdoInfo: PublicKey;
    userIdoCheck: PublicKey;
    userOwner: PublicKey;
}
export declare function purchaseInstruction<Flag extends '' | '3' | 'private' = ''>({ programId, amount }: {
    programId: PublicKey;
    amount: string | number;
}, instructionKeys: Flag extends '3' ? PurchaseInstructionKeysV3 : Flag extends 'private' ? PurchaseInstructionKeysPrivate : PurchaseInstructionKeys): TransactionInstruction;
interface ClaimInstructionKeys {
    idoId: PublicKey;
    authority: PublicKey;
    poolQuoteTokenAccount: PublicKey;
    poolBaseTokenAccount: PublicKey;
    userQuoteTokenAccount: PublicKey;
    userBaseTokenAccount: PublicKey;
    userIdoInfo: PublicKey;
    userOwner: PublicKey;
}
interface ClaimInstructionKeysV3 {
    idoId: PublicKey;
    authority: PublicKey;
    poolTokenAccount: PublicKey;
    userTokenAccount: PublicKey;
    userIdoInfo: PublicKey;
    userOwner: PublicKey;
}
export declare function claimInstruction<Version extends '' | '3' = ''>({ programId }: {
    programId: PublicKey;
}, instructionKeys: Version extends '3' ? ClaimInstructionKeysV3 : ClaimInstructionKeys): TransactionInstruction;
export {};
