import type {
  createFixtureLoader,
  link,
  loadFixture,
  MockContract,
  MockProvider,
  solidity,
} from "ethereum-waffle";
import type { ContractJSON } from "ethereum-waffle/dist/esm/src/ContractJSON";
import type { Contract, providers, Signer } from "ethers";

import "hardhat/types/runtime";

export interface HardhatWaffle {
  provider: MockProvider;
  deployContract: (
    signer: Signer,
    contractJSON: ContractJSON,
    args?: any[],
    overrideOptions?: providers.TransactionRequest
  ) => Promise<Contract>;
  solidity: typeof solidity;
  link: typeof link;
  deployMockContract: (signer: Signer, abi: any[]) => Promise<MockContract>;
  createFixtureLoader: typeof createFixtureLoader;
  loadFixture: typeof loadFixture;
}

declare module "hardhat/types/runtime" {
  interface HardhatRuntimeEnvironment {
    waffle: HardhatWaffle;
  }
}
