/* Autogenerated file. Do not edit manually. */
/* tslint:disable */
/* eslint-disable */
import type {
  BaseContract,
  BigNumberish,
  BytesLike,
  FunctionFragment,
  Result,
  Interface,
  EventFragment,
  ContractRunner,
  ContractMethod,
  Listener,
} from "ethers";
import type {
  TypedContractEvent,
  TypedDeferredTopicFilter,
  TypedEventLog,
  TypedLogDescription,
  TypedListener,
  TypedContractMethod,
} from "../../common";

export type HEADRequestStruct = {
  path: string;
  ifModifiedSince: BigNumberish;
  ifNoneMatch: BytesLike;
};

export type HEADRequestStructOutput = [
  path: string,
  ifModifiedSince: bigint,
  ifNoneMatch: string
] & { path: string; ifModifiedSince: bigint; ifNoneMatch: string };

export type RangeStruct = { start: BigNumberish; end: BigNumberish };

export type RangeStructOutput = [start: bigint, end: bigint] & {
  start: bigint;
  end: bigint;
};

export type LOCATERequestStruct = {
  head: HEADRequestStruct;
  rangeChunks: RangeStruct;
};

export type LOCATERequestStructOutput = [
  head: HEADRequestStructOutput,
  rangeChunks: RangeStructOutput
] & { head: HEADRequestStructOutput; rangeChunks: RangeStructOutput };

export type CacheControlStruct = {
  immutableFlag: boolean;
  preset: BigNumberish;
  custom: string;
};

export type CacheControlStructOutput = [
  immutableFlag: boolean,
  preset: bigint,
  custom: string
] & { immutableFlag: boolean; preset: bigint; custom: string };

export type CORSPolicyStruct = {
  methods: BigNumberish;
  origins: BytesLike[];
  preset: BigNumberish;
  custom: string;
};

export type CORSPolicyStructOutput = [
  methods: bigint,
  origins: string[],
  preset: bigint,
  custom: string
] & { methods: bigint; origins: string[]; preset: bigint; custom: string };

export type RedirectStruct = { code: BigNumberish; location: string };

export type RedirectStructOutput = [code: bigint, location: string] & {
  code: bigint;
  location: string;
};

export type HeaderInfoStruct = {
  cache: CacheControlStruct;
  cors: CORSPolicyStruct;
  redirect: RedirectStruct;
};

export type HeaderInfoStructOutput = [
  cache: CacheControlStructOutput,
  cors: CORSPolicyStructOutput,
  redirect: RedirectStructOutput
] & {
  cache: CacheControlStructOutput;
  cors: CORSPolicyStructOutput;
  redirect: RedirectStructOutput;
};

export type ResourcePropertiesStruct = {
  mimeType: BytesLike;
  charset: BytesLike;
  encoding: BytesLike;
  language: BytesLike;
};

export type ResourcePropertiesStructOutput = [
  mimeType: string,
  charset: string,
  encoding: string,
  language: string
] & { mimeType: string; charset: string; encoding: string; language: string };

export type ResourceMetadataStruct = {
  properties: ResourcePropertiesStruct;
  size: BigNumberish;
  version: BigNumberish;
  lastModified: BigNumberish;
  header: BytesLike;
};

export type ResourceMetadataStructOutput = [
  properties: ResourcePropertiesStructOutput,
  size: bigint,
  version: bigint,
  lastModified: bigint,
  header: string
] & {
  properties: ResourcePropertiesStructOutput;
  size: bigint;
  version: bigint;
  lastModified: bigint;
  header: string;
};

export type HEADResponseStruct = {
  status: BigNumberish;
  headerInfo: HeaderInfoStruct;
  metadata: ResourceMetadataStruct;
  etag: BytesLike;
};

export type HEADResponseStructOutput = [
  status: bigint,
  headerInfo: HeaderInfoStructOutput,
  metadata: ResourceMetadataStructOutput,
  etag: string
] & {
  status: bigint;
  headerInfo: HeaderInfoStructOutput;
  metadata: ResourceMetadataStructOutput;
  etag: string;
};

export type ResourceResponseStruct = {
  dataPoints: BytesLike[];
  totalChunks: BigNumberish;
};

export type ResourceResponseStructOutput = [
  dataPoints: string[],
  totalChunks: bigint
] & { dataPoints: string[]; totalChunks: bigint };

export type LOCATEResponseStruct = {
  head: HEADResponseStruct;
  resource: ResourceResponseStruct;
};

export type LOCATEResponseStructOutput = [
  head: HEADResponseStructOutput,
  resource: ResourceResponseStructOutput
] & { head: HEADResponseStructOutput; resource: ResourceResponseStructOutput };

export type OPTIONSResponseStruct = {
  status: BigNumberish;
  allow: BigNumberish;
};

export type OPTIONSResponseStructOutput = [status: bigint, allow: bigint] & {
  status: bigint;
  allow: bigint;
};

export interface WTTPForwarderInterface extends Interface {
  getFunction(
    nameOrSignature:
      | "ALLOWED_METHODS"
      | "GET"
      | "HEAD"
      | "OPTIONS"
      | "baseURL"
      | "redirectCode"
  ): FunctionFragment;

  getEvent(nameOrSignatureOrTopic: "RedirectConfigUpdated"): EventFragment;

  encodeFunctionData(
    functionFragment: "ALLOWED_METHODS",
    values?: undefined
  ): string;
  encodeFunctionData(
    functionFragment: "GET",
    values: [LOCATERequestStruct]
  ): string;
  encodeFunctionData(
    functionFragment: "HEAD",
    values: [HEADRequestStruct]
  ): string;
  encodeFunctionData(functionFragment: "OPTIONS", values: [string]): string;
  encodeFunctionData(functionFragment: "baseURL", values?: undefined): string;
  encodeFunctionData(
    functionFragment: "redirectCode",
    values?: undefined
  ): string;

  decodeFunctionResult(
    functionFragment: "ALLOWED_METHODS",
    data: BytesLike
  ): Result;
  decodeFunctionResult(functionFragment: "GET", data: BytesLike): Result;
  decodeFunctionResult(functionFragment: "HEAD", data: BytesLike): Result;
  decodeFunctionResult(functionFragment: "OPTIONS", data: BytesLike): Result;
  decodeFunctionResult(functionFragment: "baseURL", data: BytesLike): Result;
  decodeFunctionResult(
    functionFragment: "redirectCode",
    data: BytesLike
  ): Result;
}

export namespace RedirectConfigUpdatedEvent {
  export type InputTuple = [baseURL: string, redirectCode: BigNumberish];
  export type OutputTuple = [baseURL: string, redirectCode: bigint];
  export interface OutputObject {
    baseURL: string;
    redirectCode: bigint;
  }
  export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
  export type Filter = TypedDeferredTopicFilter<Event>;
  export type Log = TypedEventLog<Event>;
  export type LogDescription = TypedLogDescription<Event>;
}

export interface WTTPForwarder extends BaseContract {
  connect(runner?: ContractRunner | null): WTTPForwarder;
  waitForDeployment(): Promise<this>;

  interface: WTTPForwarderInterface;

  queryFilter<TCEvent extends TypedContractEvent>(
    event: TCEvent,
    fromBlockOrBlockhash?: string | number | undefined,
    toBlock?: string | number | undefined
  ): Promise<Array<TypedEventLog<TCEvent>>>;
  queryFilter<TCEvent extends TypedContractEvent>(
    filter: TypedDeferredTopicFilter<TCEvent>,
    fromBlockOrBlockhash?: string | number | undefined,
    toBlock?: string | number | undefined
  ): Promise<Array<TypedEventLog<TCEvent>>>;

  on<TCEvent extends TypedContractEvent>(
    event: TCEvent,
    listener: TypedListener<TCEvent>
  ): Promise<this>;
  on<TCEvent extends TypedContractEvent>(
    filter: TypedDeferredTopicFilter<TCEvent>,
    listener: TypedListener<TCEvent>
  ): Promise<this>;

  once<TCEvent extends TypedContractEvent>(
    event: TCEvent,
    listener: TypedListener<TCEvent>
  ): Promise<this>;
  once<TCEvent extends TypedContractEvent>(
    filter: TypedDeferredTopicFilter<TCEvent>,
    listener: TypedListener<TCEvent>
  ): Promise<this>;

  listeners<TCEvent extends TypedContractEvent>(
    event: TCEvent
  ): Promise<Array<TypedListener<TCEvent>>>;
  listeners(eventName?: string): Promise<Array<Listener>>;
  removeAllListeners<TCEvent extends TypedContractEvent>(
    event?: TCEvent
  ): Promise<this>;

  ALLOWED_METHODS: TypedContractMethod<[], [bigint], "view">;

  GET: TypedContractMethod<
    [getRequest: LOCATERequestStruct],
    [LOCATEResponseStructOutput],
    "view"
  >;

  HEAD: TypedContractMethod<
    [headRequest: HEADRequestStruct],
    [HEADResponseStructOutput],
    "view"
  >;

  OPTIONS: TypedContractMethod<
    [arg0: string],
    [OPTIONSResponseStructOutput],
    "view"
  >;

  baseURL: TypedContractMethod<[], [string], "view">;

  redirectCode: TypedContractMethod<[], [bigint], "view">;

  getFunction<T extends ContractMethod = ContractMethod>(
    key: string | FunctionFragment
  ): T;

  getFunction(
    nameOrSignature: "ALLOWED_METHODS"
  ): TypedContractMethod<[], [bigint], "view">;
  getFunction(
    nameOrSignature: "GET"
  ): TypedContractMethod<
    [getRequest: LOCATERequestStruct],
    [LOCATEResponseStructOutput],
    "view"
  >;
  getFunction(
    nameOrSignature: "HEAD"
  ): TypedContractMethod<
    [headRequest: HEADRequestStruct],
    [HEADResponseStructOutput],
    "view"
  >;
  getFunction(
    nameOrSignature: "OPTIONS"
  ): TypedContractMethod<[arg0: string], [OPTIONSResponseStructOutput], "view">;
  getFunction(
    nameOrSignature: "baseURL"
  ): TypedContractMethod<[], [string], "view">;
  getFunction(
    nameOrSignature: "redirectCode"
  ): TypedContractMethod<[], [bigint], "view">;

  getEvent(
    key: "RedirectConfigUpdated"
  ): TypedContractEvent<
    RedirectConfigUpdatedEvent.InputTuple,
    RedirectConfigUpdatedEvent.OutputTuple,
    RedirectConfigUpdatedEvent.OutputObject
  >;

  filters: {
    "RedirectConfigUpdated(string,uint16)": TypedContractEvent<
      RedirectConfigUpdatedEvent.InputTuple,
      RedirectConfigUpdatedEvent.OutputTuple,
      RedirectConfigUpdatedEvent.OutputObject
    >;
    RedirectConfigUpdated: TypedContractEvent<
      RedirectConfigUpdatedEvent.InputTuple,
      RedirectConfigUpdatedEvent.OutputTuple,
      RedirectConfigUpdatedEvent.OutputObject
    >;
  };
}
