/* 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 interface IGraphTokenLockWalletToolshedInterface
  extends utils.Interface {
  functions: {
    "amountPerPeriod()": FunctionFragment;
    "approveProtocol()": FunctionFragment;
    "beneficiary()": FunctionFragment;
    "currentBalance()": FunctionFragment;
    "currentPeriod()": FunctionFragment;
    "currentTime()": FunctionFragment;
    "delegate(address,uint256)": FunctionFragment;
    "deprovision(address,address,uint256)": FunctionFragment;
    "duration()": FunctionFragment;
    "endTime()": FunctionFragment;
    "isRevoked()": FunctionFragment;
    "managedAmount()": FunctionFragment;
    "passedPeriods()": FunctionFragment;
    "periodDuration()": FunctionFragment;
    "periods()": FunctionFragment;
    "provisionLocked(address,address,uint256,uint32,uint64)": FunctionFragment;
    "releasableAmount()": FunctionFragment;
    "release()": FunctionFragment;
    "releaseStartTime()": FunctionFragment;
    "releasedAmount()": FunctionFragment;
    "revocable()": FunctionFragment;
    "revokeProtocol()": FunctionFragment;
    "setDelegationFeeCut(address,address,uint8,uint256)": FunctionFragment;
    "setOperatorLocked(address,address,bool)": FunctionFragment;
    "setRewardsDestination(address,address)": FunctionFragment;
    "sinceStartTime()": FunctionFragment;
    "stake(uint256)": FunctionFragment;
    "startTime()": FunctionFragment;
    "surplusAmount()": FunctionFragment;
    "thaw(address,address,uint256)": FunctionFragment;
    "token()": FunctionFragment;
    "totalOutstandingAmount()": FunctionFragment;
    "undelegate(address,uint256)": FunctionFragment;
    "unstake(uint256)": FunctionFragment;
    "usedAmount()": FunctionFragment;
    "vestedAmount()": FunctionFragment;
    "vestingCliffTime()": FunctionFragment;
    "withdraw()": FunctionFragment;
    "withdrawDelegated(address,address,uint256)": FunctionFragment;
    "withdrawDelegated(address,address)": FunctionFragment;
    "withdrawSurplus(uint256)": FunctionFragment;
  };

  getFunction(
    nameOrSignatureOrTopic:
      | "amountPerPeriod"
      | "approveProtocol"
      | "beneficiary"
      | "currentBalance"
      | "currentPeriod"
      | "currentTime"
      | "delegate"
      | "deprovision"
      | "duration"
      | "endTime"
      | "isRevoked"
      | "managedAmount"
      | "passedPeriods"
      | "periodDuration"
      | "periods"
      | "provisionLocked"
      | "releasableAmount"
      | "release"
      | "releaseStartTime"
      | "releasedAmount"
      | "revocable"
      | "revokeProtocol"
      | "setDelegationFeeCut"
      | "setOperatorLocked"
      | "setRewardsDestination"
      | "sinceStartTime"
      | "stake"
      | "startTime"
      | "surplusAmount"
      | "thaw"
      | "token"
      | "totalOutstandingAmount"
      | "undelegate"
      | "unstake"
      | "usedAmount"
      | "vestedAmount"
      | "vestingCliffTime"
      | "withdraw"
      | "withdrawDelegated(address,address,uint256)"
      | "withdrawDelegated(address,address)"
      | "withdrawSurplus",
  ): FunctionFragment;

  encodeFunctionData(
    functionFragment: "amountPerPeriod",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "approveProtocol",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "beneficiary",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "currentBalance",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "currentPeriod",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "currentTime",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "delegate",
    values: [PromiseOrValue<string>, PromiseOrValue<BigNumberish>],
  ): string;
  encodeFunctionData(
    functionFragment: "deprovision",
    values: [
      PromiseOrValue<string>,
      PromiseOrValue<string>,
      PromiseOrValue<BigNumberish>,
    ],
  ): string;
  encodeFunctionData(functionFragment: "duration", values?: undefined): string;
  encodeFunctionData(functionFragment: "endTime", values?: undefined): string;
  encodeFunctionData(functionFragment: "isRevoked", values?: undefined): string;
  encodeFunctionData(
    functionFragment: "managedAmount",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "passedPeriods",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "periodDuration",
    values?: undefined,
  ): string;
  encodeFunctionData(functionFragment: "periods", values?: undefined): string;
  encodeFunctionData(
    functionFragment: "provisionLocked",
    values: [
      PromiseOrValue<string>,
      PromiseOrValue<string>,
      PromiseOrValue<BigNumberish>,
      PromiseOrValue<BigNumberish>,
      PromiseOrValue<BigNumberish>,
    ],
  ): string;
  encodeFunctionData(
    functionFragment: "releasableAmount",
    values?: undefined,
  ): string;
  encodeFunctionData(functionFragment: "release", values?: undefined): string;
  encodeFunctionData(
    functionFragment: "releaseStartTime",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "releasedAmount",
    values?: undefined,
  ): string;
  encodeFunctionData(functionFragment: "revocable", values?: undefined): string;
  encodeFunctionData(
    functionFragment: "revokeProtocol",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "setDelegationFeeCut",
    values: [
      PromiseOrValue<string>,
      PromiseOrValue<string>,
      PromiseOrValue<BigNumberish>,
      PromiseOrValue<BigNumberish>,
    ],
  ): string;
  encodeFunctionData(
    functionFragment: "setOperatorLocked",
    values: [
      PromiseOrValue<string>,
      PromiseOrValue<string>,
      PromiseOrValue<boolean>,
    ],
  ): string;
  encodeFunctionData(
    functionFragment: "setRewardsDestination",
    values: [PromiseOrValue<string>, PromiseOrValue<string>],
  ): string;
  encodeFunctionData(
    functionFragment: "sinceStartTime",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "stake",
    values: [PromiseOrValue<BigNumberish>],
  ): string;
  encodeFunctionData(functionFragment: "startTime", values?: undefined): string;
  encodeFunctionData(
    functionFragment: "surplusAmount",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "thaw",
    values: [
      PromiseOrValue<string>,
      PromiseOrValue<string>,
      PromiseOrValue<BigNumberish>,
    ],
  ): string;
  encodeFunctionData(functionFragment: "token", values?: undefined): string;
  encodeFunctionData(
    functionFragment: "totalOutstandingAmount",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "undelegate",
    values: [PromiseOrValue<string>, PromiseOrValue<BigNumberish>],
  ): string;
  encodeFunctionData(
    functionFragment: "unstake",
    values: [PromiseOrValue<BigNumberish>],
  ): string;
  encodeFunctionData(
    functionFragment: "usedAmount",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "vestedAmount",
    values?: undefined,
  ): string;
  encodeFunctionData(
    functionFragment: "vestingCliffTime",
    values?: undefined,
  ): string;
  encodeFunctionData(functionFragment: "withdraw", values?: undefined): string;
  encodeFunctionData(
    functionFragment: "withdrawDelegated(address,address,uint256)",
    values: [
      PromiseOrValue<string>,
      PromiseOrValue<string>,
      PromiseOrValue<BigNumberish>,
    ],
  ): string;
  encodeFunctionData(
    functionFragment: "withdrawDelegated(address,address)",
    values: [PromiseOrValue<string>, PromiseOrValue<string>],
  ): string;
  encodeFunctionData(
    functionFragment: "withdrawSurplus",
    values: [PromiseOrValue<BigNumberish>],
  ): string;

  decodeFunctionResult(
    functionFragment: "amountPerPeriod",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "approveProtocol",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "beneficiary",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "currentBalance",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "currentPeriod",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "currentTime",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(functionFragment: "delegate", data: BytesLike): Result;
  decodeFunctionResult(
    functionFragment: "deprovision",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(functionFragment: "duration", data: BytesLike): Result;
  decodeFunctionResult(functionFragment: "endTime", data: BytesLike): Result;
  decodeFunctionResult(functionFragment: "isRevoked", data: BytesLike): Result;
  decodeFunctionResult(
    functionFragment: "managedAmount",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "passedPeriods",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "periodDuration",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(functionFragment: "periods", data: BytesLike): Result;
  decodeFunctionResult(
    functionFragment: "provisionLocked",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "releasableAmount",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(functionFragment: "release", data: BytesLike): Result;
  decodeFunctionResult(
    functionFragment: "releaseStartTime",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "releasedAmount",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(functionFragment: "revocable", data: BytesLike): Result;
  decodeFunctionResult(
    functionFragment: "revokeProtocol",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "setDelegationFeeCut",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "setOperatorLocked",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "setRewardsDestination",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "sinceStartTime",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(functionFragment: "stake", data: BytesLike): Result;
  decodeFunctionResult(functionFragment: "startTime", data: BytesLike): Result;
  decodeFunctionResult(
    functionFragment: "surplusAmount",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(functionFragment: "thaw", data: BytesLike): Result;
  decodeFunctionResult(functionFragment: "token", data: BytesLike): Result;
  decodeFunctionResult(
    functionFragment: "totalOutstandingAmount",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(functionFragment: "undelegate", data: BytesLike): Result;
  decodeFunctionResult(functionFragment: "unstake", data: BytesLike): Result;
  decodeFunctionResult(functionFragment: "usedAmount", data: BytesLike): Result;
  decodeFunctionResult(
    functionFragment: "vestedAmount",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "vestingCliffTime",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result;
  decodeFunctionResult(
    functionFragment: "withdrawDelegated(address,address,uint256)",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "withdrawDelegated(address,address)",
    data: BytesLike,
  ): Result;
  decodeFunctionResult(
    functionFragment: "withdrawSurplus",
    data: BytesLike,
  ): Result;

  events: {
    "ManagerUpdated(address,address)": EventFragment;
    "OwnershipTransferred(address,address)": EventFragment;
    "TokenDestinationsApproved()": EventFragment;
    "TokenDestinationsRevoked()": EventFragment;
    "TokensReleased(address,uint256)": EventFragment;
    "TokensRevoked(address,uint256)": EventFragment;
    "TokensWithdrawn(address,uint256)": EventFragment;
  };

  getEvent(nameOrSignatureOrTopic: "ManagerUpdated"): EventFragment;
  getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment;
  getEvent(nameOrSignatureOrTopic: "TokenDestinationsApproved"): EventFragment;
  getEvent(nameOrSignatureOrTopic: "TokenDestinationsRevoked"): EventFragment;
  getEvent(nameOrSignatureOrTopic: "TokensReleased"): EventFragment;
  getEvent(nameOrSignatureOrTopic: "TokensRevoked"): EventFragment;
  getEvent(nameOrSignatureOrTopic: "TokensWithdrawn"): EventFragment;
}

export interface ManagerUpdatedEventObject {
  _oldManager: string;
  _newManager: string;
}
export type ManagerUpdatedEvent = TypedEvent<
  [string, string],
  ManagerUpdatedEventObject
>;

export type ManagerUpdatedEventFilter = TypedEventFilter<ManagerUpdatedEvent>;

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

export type OwnershipTransferredEventFilter =
  TypedEventFilter<OwnershipTransferredEvent>;

export interface TokenDestinationsApprovedEventObject {}
export type TokenDestinationsApprovedEvent = TypedEvent<
  [],
  TokenDestinationsApprovedEventObject
>;

export type TokenDestinationsApprovedEventFilter =
  TypedEventFilter<TokenDestinationsApprovedEvent>;

export interface TokenDestinationsRevokedEventObject {}
export type TokenDestinationsRevokedEvent = TypedEvent<
  [],
  TokenDestinationsRevokedEventObject
>;

export type TokenDestinationsRevokedEventFilter =
  TypedEventFilter<TokenDestinationsRevokedEvent>;

export interface TokensReleasedEventObject {
  beneficiary: string;
  amount: BigNumber;
}
export type TokensReleasedEvent = TypedEvent<
  [string, BigNumber],
  TokensReleasedEventObject
>;

export type TokensReleasedEventFilter = TypedEventFilter<TokensReleasedEvent>;

export interface TokensRevokedEventObject {
  beneficiary: string;
  amount: BigNumber;
}
export type TokensRevokedEvent = TypedEvent<
  [string, BigNumber],
  TokensRevokedEventObject
>;

export type TokensRevokedEventFilter = TypedEventFilter<TokensRevokedEvent>;

export interface TokensWithdrawnEventObject {
  beneficiary: string;
  amount: BigNumber;
}
export type TokensWithdrawnEvent = TypedEvent<
  [string, BigNumber],
  TokensWithdrawnEventObject
>;

export type TokensWithdrawnEventFilter = TypedEventFilter<TokensWithdrawnEvent>;

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

  interface: IGraphTokenLockWalletToolshedInterface;

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

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

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

    currentBalance(overrides?: CallOverrides): Promise<[BigNumber]>;

    currentPeriod(overrides?: CallOverrides): Promise<[BigNumber]>;

    currentTime(overrides?: CallOverrides): Promise<[BigNumber]>;

    delegate(
      serviceProvider: PromiseOrValue<string>,
      tokens: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<ContractTransaction>;

    deprovision(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      nThawRequests: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<ContractTransaction>;

    duration(overrides?: CallOverrides): Promise<[BigNumber]>;

    endTime(overrides?: CallOverrides): Promise<[BigNumber]>;

    isRevoked(overrides?: CallOverrides): Promise<[boolean]>;

    managedAmount(overrides?: CallOverrides): Promise<[BigNumber]>;

    passedPeriods(overrides?: CallOverrides): Promise<[BigNumber]>;

    periodDuration(overrides?: CallOverrides): Promise<[BigNumber]>;

    periods(overrides?: CallOverrides): Promise<[BigNumber]>;

    provisionLocked(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      tokens: PromiseOrValue<BigNumberish>,
      maxVerifierCut: PromiseOrValue<BigNumberish>,
      thawingPeriod: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<ContractTransaction>;

    releasableAmount(overrides?: CallOverrides): Promise<[BigNumber]>;

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

    releaseStartTime(overrides?: CallOverrides): Promise<[BigNumber]>;

    releasedAmount(overrides?: CallOverrides): Promise<[BigNumber]>;

    revocable(overrides?: CallOverrides): Promise<[number]>;

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

    setDelegationFeeCut(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      paymentType: PromiseOrValue<BigNumberish>,
      feeCut: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<ContractTransaction>;

    setOperatorLocked(
      verifier: PromiseOrValue<string>,
      operator: PromiseOrValue<string>,
      allowed: PromiseOrValue<boolean>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<ContractTransaction>;

    setRewardsDestination(
      serviceProvider: PromiseOrValue<string>,
      rewardsDestination: PromiseOrValue<string>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<ContractTransaction>;

    sinceStartTime(overrides?: CallOverrides): Promise<[BigNumber]>;

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

    startTime(overrides?: CallOverrides): Promise<[BigNumber]>;

    surplusAmount(overrides?: CallOverrides): Promise<[BigNumber]>;

    thaw(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      tokens: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<ContractTransaction>;

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

    totalOutstandingAmount(overrides?: CallOverrides): Promise<[BigNumber]>;

    undelegate(
      serviceProvider: PromiseOrValue<string>,
      shares: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<ContractTransaction>;

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

    usedAmount(overrides?: CallOverrides): Promise<[BigNumber]>;

    vestedAmount(overrides?: CallOverrides): Promise<[BigNumber]>;

    vestingCliffTime(overrides?: CallOverrides): Promise<[BigNumber]>;

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

    "withdrawDelegated(address,address,uint256)"(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      nThawRequests: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<ContractTransaction>;

    "withdrawDelegated(address,address)"(
      indexer: PromiseOrValue<string>,
      __DEPRECATED_delegateToIndexer: PromiseOrValue<string>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<ContractTransaction>;

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

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

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

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

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

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

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

  delegate(
    serviceProvider: PromiseOrValue<string>,
    tokens: PromiseOrValue<BigNumberish>,
    overrides?: Overrides & { from?: PromiseOrValue<string> },
  ): Promise<ContractTransaction>;

  deprovision(
    serviceProvider: PromiseOrValue<string>,
    verifier: PromiseOrValue<string>,
    nThawRequests: PromiseOrValue<BigNumberish>,
    overrides?: Overrides & { from?: PromiseOrValue<string> },
  ): Promise<ContractTransaction>;

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

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

  isRevoked(overrides?: CallOverrides): Promise<boolean>;

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

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

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

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

  provisionLocked(
    serviceProvider: PromiseOrValue<string>,
    verifier: PromiseOrValue<string>,
    tokens: PromiseOrValue<BigNumberish>,
    maxVerifierCut: PromiseOrValue<BigNumberish>,
    thawingPeriod: PromiseOrValue<BigNumberish>,
    overrides?: Overrides & { from?: PromiseOrValue<string> },
  ): Promise<ContractTransaction>;

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

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

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

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

  revocable(overrides?: CallOverrides): Promise<number>;

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

  setDelegationFeeCut(
    serviceProvider: PromiseOrValue<string>,
    verifier: PromiseOrValue<string>,
    paymentType: PromiseOrValue<BigNumberish>,
    feeCut: PromiseOrValue<BigNumberish>,
    overrides?: Overrides & { from?: PromiseOrValue<string> },
  ): Promise<ContractTransaction>;

  setOperatorLocked(
    verifier: PromiseOrValue<string>,
    operator: PromiseOrValue<string>,
    allowed: PromiseOrValue<boolean>,
    overrides?: Overrides & { from?: PromiseOrValue<string> },
  ): Promise<ContractTransaction>;

  setRewardsDestination(
    serviceProvider: PromiseOrValue<string>,
    rewardsDestination: PromiseOrValue<string>,
    overrides?: Overrides & { from?: PromiseOrValue<string> },
  ): Promise<ContractTransaction>;

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

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

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

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

  thaw(
    serviceProvider: PromiseOrValue<string>,
    verifier: PromiseOrValue<string>,
    tokens: PromiseOrValue<BigNumberish>,
    overrides?: Overrides & { from?: PromiseOrValue<string> },
  ): Promise<ContractTransaction>;

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

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

  undelegate(
    serviceProvider: PromiseOrValue<string>,
    shares: PromiseOrValue<BigNumberish>,
    overrides?: Overrides & { from?: PromiseOrValue<string> },
  ): Promise<ContractTransaction>;

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

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

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

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

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

  "withdrawDelegated(address,address,uint256)"(
    serviceProvider: PromiseOrValue<string>,
    verifier: PromiseOrValue<string>,
    nThawRequests: PromiseOrValue<BigNumberish>,
    overrides?: Overrides & { from?: PromiseOrValue<string> },
  ): Promise<ContractTransaction>;

  "withdrawDelegated(address,address)"(
    indexer: PromiseOrValue<string>,
    __DEPRECATED_delegateToIndexer: PromiseOrValue<string>,
    overrides?: Overrides & { from?: PromiseOrValue<string> },
  ): Promise<ContractTransaction>;

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

  callStatic: {
    amountPerPeriod(overrides?: CallOverrides): Promise<BigNumber>;

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

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

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

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

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

    delegate(
      serviceProvider: PromiseOrValue<string>,
      tokens: PromiseOrValue<BigNumberish>,
      overrides?: CallOverrides,
    ): Promise<void>;

    deprovision(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      nThawRequests: PromiseOrValue<BigNumberish>,
      overrides?: CallOverrides,
    ): Promise<void>;

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

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

    isRevoked(overrides?: CallOverrides): Promise<boolean>;

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

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

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

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

    provisionLocked(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      tokens: PromiseOrValue<BigNumberish>,
      maxVerifierCut: PromiseOrValue<BigNumberish>,
      thawingPeriod: PromiseOrValue<BigNumberish>,
      overrides?: CallOverrides,
    ): Promise<void>;

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

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

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

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

    revocable(overrides?: CallOverrides): Promise<number>;

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

    setDelegationFeeCut(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      paymentType: PromiseOrValue<BigNumberish>,
      feeCut: PromiseOrValue<BigNumberish>,
      overrides?: CallOverrides,
    ): Promise<void>;

    setOperatorLocked(
      verifier: PromiseOrValue<string>,
      operator: PromiseOrValue<string>,
      allowed: PromiseOrValue<boolean>,
      overrides?: CallOverrides,
    ): Promise<void>;

    setRewardsDestination(
      serviceProvider: PromiseOrValue<string>,
      rewardsDestination: PromiseOrValue<string>,
      overrides?: CallOverrides,
    ): Promise<void>;

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

    stake(
      tokens: PromiseOrValue<BigNumberish>,
      overrides?: CallOverrides,
    ): Promise<void>;

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

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

    thaw(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      tokens: PromiseOrValue<BigNumberish>,
      overrides?: CallOverrides,
    ): Promise<string>;

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

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

    undelegate(
      serviceProvider: PromiseOrValue<string>,
      shares: PromiseOrValue<BigNumberish>,
      overrides?: CallOverrides,
    ): Promise<void>;

    unstake(
      tokens: PromiseOrValue<BigNumberish>,
      overrides?: CallOverrides,
    ): Promise<void>;

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

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

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

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

    "withdrawDelegated(address,address,uint256)"(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      nThawRequests: PromiseOrValue<BigNumberish>,
      overrides?: CallOverrides,
    ): Promise<void>;

    "withdrawDelegated(address,address)"(
      indexer: PromiseOrValue<string>,
      __DEPRECATED_delegateToIndexer: PromiseOrValue<string>,
      overrides?: CallOverrides,
    ): Promise<BigNumber>;

    withdrawSurplus(
      _amount: PromiseOrValue<BigNumberish>,
      overrides?: CallOverrides,
    ): Promise<void>;
  };

  filters: {
    "ManagerUpdated(address,address)"(
      _oldManager?: PromiseOrValue<string> | null,
      _newManager?: PromiseOrValue<string> | null,
    ): ManagerUpdatedEventFilter;
    ManagerUpdated(
      _oldManager?: PromiseOrValue<string> | null,
      _newManager?: PromiseOrValue<string> | null,
    ): ManagerUpdatedEventFilter;

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

    "TokenDestinationsApproved()"(): TokenDestinationsApprovedEventFilter;
    TokenDestinationsApproved(): TokenDestinationsApprovedEventFilter;

    "TokenDestinationsRevoked()"(): TokenDestinationsRevokedEventFilter;
    TokenDestinationsRevoked(): TokenDestinationsRevokedEventFilter;

    "TokensReleased(address,uint256)"(
      beneficiary?: PromiseOrValue<string> | null,
      amount?: null,
    ): TokensReleasedEventFilter;
    TokensReleased(
      beneficiary?: PromiseOrValue<string> | null,
      amount?: null,
    ): TokensReleasedEventFilter;

    "TokensRevoked(address,uint256)"(
      beneficiary?: PromiseOrValue<string> | null,
      amount?: null,
    ): TokensRevokedEventFilter;
    TokensRevoked(
      beneficiary?: PromiseOrValue<string> | null,
      amount?: null,
    ): TokensRevokedEventFilter;

    "TokensWithdrawn(address,uint256)"(
      beneficiary?: PromiseOrValue<string> | null,
      amount?: null,
    ): TokensWithdrawnEventFilter;
    TokensWithdrawn(
      beneficiary?: PromiseOrValue<string> | null,
      amount?: null,
    ): TokensWithdrawnEventFilter;
  };

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

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

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

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

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

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

    delegate(
      serviceProvider: PromiseOrValue<string>,
      tokens: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<BigNumber>;

    deprovision(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      nThawRequests: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<BigNumber>;

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

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

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

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

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

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

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

    provisionLocked(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      tokens: PromiseOrValue<BigNumberish>,
      maxVerifierCut: PromiseOrValue<BigNumberish>,
      thawingPeriod: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<BigNumber>;

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

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

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

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

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

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

    setDelegationFeeCut(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      paymentType: PromiseOrValue<BigNumberish>,
      feeCut: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<BigNumber>;

    setOperatorLocked(
      verifier: PromiseOrValue<string>,
      operator: PromiseOrValue<string>,
      allowed: PromiseOrValue<boolean>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<BigNumber>;

    setRewardsDestination(
      serviceProvider: PromiseOrValue<string>,
      rewardsDestination: PromiseOrValue<string>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<BigNumber>;

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

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

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

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

    thaw(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      tokens: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<BigNumber>;

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

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

    undelegate(
      serviceProvider: PromiseOrValue<string>,
      shares: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<BigNumber>;

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

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

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

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

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

    "withdrawDelegated(address,address,uint256)"(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      nThawRequests: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<BigNumber>;

    "withdrawDelegated(address,address)"(
      indexer: PromiseOrValue<string>,
      __DEPRECATED_delegateToIndexer: PromiseOrValue<string>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<BigNumber>;

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

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

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

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

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

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

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

    delegate(
      serviceProvider: PromiseOrValue<string>,
      tokens: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<PopulatedTransaction>;

    deprovision(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      nThawRequests: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<PopulatedTransaction>;

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

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

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

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

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

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

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

    provisionLocked(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      tokens: PromiseOrValue<BigNumberish>,
      maxVerifierCut: PromiseOrValue<BigNumberish>,
      thawingPeriod: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<PopulatedTransaction>;

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

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

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

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

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

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

    setDelegationFeeCut(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      paymentType: PromiseOrValue<BigNumberish>,
      feeCut: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<PopulatedTransaction>;

    setOperatorLocked(
      verifier: PromiseOrValue<string>,
      operator: PromiseOrValue<string>,
      allowed: PromiseOrValue<boolean>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<PopulatedTransaction>;

    setRewardsDestination(
      serviceProvider: PromiseOrValue<string>,
      rewardsDestination: PromiseOrValue<string>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<PopulatedTransaction>;

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

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

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

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

    thaw(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      tokens: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<PopulatedTransaction>;

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

    totalOutstandingAmount(
      overrides?: CallOverrides,
    ): Promise<PopulatedTransaction>;

    undelegate(
      serviceProvider: PromiseOrValue<string>,
      shares: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<PopulatedTransaction>;

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

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

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

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

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

    "withdrawDelegated(address,address,uint256)"(
      serviceProvider: PromiseOrValue<string>,
      verifier: PromiseOrValue<string>,
      nThawRequests: PromiseOrValue<BigNumberish>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<PopulatedTransaction>;

    "withdrawDelegated(address,address)"(
      indexer: PromiseOrValue<string>,
      __DEPRECATED_delegateToIndexer: PromiseOrValue<string>,
      overrides?: Overrides & { from?: PromiseOrValue<string> },
    ): Promise<PopulatedTransaction>;

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