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 } from "./common.js";
export interface IStakingModuleInterface extends utils.Interface {
    functions: {
        "DECIMALS()": FunctionFragment;
        "controller()": FunctionFragment;
        "owner()": FunctionFragment;
        "transferControl(address)": FunctionFragment;
        "transferOwnership(address)": FunctionFragment;
        "tokens()": FunctionFragment;
        "balances(address)": FunctionFragment;
        "factory()": FunctionFragment;
        "totals()": FunctionFragment;
        "stake(address,uint256,bytes)": FunctionFragment;
        "unstake(address,uint256,bytes)": FunctionFragment;
        "claim(address,uint256,bytes)": FunctionFragment;
        "update(address)": FunctionFragment;
        "clean()": FunctionFragment;
    };
    getFunction(nameOrSignatureOrTopic: "DECIMALS" | "controller" | "owner" | "transferControl" | "transferOwnership" | "tokens" | "balances" | "factory" | "totals" | "stake" | "unstake" | "claim" | "update" | "clean"): FunctionFragment;
    encodeFunctionData(functionFragment: "DECIMALS", values?: undefined): string;
    encodeFunctionData(functionFragment: "controller", values?: undefined): string;
    encodeFunctionData(functionFragment: "owner", values?: undefined): string;
    encodeFunctionData(functionFragment: "transferControl", values: [string]): string;
    encodeFunctionData(functionFragment: "transferOwnership", values: [string]): string;
    encodeFunctionData(functionFragment: "tokens", values?: undefined): string;
    encodeFunctionData(functionFragment: "balances", values: [string]): string;
    encodeFunctionData(functionFragment: "factory", values?: undefined): string;
    encodeFunctionData(functionFragment: "totals", values?: undefined): string;
    encodeFunctionData(functionFragment: "stake", values: [string, BigNumberish, BytesLike]): string;
    encodeFunctionData(functionFragment: "unstake", values: [string, BigNumberish, BytesLike]): string;
    encodeFunctionData(functionFragment: "claim", values: [string, BigNumberish, BytesLike]): string;
    encodeFunctionData(functionFragment: "update", values: [string]): string;
    encodeFunctionData(functionFragment: "clean", values?: undefined): string;
    decodeFunctionResult(functionFragment: "DECIMALS", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "controller", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "transferControl", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "transferOwnership", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "tokens", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "balances", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "factory", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "totals", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "stake", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "unstake", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "claim", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "update", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "clean", data: BytesLike): Result;
    events: {
        "Claimed(address,address,uint256,uint256)": EventFragment;
        "ControlTransferred(address,address)": EventFragment;
        "GysrSpent(address,uint256)": EventFragment;
        "GysrVested(address,uint256)": EventFragment;
        "GysrWithdrawn(uint256)": EventFragment;
        "OwnershipTransferred(address,address)": EventFragment;
        "RewardsDistributed(address,address,uint256,uint256)": EventFragment;
        "RewardsExpired(address,uint256,uint256,uint256)": EventFragment;
        "RewardsFunded(address,uint256,uint256,uint256)": EventFragment;
        "RewardsUnlocked(address,uint256)": EventFragment;
        "Staked(address,address,uint256,uint256)": EventFragment;
        "Unstaked(address,address,uint256,uint256)": EventFragment;
    };
    getEvent(nameOrSignatureOrTopic: "Claimed"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "ControlTransferred"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "GysrSpent"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "GysrVested"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "GysrWithdrawn"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "RewardsDistributed"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "RewardsExpired"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "RewardsFunded"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "RewardsUnlocked"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "Staked"): EventFragment;
    getEvent(nameOrSignatureOrTopic: "Unstaked"): EventFragment;
}
export interface ClaimedEventObject {
    user: string;
    token: string;
    amount: BigNumber;
    shares: BigNumber;
}
export type ClaimedEvent = TypedEvent<[
    string,
    string,
    BigNumber,
    BigNumber
], ClaimedEventObject>;
export type ClaimedEventFilter = TypedEventFilter<ClaimedEvent>;
export interface ControlTransferredEventObject {
    previousController: string;
    newController: string;
}
export type ControlTransferredEvent = TypedEvent<[
    string,
    string
], ControlTransferredEventObject>;
export type ControlTransferredEventFilter = TypedEventFilter<ControlTransferredEvent>;
export interface GysrSpentEventObject {
    user: string;
    amount: BigNumber;
}
export type GysrSpentEvent = TypedEvent<[
    string,
    BigNumber
], GysrSpentEventObject>;
export type GysrSpentEventFilter = TypedEventFilter<GysrSpentEvent>;
export interface GysrVestedEventObject {
    user: string;
    amount: BigNumber;
}
export type GysrVestedEvent = TypedEvent<[
    string,
    BigNumber
], GysrVestedEventObject>;
export type GysrVestedEventFilter = TypedEventFilter<GysrVestedEvent>;
export interface GysrWithdrawnEventObject {
    amount: BigNumber;
}
export type GysrWithdrawnEvent = TypedEvent<[
    BigNumber
], GysrWithdrawnEventObject>;
export type GysrWithdrawnEventFilter = TypedEventFilter<GysrWithdrawnEvent>;
export interface OwnershipTransferredEventObject {
    previousOwner: string;
    newOwner: string;
}
export type OwnershipTransferredEvent = TypedEvent<[
    string,
    string
], OwnershipTransferredEventObject>;
export type OwnershipTransferredEventFilter = TypedEventFilter<OwnershipTransferredEvent>;
export interface RewardsDistributedEventObject {
    user: string;
    token: string;
    amount: BigNumber;
    shares: BigNumber;
}
export type RewardsDistributedEvent = TypedEvent<[
    string,
    string,
    BigNumber,
    BigNumber
], RewardsDistributedEventObject>;
export type RewardsDistributedEventFilter = TypedEventFilter<RewardsDistributedEvent>;
export interface RewardsExpiredEventObject {
    token: string;
    amount: BigNumber;
    shares: BigNumber;
    timestamp: BigNumber;
}
export type RewardsExpiredEvent = TypedEvent<[
    string,
    BigNumber,
    BigNumber,
    BigNumber
], RewardsExpiredEventObject>;
export type RewardsExpiredEventFilter = TypedEventFilter<RewardsExpiredEvent>;
export interface RewardsFundedEventObject {
    token: string;
    amount: BigNumber;
    shares: BigNumber;
    timestamp: BigNumber;
}
export type RewardsFundedEvent = TypedEvent<[
    string,
    BigNumber,
    BigNumber,
    BigNumber
], RewardsFundedEventObject>;
export type RewardsFundedEventFilter = TypedEventFilter<RewardsFundedEvent>;
export interface RewardsUnlockedEventObject {
    token: string;
    shares: BigNumber;
}
export type RewardsUnlockedEvent = TypedEvent<[
    string,
    BigNumber
], RewardsUnlockedEventObject>;
export type RewardsUnlockedEventFilter = TypedEventFilter<RewardsUnlockedEvent>;
export interface StakedEventObject {
    user: string;
    token: string;
    amount: BigNumber;
    shares: BigNumber;
}
export type StakedEvent = TypedEvent<[
    string,
    string,
    BigNumber,
    BigNumber
], StakedEventObject>;
export type StakedEventFilter = TypedEventFilter<StakedEvent>;
export interface UnstakedEventObject {
    user: string;
    token: string;
    amount: BigNumber;
    shares: BigNumber;
}
export type UnstakedEvent = TypedEvent<[
    string,
    string,
    BigNumber,
    BigNumber
], UnstakedEventObject>;
export type UnstakedEventFilter = TypedEventFilter<UnstakedEvent>;
export interface IStakingModule extends BaseContract {
    connect(signerOrProvider: Signer | Provider | string): this;
    attach(addressOrName: string): this;
    deployed(): Promise<this>;
    interface: IStakingModuleInterface;
    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(overrides?: CallOverrides): Promise<[BigNumber]>;
        controller(overrides?: CallOverrides): Promise<[string]>;
        owner(overrides?: CallOverrides): Promise<[string]>;
        transferControl(newController: string, overrides?: Overrides & {
            from?: string;
        }): Promise<ContractTransaction>;
        transferOwnership(newOwner: string, overrides?: Overrides & {
            from?: string;
        }): Promise<ContractTransaction>;
        tokens(overrides?: CallOverrides): Promise<[string[]]>;
        balances(user: string, overrides?: CallOverrides): Promise<[BigNumber[]]>;
        factory(overrides?: CallOverrides): Promise<[string]>;
        totals(overrides?: CallOverrides): Promise<[BigNumber[]]>;
        stake(user: string, amount: BigNumberish, data: BytesLike, overrides?: Overrides & {
            from?: string;
        }): Promise<ContractTransaction>;
        unstake(user: string, amount: BigNumberish, data: BytesLike, overrides?: Overrides & {
            from?: string;
        }): Promise<ContractTransaction>;
        claim(user: string, amount: BigNumberish, data: BytesLike, overrides?: Overrides & {
            from?: string;
        }): Promise<ContractTransaction>;
        update(user: string, overrides?: Overrides & {
            from?: string;
        }): Promise<ContractTransaction>;
        clean(overrides?: Overrides & {
            from?: string;
        }): Promise<ContractTransaction>;
    };
    DECIMALS(overrides?: CallOverrides): Promise<BigNumber>;
    controller(overrides?: CallOverrides): Promise<string>;
    owner(overrides?: CallOverrides): Promise<string>;
    transferControl(newController: string, overrides?: Overrides & {
        from?: string;
    }): Promise<ContractTransaction>;
    transferOwnership(newOwner: string, overrides?: Overrides & {
        from?: string;
    }): Promise<ContractTransaction>;
    tokens(overrides?: CallOverrides): Promise<string[]>;
    balances(user: string, overrides?: CallOverrides): Promise<BigNumber[]>;
    factory(overrides?: CallOverrides): Promise<string>;
    totals(overrides?: CallOverrides): Promise<BigNumber[]>;
    stake(user: string, amount: BigNumberish, data: BytesLike, overrides?: Overrides & {
        from?: string;
    }): Promise<ContractTransaction>;
    unstake(user: string, amount: BigNumberish, data: BytesLike, overrides?: Overrides & {
        from?: string;
    }): Promise<ContractTransaction>;
    claim(user: string, amount: BigNumberish, data: BytesLike, overrides?: Overrides & {
        from?: string;
    }): Promise<ContractTransaction>;
    update(user: string, overrides?: Overrides & {
        from?: string;
    }): Promise<ContractTransaction>;
    clean(overrides?: Overrides & {
        from?: string;
    }): Promise<ContractTransaction>;
    callStatic: {
        DECIMALS(overrides?: CallOverrides): Promise<BigNumber>;
        controller(overrides?: CallOverrides): Promise<string>;
        owner(overrides?: CallOverrides): Promise<string>;
        transferControl(newController: string, overrides?: CallOverrides): Promise<void>;
        transferOwnership(newOwner: string, overrides?: CallOverrides): Promise<void>;
        tokens(overrides?: CallOverrides): Promise<string[]>;
        balances(user: string, overrides?: CallOverrides): Promise<BigNumber[]>;
        factory(overrides?: CallOverrides): Promise<string>;
        totals(overrides?: CallOverrides): Promise<BigNumber[]>;
        stake(user: string, amount: BigNumberish, data: BytesLike, overrides?: CallOverrides): Promise<[string, BigNumber]>;
        unstake(user: string, amount: BigNumberish, data: BytesLike, overrides?: CallOverrides): Promise<[string, BigNumber]>;
        claim(user: string, amount: BigNumberish, data: BytesLike, overrides?: CallOverrides): Promise<[string, BigNumber]>;
        update(user: string, overrides?: CallOverrides): Promise<void>;
        clean(overrides?: CallOverrides): Promise<void>;
    };
    filters: {
        "Claimed(address,address,uint256,uint256)"(user?: string | null, token?: string | null, amount?: null, shares?: null): ClaimedEventFilter;
        Claimed(user?: string | null, token?: string | null, amount?: null, shares?: null): ClaimedEventFilter;
        "ControlTransferred(address,address)"(previousController?: string | null, newController?: string | null): ControlTransferredEventFilter;
        ControlTransferred(previousController?: string | null, newController?: string | null): ControlTransferredEventFilter;
        "GysrSpent(address,uint256)"(user?: string | null, amount?: null): GysrSpentEventFilter;
        GysrSpent(user?: string | null, amount?: null): GysrSpentEventFilter;
        "GysrVested(address,uint256)"(user?: string | null, amount?: null): GysrVestedEventFilter;
        GysrVested(user?: string | null, amount?: null): GysrVestedEventFilter;
        "GysrWithdrawn(uint256)"(amount?: null): GysrWithdrawnEventFilter;
        GysrWithdrawn(amount?: null): GysrWithdrawnEventFilter;
        "OwnershipTransferred(address,address)"(previousOwner?: string | null, newOwner?: string | null): OwnershipTransferredEventFilter;
        OwnershipTransferred(previousOwner?: string | null, newOwner?: string | null): OwnershipTransferredEventFilter;
        "RewardsDistributed(address,address,uint256,uint256)"(user?: string | null, token?: string | null, amount?: null, shares?: null): RewardsDistributedEventFilter;
        RewardsDistributed(user?: string | null, token?: string | null, amount?: null, shares?: null): RewardsDistributedEventFilter;
        "RewardsExpired(address,uint256,uint256,uint256)"(token?: string | null, amount?: null, shares?: null, timestamp?: null): RewardsExpiredEventFilter;
        RewardsExpired(token?: string | null, amount?: null, shares?: null, timestamp?: null): RewardsExpiredEventFilter;
        "RewardsFunded(address,uint256,uint256,uint256)"(token?: string | null, amount?: null, shares?: null, timestamp?: null): RewardsFundedEventFilter;
        RewardsFunded(token?: string | null, amount?: null, shares?: null, timestamp?: null): RewardsFundedEventFilter;
        "RewardsUnlocked(address,uint256)"(token?: string | null, shares?: null): RewardsUnlockedEventFilter;
        RewardsUnlocked(token?: string | null, shares?: null): RewardsUnlockedEventFilter;
        "Staked(address,address,uint256,uint256)"(user?: string | null, token?: string | null, amount?: null, shares?: null): StakedEventFilter;
        Staked(user?: string | null, token?: string | null, amount?: null, shares?: null): StakedEventFilter;
        "Unstaked(address,address,uint256,uint256)"(user?: string | null, token?: string | null, amount?: null, shares?: null): UnstakedEventFilter;
        Unstaked(user?: string | null, token?: string | null, amount?: null, shares?: null): UnstakedEventFilter;
    };
    estimateGas: {
        DECIMALS(overrides?: CallOverrides): Promise<BigNumber>;
        controller(overrides?: CallOverrides): Promise<BigNumber>;
        owner(overrides?: CallOverrides): Promise<BigNumber>;
        transferControl(newController: string, overrides?: Overrides & {
            from?: string;
        }): Promise<BigNumber>;
        transferOwnership(newOwner: string, overrides?: Overrides & {
            from?: string;
        }): Promise<BigNumber>;
        tokens(overrides?: CallOverrides): Promise<BigNumber>;
        balances(user: string, overrides?: CallOverrides): Promise<BigNumber>;
        factory(overrides?: CallOverrides): Promise<BigNumber>;
        totals(overrides?: CallOverrides): Promise<BigNumber>;
        stake(user: string, amount: BigNumberish, data: BytesLike, overrides?: Overrides & {
            from?: string;
        }): Promise<BigNumber>;
        unstake(user: string, amount: BigNumberish, data: BytesLike, overrides?: Overrides & {
            from?: string;
        }): Promise<BigNumber>;
        claim(user: string, amount: BigNumberish, data: BytesLike, overrides?: Overrides & {
            from?: string;
        }): Promise<BigNumber>;
        update(user: string, overrides?: Overrides & {
            from?: string;
        }): Promise<BigNumber>;
        clean(overrides?: Overrides & {
            from?: string;
        }): Promise<BigNumber>;
    };
    populateTransaction: {
        DECIMALS(overrides?: CallOverrides): Promise<PopulatedTransaction>;
        controller(overrides?: CallOverrides): Promise<PopulatedTransaction>;
        owner(overrides?: CallOverrides): Promise<PopulatedTransaction>;
        transferControl(newController: string, overrides?: Overrides & {
            from?: string;
        }): Promise<PopulatedTransaction>;
        transferOwnership(newOwner: string, overrides?: Overrides & {
            from?: string;
        }): Promise<PopulatedTransaction>;
        tokens(overrides?: CallOverrides): Promise<PopulatedTransaction>;
        balances(user: string, overrides?: CallOverrides): Promise<PopulatedTransaction>;
        factory(overrides?: CallOverrides): Promise<PopulatedTransaction>;
        totals(overrides?: CallOverrides): Promise<PopulatedTransaction>;
        stake(user: string, amount: BigNumberish, data: BytesLike, overrides?: Overrides & {
            from?: string;
        }): Promise<PopulatedTransaction>;
        unstake(user: string, amount: BigNumberish, data: BytesLike, overrides?: Overrides & {
            from?: string;
        }): Promise<PopulatedTransaction>;
        claim(user: string, amount: BigNumberish, data: BytesLike, overrides?: Overrides & {
            from?: string;
        }): Promise<PopulatedTransaction>;
        update(user: string, overrides?: Overrides & {
            from?: string;
        }): Promise<PopulatedTransaction>;
        clean(overrides?: Overrides & {
            from?: string;
        }): Promise<PopulatedTransaction>;
    };
}
