import type { BaseContract, BigNumber, BigNumberish, BytesLike, CallOverrides, ContractTransaction, Overrides, PopulatedTransaction, Signer, utils } from "ethers";
import type { FunctionFragment, Result, EventFragment } from "@ethersproject/abi";
import type { Listener, Provider } from "@ethersproject/providers";
import type { TypedEventFilter, TypedEvent, TypedListener, OnEvent, PromiseOrValue } from "../../../../common";
export type PoolStruct = {
    vault: PromiseOrValue<string>;
    id: PromiseOrValue<BigNumberish>;
    managementFee: PromiseOrValue<BigNumberish>;
    decimals: PromiseOrValue<BigNumberish>;
    exists: PromiseOrValue<boolean>;
};
export type PoolStructOutput = [string, BigNumber, number, number, boolean] & {
    vault: string;
    id: BigNumber;
    managementFee: number;
    decimals: number;
    exists: boolean;
};
export interface IBankInterface extends utils.Interface {
    functions: {
        "decimals(uint256)": FunctionFragment;
        "deposit(uint96,address,uint256,uint256)": FunctionFragment;
        "getPool(uint256)": FunctionFragment;
        "getTokenId(address,uint96)": FunctionFragment;
        "getTokenInfo(uint256)": FunctionFragment;
        "takeFees(uint96,address,uint256,uint256)": FunctionFragment;
        "totalShares(address,uint96)": FunctionFragment;
        "withdraw(uint96,address,uint256,uint256)": FunctionFragment;
    };
    getFunction(nameOrSignatureOrTopic: "decimals" | "deposit" | "getPool" | "getTokenId" | "getTokenInfo" | "takeFees" | "totalShares" | "withdraw"): FunctionFragment;
    encodeFunctionData(functionFragment: "decimals", values: [PromiseOrValue<BigNumberish>]): string;
    encodeFunctionData(functionFragment: "deposit", values: [
        PromiseOrValue<BigNumberish>,
        PromiseOrValue<string>,
        PromiseOrValue<BigNumberish>,
        PromiseOrValue<BigNumberish>
    ]): string;
    encodeFunctionData(functionFragment: "getPool", values: [PromiseOrValue<BigNumberish>]): string;
    encodeFunctionData(functionFragment: "getTokenId", values: [PromiseOrValue<string>, PromiseOrValue<BigNumberish>]): string;
    encodeFunctionData(functionFragment: "getTokenInfo", values: [PromiseOrValue<BigNumberish>]): string;
    encodeFunctionData(functionFragment: "takeFees", values: [
        PromiseOrValue<BigNumberish>,
        PromiseOrValue<string>,
        PromiseOrValue<BigNumberish>,
        PromiseOrValue<BigNumberish>
    ]): string;
    encodeFunctionData(functionFragment: "totalShares", values: [PromiseOrValue<string>, PromiseOrValue<BigNumberish>]): string;
    encodeFunctionData(functionFragment: "withdraw", values: [
        PromiseOrValue<BigNumberish>,
        PromiseOrValue<string>,
        PromiseOrValue<BigNumberish>,
        PromiseOrValue<BigNumberish>
    ]): string;
    decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "deposit", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "getPool", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "getTokenId", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "getTokenInfo", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "takeFees", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "totalShares", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result;
    events: {
        "AddPool(uint96,address,uint256)": EventFragment;
        "Deposit(uint96,address,address,uint256)": EventFragment;
        "SetTreasury(address)": EventFragment;
        "TakeFees(uint96,address,uint256)": EventFragment;
        "Withdraw(uint96,address,address,uint256)": EventFragment;
    };
    getEvent(nameOrSignatureOrTopic: "AddPool"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "Deposit"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "SetTreasury"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "TakeFees"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "Withdraw"): EventFragment;
}
export interface AddPoolEventObject {
    id: BigNumber;
    vault: string;
    tokenId: BigNumber;
}
export type AddPoolEvent = TypedEvent<[
    BigNumber,
    string,
    BigNumber
], AddPoolEventObject>;
export type AddPoolEventFilter = TypedEventFilter<AddPoolEvent>;
export interface DepositEventObject {
    id: BigNumber;
    vault: string;
    account: string;
    shares: BigNumber;
}
export type DepositEvent = TypedEvent<[
    BigNumber,
    string,
    string,
    BigNumber
], DepositEventObject>;
export type DepositEventFilter = TypedEventFilter<DepositEvent>;
export interface SetTreasuryEventObject {
    treasury: string;
}
export type SetTreasuryEvent = TypedEvent<[string], SetTreasuryEventObject>;
export type SetTreasuryEventFilter = TypedEventFilter<SetTreasuryEvent>;
export interface TakeFeesEventObject {
    id: BigNumber;
    vault: string;
    shares: BigNumber;
}
export type TakeFeesEvent = TypedEvent<[
    BigNumber,
    string,
    BigNumber
], TakeFeesEventObject>;
export type TakeFeesEventFilter = TypedEventFilter<TakeFeesEvent>;
export interface WithdrawEventObject {
    id: BigNumber;
    vault: string;
    account: string;
    shares: BigNumber;
}
export type WithdrawEvent = TypedEvent<[
    BigNumber,
    string,
    string,
    BigNumber
], WithdrawEventObject>;
export type WithdrawEventFilter = TypedEventFilter<WithdrawEvent>;
export interface IBank extends BaseContract {
    connect(signerOrProvider: Signer | Provider | string): this;
    attach(addressOrName: string): this;
    deployed(): Promise<this>;
    interface: IBankInterface;
    queryFilter<TEvent extends TypedEvent>(event: TypedEventFilter<TEvent>, fromBlockOrBlockhash?: string | number | undefined, toBlock?: string | number | undefined): Promise<Array<TEvent>>;
    listeners<TEvent extends TypedEvent>(eventFilter?: TypedEventFilter<TEvent>): Array<TypedListener<TEvent>>;
    listeners(eventName?: string): Array<Listener>;
    removeAllListeners<TEvent extends TypedEvent>(eventFilter: TypedEventFilter<TEvent>): this;
    removeAllListeners(eventName?: string): this;
    off: OnEvent<this>;
    on: OnEvent<this>;
    once: OnEvent<this>;
    removeListener: OnEvent<this>;
    functions: {
        decimals(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<[number]>;
        deposit(id: PromiseOrValue<BigNumberish>, account: PromiseOrValue<string>, poolTokens: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: Overrides & {
            from?: PromiseOrValue<string>;
        }): Promise<ContractTransaction>;
        getPool(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<[PoolStructOutput] & {
            pool: PoolStructOutput;
        }>;
        getTokenId(vault: PromiseOrValue<string>, id: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<[BigNumber] & {
            tokenId: BigNumber;
        }>;
        getTokenInfo(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<[string, BigNumber] & {
            vault: string;
            poolId: BigNumber;
        }>;
        takeFees(id: PromiseOrValue<BigNumberish>, recipient: PromiseOrValue<string>, profit: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: Overrides & {
            from?: PromiseOrValue<string>;
        }): Promise<ContractTransaction>;
        totalShares(vault: PromiseOrValue<string>, id: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<[BigNumber]>;
        withdraw(id: PromiseOrValue<BigNumberish>, account: PromiseOrValue<string>, shares: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: Overrides & {
            from?: PromiseOrValue<string>;
        }): Promise<ContractTransaction>;
    };
    decimals(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<number>;
    deposit(id: PromiseOrValue<BigNumberish>, account: PromiseOrValue<string>, poolTokens: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: Overrides & {
        from?: PromiseOrValue<string>;
    }): Promise<ContractTransaction>;
    getPool(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<PoolStructOutput>;
    getTokenId(vault: PromiseOrValue<string>, id: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<BigNumber>;
    getTokenInfo(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<[string, BigNumber] & {
        vault: string;
        poolId: BigNumber;
    }>;
    takeFees(id: PromiseOrValue<BigNumberish>, recipient: PromiseOrValue<string>, profit: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: Overrides & {
        from?: PromiseOrValue<string>;
    }): Promise<ContractTransaction>;
    totalShares(vault: PromiseOrValue<string>, id: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<BigNumber>;
    withdraw(id: PromiseOrValue<BigNumberish>, account: PromiseOrValue<string>, shares: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: Overrides & {
        from?: PromiseOrValue<string>;
    }): Promise<ContractTransaction>;
    callStatic: {
        decimals(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<number>;
        deposit(id: PromiseOrValue<BigNumberish>, account: PromiseOrValue<string>, poolTokens: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<BigNumber>;
        getPool(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<PoolStructOutput>;
        getTokenId(vault: PromiseOrValue<string>, id: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<BigNumber>;
        getTokenInfo(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<[string, BigNumber] & {
            vault: string;
            poolId: BigNumber;
        }>;
        takeFees(id: PromiseOrValue<BigNumberish>, recipient: PromiseOrValue<string>, profit: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<BigNumber>;
        totalShares(vault: PromiseOrValue<string>, id: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<BigNumber>;
        withdraw(id: PromiseOrValue<BigNumberish>, account: PromiseOrValue<string>, shares: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<BigNumber>;
    };
    filters: {
        "AddPool(uint96,address,uint256)"(id?: null, vault?: PromiseOrValue<string> | null, tokenId?: PromiseOrValue<BigNumberish> | null): AddPoolEventFilter;
        AddPool(id?: null, vault?: PromiseOrValue<string> | null, tokenId?: PromiseOrValue<BigNumberish> | null): AddPoolEventFilter;
        "Deposit(uint96,address,address,uint256)"(id?: PromiseOrValue<BigNumberish> | null, vault?: PromiseOrValue<string> | null, account?: PromiseOrValue<string> | null, shares?: null): DepositEventFilter;
        Deposit(id?: PromiseOrValue<BigNumberish> | null, vault?: PromiseOrValue<string> | null, account?: PromiseOrValue<string> | null, shares?: null): DepositEventFilter;
        "SetTreasury(address)"(treasury?: null): SetTreasuryEventFilter;
        SetTreasury(treasury?: null): SetTreasuryEventFilter;
        "TakeFees(uint96,address,uint256)"(id?: PromiseOrValue<BigNumberish> | null, vault?: PromiseOrValue<string> | null, shares?: null): TakeFeesEventFilter;
        TakeFees(id?: PromiseOrValue<BigNumberish> | null, vault?: PromiseOrValue<string> | null, shares?: null): TakeFeesEventFilter;
        "Withdraw(uint96,address,address,uint256)"(id?: PromiseOrValue<BigNumberish> | null, vault?: PromiseOrValue<string> | null, account?: PromiseOrValue<string> | null, shares?: null): WithdrawEventFilter;
        Withdraw(id?: PromiseOrValue<BigNumberish> | null, vault?: PromiseOrValue<string> | null, account?: PromiseOrValue<string> | null, shares?: null): WithdrawEventFilter;
    };
    estimateGas: {
        decimals(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<BigNumber>;
        deposit(id: PromiseOrValue<BigNumberish>, account: PromiseOrValue<string>, poolTokens: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: Overrides & {
            from?: PromiseOrValue<string>;
        }): Promise<BigNumber>;
        getPool(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<BigNumber>;
        getTokenId(vault: PromiseOrValue<string>, id: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<BigNumber>;
        getTokenInfo(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<BigNumber>;
        takeFees(id: PromiseOrValue<BigNumberish>, recipient: PromiseOrValue<string>, profit: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: Overrides & {
            from?: PromiseOrValue<string>;
        }): Promise<BigNumber>;
        totalShares(vault: PromiseOrValue<string>, id: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<BigNumber>;
        withdraw(id: PromiseOrValue<BigNumberish>, account: PromiseOrValue<string>, shares: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: Overrides & {
            from?: PromiseOrValue<string>;
        }): Promise<BigNumber>;
    };
    populateTransaction: {
        decimals(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<PopulatedTransaction>;
        deposit(id: PromiseOrValue<BigNumberish>, account: PromiseOrValue<string>, poolTokens: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: Overrides & {
            from?: PromiseOrValue<string>;
        }): Promise<PopulatedTransaction>;
        getPool(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<PopulatedTransaction>;
        getTokenId(vault: PromiseOrValue<string>, id: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<PopulatedTransaction>;
        getTokenInfo(tokenId: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<PopulatedTransaction>;
        takeFees(id: PromiseOrValue<BigNumberish>, recipient: PromiseOrValue<string>, profit: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: Overrides & {
            from?: PromiseOrValue<string>;
        }): Promise<PopulatedTransaction>;
        totalShares(vault: PromiseOrValue<string>, id: PromiseOrValue<BigNumberish>, overrides?: CallOverrides): Promise<PopulatedTransaction>;
        withdraw(id: PromiseOrValue<BigNumberish>, account: PromiseOrValue<string>, shares: PromiseOrValue<BigNumberish>, totalTokens: PromiseOrValue<BigNumberish>, overrides?: Overrides & {
            from?: PromiseOrValue<string>;
        }): Promise<PopulatedTransaction>;
    };
}
