import BigNumber from "bignumber.js";
import { ethers } from "ethers";
import { NETWORKS } from '../utils';
import { PoolCommitter, PoolKeeper } from "@tracer-protocol/perpetual-pools-contracts/types";
import { EVENT_NAMES } from "../utils";
import { Pool } from "../entities";
/**
 * Holds burn and mint pending amounts
 * PendingAmounts.mint is the amount of quote token pending in the shadow pools
 * PendingAmounts.burn is the amount of to be burned pool tokens in the shadow pools
 */
export declare type PendingAmounts = {
    mint: BigNumber;
    burn: BigNumber;
};
/**
 * Global contract interface used by each of the {@link entities}
 */
export interface IContract {
    address: string;
    provider: ethers.providers.Provider | ethers.Signer;
}
/**
 * ERC20 token info which is static and not going to change
 */
export declare type StaticTokenInfo = {
    address: string;
    name: string;
    symbol: string;
    decimals: number;
};
declare type KnownNetworkKeys = keyof typeof NETWORKS;
export declare type KnownNetwork = typeof NETWORKS[KnownNetworkKeys];
export declare type TotalPoolCommitments = Awaited<ReturnType<PoolCommitter['totalPoolCommitments']>>;
export declare type TotalPoolCommitmentsBN = {
    longMintSettlement: BigNumber;
    longBurnPoolTokens: BigNumber;
    shortMintSettlement: BigNumber;
    shortBurnPoolTokens: BigNumber;
    shortBurnLongMintPoolTokens: BigNumber;
    longBurnShortMintPoolTokens: BigNumber;
};
export declare type OraclePriceTransformer = (lastPrice: BigNumber, currentPrice: BigNumber) => BigNumber;
export declare type PoolStatePreviewInputs = {
    leverage: BigNumber;
    fee: BigNumber;
    longBalance: BigNumber;
    shortBalance: BigNumber;
    longTokenSupply: BigNumber;
    shortTokenSupply: BigNumber;
    pendingLongTokenBurn: BigNumber;
    pendingShortTokenBurn: BigNumber;
    lastOraclePrice: BigNumber;
    currentOraclePrice: BigNumber;
    pendingCommits: TotalPoolCommitmentsBN[];
    oraclePriceTransformer: OraclePriceTransformer;
};
export declare type PoolStatePreview = {
    timestamp: number;
    currentSkew: BigNumber;
    currentLongBalance: BigNumber;
    currentLongSupply: BigNumber;
    currentShortBalance: BigNumber;
    currentShortSupply: BigNumber;
    currentLongTokenPrice: BigNumber;
    currentShortTokenPrice: BigNumber;
    currentPendingLongTokenBurn: BigNumber;
    currentPendingShortTokenBurn: BigNumber;
    expectedSkew: BigNumber;
    expectedLongBalance: BigNumber;
    expectedLongSupply: BigNumber;
    expectedShortBalance: BigNumber;
    expectedShortSupply: BigNumber;
    totalNetPendingLong: BigNumber;
    totalNetPendingShort: BigNumber;
    expectedLongTokenPrice: BigNumber;
    expectedShortTokenPrice: BigNumber;
    expectedPendingLongTokenBurn: BigNumber;
    expectedPendingShortTokenBurn: BigNumber;
    lastOraclePrice: BigNumber;
    expectedOraclePrice: BigNumber;
    pendingCommits: TotalPoolCommitmentsBN[];
};
export interface OracleClass<C> {
    _contract?: C;
    address: string;
    provider: ethers.providers.Provider | ethers.Signer | undefined;
    getPrice: () => Promise<BigNumber>;
}
export declare type RawCommitType = 0 | 1 | 2 | 3 | 4 | 5;
export declare type CommitEventData = {
    user: string;
    amount: BigNumber;
    commitType: RawCommitType;
    appropriateIntervalId: number;
    payForClaim: boolean;
    fromAggregateBalance: boolean;
    mintingFee: string;
    timestamp: number;
    blockNumber: number;
    txHash: string;
    settlementTokenDecimals: number;
};
export declare type UpkeepEventData = {
    poolAddress: string;
    data: string;
    startPrice: BigNumber;
    endPrice: BigNumber;
    timestamp: number;
    blockNumber: number;
    txHash: string;
};
export declare type CommitsExecutedData = {
    updateIntervalId: number;
    burningFee: string;
    timestamp: number;
    blockNumber: number;
    txHash: string;
};
export declare type SpecificPool = {
    poolAddress: string;
};
declare type PoolWatcherArgs = {
    nodeUrl: string;
    chainId: string;
    commitmentWindowBuffer: number;
    oraclePriceTransformer?: (lastPrice: BigNumber, currentPrice: BigNumber) => BigNumber;
    ignoreEvents?: {
        [eventName: string]: boolean;
    };
};
export declare type PoolWatcherConstructorArgs = SpecificPool & PoolWatcherArgs;
export declare type MultiplePoolWatcherConstructorArgs = {
    poolAddresses: string[];
} & PoolWatcherArgs;
export declare type WatchedPool = {
    address: string;
    sdkInstance: Pool;
    updateInterval: number;
    keeperInstance: PoolKeeper;
    lastPriceTimestamp: number;
    committerInstance: PoolCommitter;
    frontRunningInterval: number;
};
export declare type ExpectedPoolState = {
    timestamp: number;
    currentSkew: BigNumber;
    currentLongBalance: BigNumber;
    currentLongSupply: BigNumber;
    currentShortBalance: BigNumber;
    currentShortSupply: BigNumber;
    expectedSkew: BigNumber;
    expectedLongBalance: BigNumber;
    expectedLongSupply: BigNumber;
    expectedShortBalance: BigNumber;
    expectedShortSupply: BigNumber;
    totalNetPendingLong: BigNumber;
    totalNetPendingShort: BigNumber;
    expectedLongTokenPrice: BigNumber;
    expectedShortTokenPrice: BigNumber;
    lastOraclePrice: BigNumber;
    expectedOraclePrice: BigNumber;
    pendingCommits: TotalPoolCommitmentsBN[];
};
export declare type ExpectedPoolStateWithUpdateIntervalId = ExpectedPoolState & {
    updateIntervalId: BigNumber;
};
export interface PoolWatcherEvents {
    [EVENT_NAMES.COMMIT]: (data: CommitEventData) => void;
    [EVENT_NAMES.UPKEEP]: (data: UpkeepEventData) => void;
    [EVENT_NAMES.COMMITMENT_WINDOW_ENDED]: () => void;
    [EVENT_NAMES.COMMITMENT_WINDOW_ENDING]: (state: ExpectedPoolStateWithUpdateIntervalId) => void;
    [EVENT_NAMES.COMMITS_EXECUTED]: (data: CommitsExecutedData) => void;
}
export interface MultiplePoolWatcherEvents {
    [EVENT_NAMES.COMMIT]: (data: CommitEventData & SpecificPool) => void;
    [EVENT_NAMES.UPKEEP]: (data: UpkeepEventData & SpecificPool) => void;
    [EVENT_NAMES.COMMITMENT_WINDOW_ENDED]: (data: SpecificPool) => void;
    [EVENT_NAMES.COMMITMENT_WINDOW_ENDING]: (state: ExpectedPoolStateWithUpdateIntervalId & SpecificPool) => void;
    [EVENT_NAMES.COMMITS_EXECUTED]: (data: CommitsExecutedData & SpecificPool) => void;
}
export {};
