import { PublicKey } from "@solana/web3.js";
import { BN, Program } from "@coral-xyz/anchor";
import { BasketsProgram } from "../idl/types";
import { OraclePrice } from "../utils/oracle";
export declare const BASKETS_STATE_SIZE = 28189;
export interface BasketState {
    version: number;
    ownAddress: PublicKey;
    basketType: number;
    basketPda: PublicKey;
    mint: PublicKey;
    supplyOutstanding: BN;
    lastPrice: BN;
    startingPrice: BN;
    highestPrice: BN;
    creator: PublicKey;
    creatorDepositFeeBps: number;
    creatorManagementFeeBps: number;
    creatorPerformanceFeeBps: number;
    host: PublicKey;
    hostDepositFeeBps: number;
    hostManagementFeeBps: number;
    hostPerformanceFeeBps: number;
    managers: PublicKey[];
    managersWeightBps: number[];
    managersAuthority: number[];
    managersDepositFeeBps: number;
    managersPerformanceFeeBps: number;
    managersManagementFeeBps: number;
    basketDepositFeeBps: number;
    basketWithdrawFeeBps: number;
    rebalanceIntervalSeconds: BN;
    rebalanceThresholdBps: number;
    rebalanceSlippageBps: number;
    lpThresholdBps: number;
    allowAutomation: number;
    allowLp: number;
    lamportsForAutomation: BN;
    symbolLength: number;
    symbol: number[];
    nameLength: number;
    name: number[];
    uriLength: number;
    uri: number[];
    metadataAccount: PublicKey;
    lookupTable1: PublicKey;
    lookupTable2: PublicKey;
    otherLookupTable1: PublicKey;
    otherLookupTable2: PublicKey;
    writeVersion: BN;
    numTokens: number;
    compositionMints: PublicKey[];
    compositionDecimals: number[];
    compositionOracleType: number[];
    compositionOracle1: PublicKey[];
    compositionOracle2: PublicKey[];
    compositionTargetWeights: number[];
    compositionAmounts: BN[];
    tokenPrices: BN[];
    tokenPriceUpdateTimestamps: BN[];
    lastRebalanceTimestamp: BN[];
    extraData: PublicKey[];
}
export interface ParsedBasketState {
    version: number;
    ownAddress: string;
    basketType: number;
    basketPda: string;
    mint: string;
    supplyOutstanding: number;
    lastPrice: number;
    startingPrice: number;
    highestPrice: number;
    creator: string;
    creatorDepositFeeBps: number;
    creatorManagementFeeBps: number;
    creatorPerformanceFeeBps: number;
    host: string;
    hostDepositFeeBps: number;
    hostManagementFeeBps: number;
    hostPerformanceFeeBps: number;
    managers: string[];
    managersWeightBps: number[];
    managersAuthority: number[];
    managersDepositFeeBps: number;
    managersPerformanceFeeBps: number;
    managersManagementFeeBps: number;
    basketDepositFeeBps: number;
    basketWithdrawFeeBps: number;
    rebalanceIntervalSeconds: number;
    rebalanceThresholdBps: number;
    rebalanceSlippageBps: number;
    lpThresholdBps: number;
    allowAutomation: number;
    allowLp: number;
    lamportsForAutomation: number;
    metadataAccount: string;
    lookupTable1: string;
    lookupTable2: string;
    otherLookupTable1: string;
    otherLookupTable2: string;
    writeVersion: number;
    numTokens: number;
    compositionMints: string[];
    compositionDecimals: number[];
    compositionOracleType: number[];
    compositionOracle1: string[];
    compositionOracle2: string[];
    compositionTargetWeights: number[];
    compositionAmounts: number[];
    tokenPrices: number[];
    tokenPriceUpdateTimestamps: number[];
    lastRebalanceTimestamp: number[];
    metadata: any;
    tvl: any;
    tokenValues: any;
}
export declare function fetchBasketState(program: Program<BasketsProgram>, basket: PublicKey): Promise<BasketState>;
export declare function parseBasketState(basketState: BasketState): ParsedBasketState;
export declare function getBasketTokenPrices(program: Program<BasketsProgram>, basketState: BasketState): Promise<OraclePrice[]>;
export interface RebalanceInfo {
    token: PublicKey;
    tokenDecimals: number;
    tokenPrice: number;
    index: number;
    currentAmount: number;
    currentWeight: number;
    currentValue: number;
    targetWeight: number;
    targetValue: number;
    valueDiff: number;
    maxSpendAmount: number;
}
export declare function computeRebalanceInfos(params: {
    basketState: BasketState;
    oraclePrices: OraclePrice[];
}): {
    tvl: number;
    tokenValues: any[];
    rebalanceInfos: RebalanceInfo[];
};
export declare function getBasketTvl(program: Program<BasketsProgram>, basketState: BasketState): Promise<{
    tvl: number;
    tokenValues: any[];
    rebalanceInfos: RebalanceInfo[];
}>;
