/* Autogenerated file. Do not edit manually. */
/* tslint:disable */
/* eslint-disable */
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 declare namespace FlashProtocol {
  export type StakeStructStruct = {
    stakerAddress: PromiseOrValue<string>;
    strategyAddress: PromiseOrValue<string>;
    stakeStartTs: PromiseOrValue<BigNumberish>;
    stakeDuration: PromiseOrValue<BigNumberish>;
    stakedAmount: PromiseOrValue<BigNumberish>;
    active: PromiseOrValue<boolean>;
    nftId: PromiseOrValue<BigNumberish>;
    fTokensToUser: PromiseOrValue<BigNumberish>;
    fTokensFee: PromiseOrValue<BigNumberish>;
    totalFTokenBurned: PromiseOrValue<BigNumberish>;
    totalStakedWithdrawn: PromiseOrValue<BigNumberish>;
  };

  export type StakeStructStructOutput = [
    string,
    string,
    BigNumber,
    BigNumber,
    BigNumber,
    boolean,
    BigNumber,
    BigNumber,
    BigNumber,
    BigNumber,
    BigNumber
  ] & {
    stakerAddress: string;
    strategyAddress: string;
    stakeStartTs: BigNumber;
    stakeDuration: BigNumber;
    stakedAmount: BigNumber;
    active: boolean;
    nftId: BigNumber;
    fTokensToUser: BigNumber;
    fTokensFee: BigNumber;
    totalFTokenBurned: BigNumber;
    totalStakedWithdrawn: BigNumber;
  };
}

export interface FlashProtocolInterface extends utils.Interface {
  functions: {
    "flashNFTAddress()": FunctionFragment;
    "flashStake(address,uint256,uint256,uint256,address,bool)": FunctionFragment;
    "getStakeInfo(uint256,bool)": FunctionFragment;
    "issueNFT(uint256)": FunctionFragment;
    "owner()": FunctionFragment;
    "registerStrategy(address,address,string,string)": FunctionFragment;
    "renounceOwnership()": FunctionFragment;
    "setMintFeeInfo(address,uint96)": FunctionFragment;
    "stake(address,uint256,uint256,address,bool)": FunctionFragment;
    "transferOwnership(address)": FunctionFragment;
    "unstake(uint256,bool,uint256)": FunctionFragment;
  };

  getFunction(
    nameOrSignatureOrTopic:
      | "flashNFTAddress"
      | "flashStake"
      | "getStakeInfo"
      | "issueNFT"
      | "owner"
      | "registerStrategy"
      | "renounceOwnership"
      | "setMintFeeInfo"
      | "stake"
      | "transferOwnership"
      | "unstake"
  ): FunctionFragment;

  encodeFunctionData(
    functionFragment: "flashNFTAddress",
    values?: undefined
  ): string;
  encodeFunctionData(
    functionFragment: "flashStake",
    values: [
      PromiseOrValue<string>,
      PromiseOrValue<BigNumberish>,
      PromiseOrValue<BigNumberish>,
      PromiseOrValue<BigNumberish>,
      PromiseOrValue<string>,
      PromiseOrValue<boolean>
    ]
  ): string;
  encodeFunctionData(
    functionFragment: "getStakeInfo",
    values: [PromiseOrValue<BigNumberish>, PromiseOrValue<boolean>]
  ): string;
  encodeFunctionData(
    functionFragment: "issueNFT",
    values: [PromiseOrValue<BigNumberish>]
  ): string;
  encodeFunctionData(functionFragment: "owner", values?: undefined): string;
  encodeFunctionData(
    functionFragment: "registerStrategy",
    values: [
      PromiseOrValue<string>,
      PromiseOrValue<string>,
      PromiseOrValue<string>,
      PromiseOrValue<string>
    ]
  ): string;
  encodeFunctionData(
    functionFragment: "renounceOwnership",
    values?: undefined
  ): string;
  encodeFunctionData(
    functionFragment: "setMintFeeInfo",
    values: [PromiseOrValue<string>, PromiseOrValue<BigNumberish>]
  ): string;
  encodeFunctionData(
    functionFragment: "stake",
    values: [
      PromiseOrValue<string>,
      PromiseOrValue<BigNumberish>,
      PromiseOrValue<BigNumberish>,
      PromiseOrValue<string>,
      PromiseOrValue<boolean>
    ]
  ): string;
  encodeFunctionData(
    functionFragment: "transferOwnership",
    values: [PromiseOrValue<string>]
  ): string;
  encodeFunctionData(
    functionFragment: "unstake",
    values: [
      PromiseOrValue<BigNumberish>,
      PromiseOrValue<boolean>,
      PromiseOrValue<BigNumberish>
    ]
  ): string;

  decodeFunctionResult(
    functionFragment: "flashNFTAddress",
    data: BytesLike
  ): Result;
  decodeFunctionResult(functionFragment: "flashStake", data: BytesLike): Result;
  decodeFunctionResult(
    functionFragment: "getStakeInfo",
    data: BytesLike
  ): Result;
  decodeFunctionResult(functionFragment: "issueNFT", data: BytesLike): Result;
  decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result;
  decodeFunctionResult(
    functionFragment: "registerStrategy",
    data: BytesLike
  ): Result;
  decodeFunctionResult(
    functionFragment: "renounceOwnership",
    data: BytesLike
  ): Result;
  decodeFunctionResult(
    functionFragment: "setMintFeeInfo",
    data: BytesLike
  ): Result;
  decodeFunctionResult(functionFragment: "stake", data: BytesLike): Result;
  decodeFunctionResult(
    functionFragment: "transferOwnership",
    data: BytesLike
  ): Result;
  decodeFunctionResult(functionFragment: "unstake", data: BytesLike): Result;

  events: {
    "NFTIssued(uint256,uint256)": EventFragment;
    "OwnershipTransferred(address,address)": EventFragment;
    "Staked(uint256)": EventFragment;
    "StrategyRegistered(address,address,address)": EventFragment;
    "Unstaked(uint256,uint256,uint256,bool)": EventFragment;
  };

  getEvent(nameOrSignatureOrTopic: "NFTIssued"): EventFragment;
  getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment;
  getEvent(nameOrSignatureOrTopic: "Staked"): EventFragment;
  getEvent(nameOrSignatureOrTopic: "StrategyRegistered"): EventFragment;
  getEvent(nameOrSignatureOrTopic: "Unstaked"): EventFragment;
}

export interface NFTIssuedEventObject {
  _stakeId: BigNumber;
  nftId: BigNumber;
}
export type NFTIssuedEvent = TypedEvent<
  [BigNumber, BigNumber],
  NFTIssuedEventObject
>;

export type NFTIssuedEventFilter = TypedEventFilter<NFTIssuedEvent>;

export interface OwnershipTransferredEventObject {
  previousOwner: string;
  newOwner: string;
}
export type OwnershipTransferredEvent = TypedEvent<
  [string, string],
  OwnershipTransferredEventObject
>;

export type OwnershipTransferredEventFilter =
  TypedEventFilter<OwnershipTransferredEvent>;

export interface StakedEventObject {
  _stakeId: BigNumber;
}
export type StakedEvent = TypedEvent<[BigNumber], StakedEventObject>;

export type StakedEventFilter = TypedEventFilter<StakedEvent>;

export interface StrategyRegisteredEventObject {
  _strategyAddress: string;
  _principalTokenAddress: string;
  _fTokenAddress: string;
}
export type StrategyRegisteredEvent = TypedEvent<
  [string, string, string],
  StrategyRegisteredEventObject
>;

export type StrategyRegisteredEventFilter =
  TypedEventFilter<StrategyRegisteredEvent>;

export interface UnstakedEventObject {
  _stakeId: BigNumber;
  _tokensReturned: BigNumber;
  _fTokensBurned: BigNumber;
  _stakeFinished: boolean;
}
export type UnstakedEvent = TypedEvent<
  [BigNumber, BigNumber, BigNumber, boolean],
  UnstakedEventObject
>;

export type UnstakedEventFilter = TypedEventFilter<UnstakedEvent>;

export interface FlashProtocol extends BaseContract {
  connect(signerOrProvider: Signer | Provider | string): this;
  attach(addressOrName: string): this;
  deployed(): Promise<this>;

  interface: FlashProtocolInterface;

  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: {
    flashNFTAddress(overrides?: CallOverrides): Promise<[string]>;

    flashStake(
      _strategyAddress: PromiseOrValue<string>,
      _tokenAmount: PromiseOrValue<BigNumberish>,
      _stakeDuration: PromiseOrValue<BigNumberish>,
      _minimumReceived: PromiseOrValue<BigNumberish>,
      _yieldTo: PromiseOrValue<string>,
      _mintNFT: PromiseOrValue<boolean>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<ContractTransaction>;

    getStakeInfo(
      _id: PromiseOrValue<BigNumberish>,
      _isNFT: PromiseOrValue<boolean>,
      overrides?: CallOverrides
    ): Promise<
      [FlashProtocol.StakeStructStructOutput] & {
        _stake: FlashProtocol.StakeStructStructOutput;
      }
    >;

    issueNFT(
      _stakeId: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<ContractTransaction>;

    owner(overrides?: CallOverrides): Promise<[string]>;

    registerStrategy(
      _strategyAddress: PromiseOrValue<string>,
      _principalTokenAddress: PromiseOrValue<string>,
      _fTokenName: PromiseOrValue<string>,
      _fTokenSymbol: PromiseOrValue<string>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<ContractTransaction>;

    renounceOwnership(
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<ContractTransaction>;

    setMintFeeInfo(
      _feeRecipient: PromiseOrValue<string>,
      _feePercentageBasis: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<ContractTransaction>;

    stake(
      _strategyAddress: PromiseOrValue<string>,
      _tokenAmount: PromiseOrValue<BigNumberish>,
      _stakeDuration: PromiseOrValue<BigNumberish>,
      _fTokensTo: PromiseOrValue<string>,
      _issueNFT: PromiseOrValue<boolean>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<ContractTransaction>;

    transferOwnership(
      newOwner: PromiseOrValue<string>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<ContractTransaction>;

    unstake(
      _id: PromiseOrValue<BigNumberish>,
      _isNFT: PromiseOrValue<boolean>,
      _fTokenToBurn: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<ContractTransaction>;
  };

  flashNFTAddress(overrides?: CallOverrides): Promise<string>;

  flashStake(
    _strategyAddress: PromiseOrValue<string>,
    _tokenAmount: PromiseOrValue<BigNumberish>,
    _stakeDuration: PromiseOrValue<BigNumberish>,
    _minimumReceived: PromiseOrValue<BigNumberish>,
    _yieldTo: PromiseOrValue<string>,
    _mintNFT: PromiseOrValue<boolean>,
    overrides?: Overrides & { from?: PromiseOrValue<string> }
  ): Promise<ContractTransaction>;

  getStakeInfo(
    _id: PromiseOrValue<BigNumberish>,
    _isNFT: PromiseOrValue<boolean>,
    overrides?: CallOverrides
  ): Promise<FlashProtocol.StakeStructStructOutput>;

  issueNFT(
    _stakeId: PromiseOrValue<BigNumberish>,
    overrides?: Overrides & { from?: PromiseOrValue<string> }
  ): Promise<ContractTransaction>;

  owner(overrides?: CallOverrides): Promise<string>;

  registerStrategy(
    _strategyAddress: PromiseOrValue<string>,
    _principalTokenAddress: PromiseOrValue<string>,
    _fTokenName: PromiseOrValue<string>,
    _fTokenSymbol: PromiseOrValue<string>,
    overrides?: Overrides & { from?: PromiseOrValue<string> }
  ): Promise<ContractTransaction>;

  renounceOwnership(
    overrides?: Overrides & { from?: PromiseOrValue<string> }
  ): Promise<ContractTransaction>;

  setMintFeeInfo(
    _feeRecipient: PromiseOrValue<string>,
    _feePercentageBasis: PromiseOrValue<BigNumberish>,
    overrides?: Overrides & { from?: PromiseOrValue<string> }
  ): Promise<ContractTransaction>;

  stake(
    _strategyAddress: PromiseOrValue<string>,
    _tokenAmount: PromiseOrValue<BigNumberish>,
    _stakeDuration: PromiseOrValue<BigNumberish>,
    _fTokensTo: PromiseOrValue<string>,
    _issueNFT: PromiseOrValue<boolean>,
    overrides?: Overrides & { from?: PromiseOrValue<string> }
  ): Promise<ContractTransaction>;

  transferOwnership(
    newOwner: PromiseOrValue<string>,
    overrides?: Overrides & { from?: PromiseOrValue<string> }
  ): Promise<ContractTransaction>;

  unstake(
    _id: PromiseOrValue<BigNumberish>,
    _isNFT: PromiseOrValue<boolean>,
    _fTokenToBurn: PromiseOrValue<BigNumberish>,
    overrides?: Overrides & { from?: PromiseOrValue<string> }
  ): Promise<ContractTransaction>;

  callStatic: {
    flashNFTAddress(overrides?: CallOverrides): Promise<string>;

    flashStake(
      _strategyAddress: PromiseOrValue<string>,
      _tokenAmount: PromiseOrValue<BigNumberish>,
      _stakeDuration: PromiseOrValue<BigNumberish>,
      _minimumReceived: PromiseOrValue<BigNumberish>,
      _yieldTo: PromiseOrValue<string>,
      _mintNFT: PromiseOrValue<boolean>,
      overrides?: CallOverrides
    ): Promise<void>;

    getStakeInfo(
      _id: PromiseOrValue<BigNumberish>,
      _isNFT: PromiseOrValue<boolean>,
      overrides?: CallOverrides
    ): Promise<FlashProtocol.StakeStructStructOutput>;

    issueNFT(
      _stakeId: PromiseOrValue<BigNumberish>,
      overrides?: CallOverrides
    ): Promise<BigNumber>;

    owner(overrides?: CallOverrides): Promise<string>;

    registerStrategy(
      _strategyAddress: PromiseOrValue<string>,
      _principalTokenAddress: PromiseOrValue<string>,
      _fTokenName: PromiseOrValue<string>,
      _fTokenSymbol: PromiseOrValue<string>,
      overrides?: CallOverrides
    ): Promise<void>;

    renounceOwnership(overrides?: CallOverrides): Promise<void>;

    setMintFeeInfo(
      _feeRecipient: PromiseOrValue<string>,
      _feePercentageBasis: PromiseOrValue<BigNumberish>,
      overrides?: CallOverrides
    ): Promise<void>;

    stake(
      _strategyAddress: PromiseOrValue<string>,
      _tokenAmount: PromiseOrValue<BigNumberish>,
      _stakeDuration: PromiseOrValue<BigNumberish>,
      _fTokensTo: PromiseOrValue<string>,
      _issueNFT: PromiseOrValue<boolean>,
      overrides?: CallOverrides
    ): Promise<FlashProtocol.StakeStructStructOutput>;

    transferOwnership(
      newOwner: PromiseOrValue<string>,
      overrides?: CallOverrides
    ): Promise<void>;

    unstake(
      _id: PromiseOrValue<BigNumberish>,
      _isNFT: PromiseOrValue<boolean>,
      _fTokenToBurn: PromiseOrValue<BigNumberish>,
      overrides?: CallOverrides
    ): Promise<
      [BigNumber, BigNumber] & {
        _principalReturned: BigNumber;
        _fTokensBurned: BigNumber;
      }
    >;
  };

  filters: {
    "NFTIssued(uint256,uint256)"(
      _stakeId?: null,
      nftId?: null
    ): NFTIssuedEventFilter;
    NFTIssued(_stakeId?: null, nftId?: null): NFTIssuedEventFilter;

    "OwnershipTransferred(address,address)"(
      previousOwner?: PromiseOrValue<string> | null,
      newOwner?: PromiseOrValue<string> | null
    ): OwnershipTransferredEventFilter;
    OwnershipTransferred(
      previousOwner?: PromiseOrValue<string> | null,
      newOwner?: PromiseOrValue<string> | null
    ): OwnershipTransferredEventFilter;

    "Staked(uint256)"(_stakeId?: null): StakedEventFilter;
    Staked(_stakeId?: null): StakedEventFilter;

    "StrategyRegistered(address,address,address)"(
      _strategyAddress?: PromiseOrValue<string> | null,
      _principalTokenAddress?: PromiseOrValue<string> | null,
      _fTokenAddress?: PromiseOrValue<string> | null
    ): StrategyRegisteredEventFilter;
    StrategyRegistered(
      _strategyAddress?: PromiseOrValue<string> | null,
      _principalTokenAddress?: PromiseOrValue<string> | null,
      _fTokenAddress?: PromiseOrValue<string> | null
    ): StrategyRegisteredEventFilter;

    "Unstaked(uint256,uint256,uint256,bool)"(
      _stakeId?: null,
      _tokensReturned?: null,
      _fTokensBurned?: null,
      _stakeFinished?: null
    ): UnstakedEventFilter;
    Unstaked(
      _stakeId?: null,
      _tokensReturned?: null,
      _fTokensBurned?: null,
      _stakeFinished?: null
    ): UnstakedEventFilter;
  };

  estimateGas: {
    flashNFTAddress(overrides?: CallOverrides): Promise<BigNumber>;

    flashStake(
      _strategyAddress: PromiseOrValue<string>,
      _tokenAmount: PromiseOrValue<BigNumberish>,
      _stakeDuration: PromiseOrValue<BigNumberish>,
      _minimumReceived: PromiseOrValue<BigNumberish>,
      _yieldTo: PromiseOrValue<string>,
      _mintNFT: PromiseOrValue<boolean>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<BigNumber>;

    getStakeInfo(
      _id: PromiseOrValue<BigNumberish>,
      _isNFT: PromiseOrValue<boolean>,
      overrides?: CallOverrides
    ): Promise<BigNumber>;

    issueNFT(
      _stakeId: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<BigNumber>;

    owner(overrides?: CallOverrides): Promise<BigNumber>;

    registerStrategy(
      _strategyAddress: PromiseOrValue<string>,
      _principalTokenAddress: PromiseOrValue<string>,
      _fTokenName: PromiseOrValue<string>,
      _fTokenSymbol: PromiseOrValue<string>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<BigNumber>;

    renounceOwnership(
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<BigNumber>;

    setMintFeeInfo(
      _feeRecipient: PromiseOrValue<string>,
      _feePercentageBasis: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<BigNumber>;

    stake(
      _strategyAddress: PromiseOrValue<string>,
      _tokenAmount: PromiseOrValue<BigNumberish>,
      _stakeDuration: PromiseOrValue<BigNumberish>,
      _fTokensTo: PromiseOrValue<string>,
      _issueNFT: PromiseOrValue<boolean>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<BigNumber>;

    transferOwnership(
      newOwner: PromiseOrValue<string>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<BigNumber>;

    unstake(
      _id: PromiseOrValue<BigNumberish>,
      _isNFT: PromiseOrValue<boolean>,
      _fTokenToBurn: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<BigNumber>;
  };

  populateTransaction: {
    flashNFTAddress(overrides?: CallOverrides): Promise<PopulatedTransaction>;

    flashStake(
      _strategyAddress: PromiseOrValue<string>,
      _tokenAmount: PromiseOrValue<BigNumberish>,
      _stakeDuration: PromiseOrValue<BigNumberish>,
      _minimumReceived: PromiseOrValue<BigNumberish>,
      _yieldTo: PromiseOrValue<string>,
      _mintNFT: PromiseOrValue<boolean>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<PopulatedTransaction>;

    getStakeInfo(
      _id: PromiseOrValue<BigNumberish>,
      _isNFT: PromiseOrValue<boolean>,
      overrides?: CallOverrides
    ): Promise<PopulatedTransaction>;

    issueNFT(
      _stakeId: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<PopulatedTransaction>;

    owner(overrides?: CallOverrides): Promise<PopulatedTransaction>;

    registerStrategy(
      _strategyAddress: PromiseOrValue<string>,
      _principalTokenAddress: PromiseOrValue<string>,
      _fTokenName: PromiseOrValue<string>,
      _fTokenSymbol: PromiseOrValue<string>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<PopulatedTransaction>;

    renounceOwnership(
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<PopulatedTransaction>;

    setMintFeeInfo(
      _feeRecipient: PromiseOrValue<string>,
      _feePercentageBasis: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<PopulatedTransaction>;

    stake(
      _strategyAddress: PromiseOrValue<string>,
      _tokenAmount: PromiseOrValue<BigNumberish>,
      _stakeDuration: PromiseOrValue<BigNumberish>,
      _fTokensTo: PromiseOrValue<string>,
      _issueNFT: PromiseOrValue<boolean>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<PopulatedTransaction>;

    transferOwnership(
      newOwner: PromiseOrValue<string>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<PopulatedTransaction>;

    unstake(
      _id: PromiseOrValue<BigNumberish>,
      _isNFT: PromiseOrValue<boolean>,
      _fTokenToBurn: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> }
    ): Promise<PopulatedTransaction>;
  };
}
