import { Program } from "@coral-xyz/anchor";
import { PublicKey } from "@solana/web3.js";
import BN from "bn.js";
/** Accounts for initializePool instruction */
export interface InitializePoolAccounts {
    payer: PublicKey;
    pool: PublicKey;
    authority: PublicKey;
    tokenA: PublicKey;
    tokenB: PublicKey;
    vaultA: PublicKey;
    vaultB: PublicKey;
    feeVault: PublicKey;
    stakingRewardVault: PublicKey;
    lpStakeVault: PublicKey;
    lpMint: PublicKey;
    systemProgram?: PublicKey;
    tokenProgram?: PublicKey;
    rent?: PublicKey;
}
export interface InitPoolAccounts {
    pool: PublicKey;
    admin: PublicKey;
    authority: PublicKey;
    vaultA: PublicKey;
    vaultB: PublicKey;
    feeVault: PublicKey;
    stakingRewardVault: PublicKey;
    lpStakeVault: PublicKey;
}
export interface InitPoolMetaAccounts {
    payer: PublicKey;
    pool: PublicKey;
    authority: PublicKey;
    tokenA: PublicKey;
    tokenB: PublicKey;
    lpMint: PublicKey;
    systemProgram?: PublicKey;
    rent?: PublicKey;
}
export interface InitializeStakeAccounts {
    user: PublicKey;
    pool: PublicKey;
    stakeVault: PublicKey;
    userLpToken: PublicKey;
    authority: PublicKey;
    stakeAccount: PublicKey;
    tokenProgram?: PublicKey;
    systemProgram?: PublicKey;
    rent?: PublicKey;
}
/** Accounts for initializePosition instruction */
export interface InitializePositionAccounts {
    user: PublicKey;
    pool: PublicKey;
    position: PublicKey;
    systemProgram?: PublicKey;
    rent?: PublicKey;
}
/** Accounts for refreshOracle instruction */
export interface RefreshOracleAccounts {
    pool: PublicKey;
    vaultA: PublicKey;
    vaultB: PublicKey;
}
/** Accounts for createLiquidityPosition instruction */
export interface CreateLiquidityAccounts {
    user: PublicKey;
    pool: PublicKey;
    position: PublicKey;
    systemProgram?: PublicKey;
    rent?: PublicKey;
}
/** Accounts for addLiquidity instruction */
export interface AddLiquidityAccounts {
    user: PublicKey;
    pool: PublicKey;
    userTokenA: PublicKey;
    userTokenB: PublicKey;
    vaultA: PublicKey;
    vaultB: PublicKey;
    lpMint: PublicKey;
    userLpToken: PublicKey;
    authority: PublicKey;
    position: PublicKey;
    tokenProgram?: PublicKey;
    systemProgram?: PublicKey;
    rent?: PublicKey;
}
/** Accounts for removeLiquidity instruction */
export interface RemoveLiquidityAccounts {
    user: PublicKey;
    pool: PublicKey;
    vaultA: PublicKey;
    vaultB: PublicKey;
    userTokenA: PublicKey;
    userTokenB: PublicKey;
    lpMint: PublicKey;
    userLpToken: PublicKey;
    position: PublicKey;
    authority: PublicKey;
    tokenProgram?: PublicKey;
}
/** Accounts for swap instruction */
export interface SwapAccounts {
    user: PublicKey;
    pool: PublicKey;
    userSource: PublicKey;
    userDestination: PublicKey;
    vaultSource: PublicKey;
    vaultDestination: PublicKey;
    vaultDestinationMint: PublicKey;
    feeVault: PublicKey;
    stakingRewardVault: PublicKey;
    authority: PublicKey;
    vaultSourceMint: PublicKey;
    treasuryVault: PublicKey;
    associatedTokenProgram?: PublicKey;
    tokenProgram?: PublicKey;
    systemProgram?: PublicKey;
}
/** Accounts for swapCommit instruction */
export interface SwapCommitAccounts {
    user: PublicKey;
    pool: PublicKey;
    commit: PublicKey;
    commitIndex: PublicKey;
    systemProgram?: PublicKey;
}
/** Accounts for swapReveal instruction */
export interface SwapRevealAccounts {
    user: PublicKey;
    pool: PublicKey;
    userSource: PublicKey;
    userDest: PublicKey;
    vaultSource: PublicKey;
    vaultDest: PublicKey;
    vaultDestinationMint: PublicKey;
    feeVault: PublicKey;
    stakingRewardVault: PublicKey;
    authority: PublicKey;
    tokenProgram?: PublicKey;
    systemProgram?: PublicKey;
    commitIndex: PublicKey;
    commit: PublicKey;
    vaultSourceMint: PublicKey;
    treasuryVault: PublicKey;
    associatedTokenProgram?: PublicKey;
}
export interface CancelCommitAccounts {
    caller: PublicKey;
    commit: PublicKey;
    pool: PublicKey;
    commitIndex: PublicKey;
    refundTo: PublicKey;
    user: PublicKey;
}
/** Accounts for stake instruction */
export interface StakeAccounts {
    user: PublicKey;
    pool: PublicKey;
    userLpToken: PublicKey;
    stakeVault: PublicKey;
    authority: PublicKey;
    stakeAccount: PublicKey;
    tokenProgram?: PublicKey;
    systemProgram?: PublicKey;
    rent?: PublicKey;
}
/** Accounts for emergencyWithdraw instruction */
export interface EmergencyWithdrawAccounts {
    user: PublicKey;
    stakeAccount: PublicKey;
    pool: PublicKey;
    stakeVault: PublicKey;
    userLpToken: PublicKey;
    authority: PublicKey;
    tokenProgram?: PublicKey;
}
/** Accounts for claimProtocolFees instruction */
export interface ClaimProtocolFeesAccounts {
    pool: PublicKey;
    feeVault: PublicKey;
    treasury: PublicKey;
    authority: PublicKey;
    tokenProgram?: PublicKey;
}
/** Accounts for claimRemainingFees instruction */
export interface ClaimRemainingFeesAccounts {
    pool: PublicKey;
    admin: PublicKey;
    vaultSource: PublicKey;
    destination: PublicKey;
    authority: PublicKey;
    tokenProgram?: PublicKey;
}
/** Accounts for claimRewards instruction */
export interface ClaimRewardsAccounts {
    user: PublicKey;
    pool: PublicKey;
    stakeAccount: PublicKey;
    stakingRewardVault: PublicKey;
    lpStakeVault: PublicKey;
    userRewardAccount: PublicKey;
    authority: PublicKey;
    tokenProgram?: PublicKey;
}
/** Accounts for claimStakingFees instruction */
export interface ClaimStakingFeesAccounts {
    user: PublicKey;
    pool: PublicKey;
    stakeAccount: PublicKey;
    stakingRewardVault: PublicKey;
    userRewardAccount: PublicKey;
    authority: PublicKey;
    tokenProgram?: PublicKey;
}
/** Accounts for initializeRewardSchedule instruction */
export interface InitializeRewardScheduleAccounts {
    payer: PublicKey;
    rewardSchedule: PublicKey;
    pool: PublicKey;
    systemProgram?: PublicKey;
}
/** Accounts for configurePool instruction */
export interface ConfigurePoolAccounts {
    pool: PublicKey;
    admin: PublicKey;
}
/** Accounts for unstake instruction */
export interface UnstakeAccounts {
    user: PublicKey;
    pool: PublicKey;
    userLpToken: PublicKey;
    stakeVault: PublicKey;
    stakeAccount: PublicKey;
    authority: PublicKey;
    tokenProgram?: PublicKey;
}
/** Accounts for updateInternalOracle instruction */
export interface UpdateInternalOracleAccounts {
    pool: PublicKey;
    admin: PublicKey;
}
export interface InitializePoolParams {
    feeBasisPoints: number;
    isStable: number;
}
export interface AddLiquidityParams {
    amountA: BN;
    amountB: BN;
}
export interface RemoveLiquidityParams {
    lpAmount: BN;
}
export interface SwapArgs {
    amountIn: BN;
    minAmountOut: BN;
    deadline: BN;
}
export interface RevealArgs extends SwapArgs {
    nonce: BN;
    commitSlot: BN;
}
export interface StakeParams {
    amount: BN;
}
export interface RewardScheduleParams {
    rewardMint: PublicKey;
    rewardVault: PublicKey;
    totalRewards: BN;
    startTime: BN;
    endTime: BN;
    rewardsPerSecond: BN;
}
export type OracleUpdateSource = {
    Manual: BN;
} | {
    Twap: null;
};
export interface SetOraclePriceArgs {
    source: OracleUpdateSource;
}
export interface RefreshOracleArgs {
    poolKey: PublicKey;
}
/** --- Helper functions --- */
export declare function initializePool(program: Program, accounts: {
    [K in keyof InitializePoolAccounts]: PublicKey;
}, params: InitializePoolParams): Promise<import("@solana/web3.js").Transaction>;
export declare function initializePosition(program: Program, accounts: {
    [key: string]: PublicKey;
}): Promise<import("@solana/web3.js").Transaction>;
export declare function createLiquidityPosition(program: Program, accounts: {
    [key: string]: PublicKey;
}): Promise<import("@solana/web3.js").Transaction>;
export declare function addLiquidity(program: Program, accounts: {
    [key: string]: PublicKey;
}, params: AddLiquidityParams): Promise<import("@solana/web3.js").Transaction>;
export declare function removeLiquidity(program: Program, accounts: {
    [key: string]: PublicKey;
}, params: RemoveLiquidityParams): Promise<import("@solana/web3.js").Transaction>;
export declare function swap(program: Program, accounts: {
    [key: string]: PublicKey;
}, args: SwapArgs): Promise<import("@solana/web3.js").Transaction>;
export declare function swapReveal(program: Program, accounts: {
    [key: string]: PublicKey;
}, args: RevealArgs): Promise<import("@solana/web3.js").Transaction>;
export declare function stake(program: Program, accounts: {
    [key: string]: PublicKey;
}, params: StakeParams): Promise<import("@solana/web3.js").Transaction>;
export declare function initializeStake(program: Program, accounts: {
    [key: string]: PublicKey;
}, params: StakeParams): Promise<import("@solana/web3.js").Transaction>;
export declare function unstake(program: Program, accounts: {
    [key: string]: PublicKey;
}, params: StakeParams): Promise<import("@solana/web3.js").Transaction>;
export declare function claimRewards(program: Program, accounts: {
    [key: string]: PublicKey;
}): Promise<import("@solana/web3.js").Transaction>;
export declare function claimStakingFees(program: Program, accounts: {
    [key: string]: PublicKey;
}): Promise<import("@solana/web3.js").Transaction>;
export declare function claimProtocolFees(program: Program, accounts: {
    [key: string]: PublicKey;
}): Promise<import("@solana/web3.js").Transaction>;
export declare function emergencyWithdraw(program: Program, accounts: {
    [key: string]: PublicKey;
}): Promise<import("@solana/web3.js").Transaction>;
export declare function updateInternalOracle(program: Program, accounts: {
    [key: string]: PublicKey;
}, args: SetOraclePriceArgs): Promise<import("@solana/web3.js").Transaction>;
export declare function configurePool(program: Program, accounts: {
    pool: PublicKey;
    admin: PublicKey;
}, feeBasisPoints: number, isStable: number, pause: number): Promise<import("@solana/web3.js").Transaction>;
//# sourceMappingURL=types.d.ts.map