import { Program } from "@coral-xyz/anchor";
import { PublicKey } from "@solana/web3.js";
import { Rule, CreateBasketParams } from "./config";
import { BasketsIDL } from "./basketsIDL";
export interface DataPoint {
    price: number;
    circulatingSupply: number;
    volume: number;
}
export interface BasketState {
    currentCompToken: number[];
    currentCompAmount: number[];
    currentCompWeight: number[];
    targetWeight: number[];
    numOfTokens: number;
    weightSum: number;
    basketWorth: number;
    lastRefilterTime: number;
    lastReweightTime: number;
    lastRebalanceTime: number;
    singleRuleAssets: number[][];
    ruleAssets: number[];
    ruleWeights: number[];
    numRuleTokens: number;
}
export interface TokenStats {
    stats: Stats[][];
}
export interface Stats {
    days: number;
    performance: number;
    volume: number;
    mcap: number;
}
export declare function fetchDatabase(program: Program<BasketsIDL>, database: PublicKey): Promise<DataPoint[][]>;
export declare function defaultBasketState(): {
    currentCompToken: number[];
    currentCompAmount: number[];
    currentCompWeight: never[] & number[];
    targetWeight: never[] & number[];
    numOfTokens: number;
    weightSum: number;
    basketWorth: number;
    lastRefilterTime: number;
    lastReweightTime: number;
    lastRebalanceTime: number;
    singleRuleAssets: any[];
    ruleWeights: never[] & number[];
    ruleAssets: never[] & number[];
    numRuleTokens: number;
};
export declare function calculateStats(data: DataPoint[], days: number, index: number): number[];
export declare function updateTokenStats(data: DataPoint[][], index: number): TokenStats;
export declare function selectTokens(createBasketParams: CreateBasketParams, rule: Rule, tokenStats: TokenStats): any[];
export declare function refilter(createBasketParams: CreateBasketParams, tokenStats: TokenStats, basketState: BasketState): void;
export declare function calculateWeight(rawWeight: number, expo: number, weightBy: number): number;
export declare function generateWeights(tokenStats: TokenStats, rule: Rule, ruleAssets: any): {
    token: any;
    assetWeight: number;
}[];
export declare function combineRules(basketState: BasketState, ruleAssets: any, createBasketParams: CreateBasketParams): void;
export declare function addTargetAssets(basketState: BasketState): void;
export declare function removeTargetAssets(basketState: BasketState): void;
export declare function updateTargetAssets(basketState: BasketState): void;
export declare function reweight(createBasketParams: CreateBasketParams, tokenStats: TokenStats, basketState: BasketState): void;
export declare function rebalance(createBasketParams: CreateBasketParams, basketState: BasketState, data: DataPoint[][], day: number, tokenList: any): void;
export declare function updateBasketState(createBasketParams: CreateBasketParams, basketState: BasketState, tokenStats: TokenStats, database: DataPoint[][], day: number, tokenList: any): void;
export declare function updateCurrentWeights(data: DataPoint[][], day: number, basketState: BasketState, tokenList: any): void;
export declare function simulate(program: Program<BasketsIDL>, database: PublicKey, tokenList: PublicKey, createBasketParams: CreateBasketParams, simulationDays: number): Promise<{
    price: number;
    currentCompAmount: number[];
    currentCompToken: number[];
}[]>;
