Skip to content

Generated factory import unnecessary Provider from ethers when there is a contract named Provider #904

@trongthanht3

Description

@trongthanht3

I have a contract named Provider. When I generate Typechain with target=ethers-v6, Provider_factory will unnecessarily import Provider from ethers. I checked other contracts, but there’s no Provider imported.

This is my contract:

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.20;

contract Provider {
    uint public someNumber;

    event SomethingChanged(uint newNumber);

    event Withdrawal(uint amount, uint when);

    constructor() {}

    function changeSomething(uint newNumber) public {
        someNumber = newNumber;
        emit SomethingChanged(newNumber);
    }
}

Import part of Provider__factory.ts:

/* Autogenerated file. Do not edit manually. */
/* tslint:disable */
/* eslint-disable */
import {
  Contract,
  ContractFactory,
  ContractTransactionResponse,
  Interface,
} from "ethers";
import type {
  Signer,
  ContractDeployTransaction,
  Provider,
  ContractRunner,
} from "ethers";
import type { NonPayableOverrides } from "../common";
import type { Provider, ProviderInterface } from "../Provider";

const _abi = [
  {
    inputs: [],
    stateMutability: "nonpayable",
    type: "constructor",
  },
  {
    anonymous: false,
    inputs: [
      {
        indexed: false,
        internalType: "uint256",
        name: "newNumber",
        type: "uint256",
...

I think this is a bug in Typechain. This incorrect import will lead to an error and an ambiguous type for the Provider when used in other scripts. 2 errors in Provider__factory.ts

  • Duplicate identifier 'Provider'.
  • Property 'deploy' in type 'Provider__factory' is not assignable to the same property in base type 'ContractFactory<any[], BaseContract>'. Type '(overrides?: (NonPayableOverrides & { from?: string | undefined; }) | undefined) => Promise<Provider & { deploymentTransaction(): ContractTransactionResponse; }>' is not assignable to type '(...args: ContractMethodArgs<any[]>) => Promise<BaseContract & { deploymentTransaction(): ContractTransactionResponse; } & Omit<...>>'. Type 'Promise<Provider & { deploymentTransaction(): ContractTransactionResponse; }>' is not assignable to type 'Promise<BaseContract & { deploymentTransaction(): ContractTransactionResponse; } & Omit<BaseContract, keyof BaseContract>>'. Type 'Provider & { deploymentTransaction(): ContractTransactionResponse; }' is not assignable to type 'BaseContract & { deploymentTransaction(): ContractTransactionResponse; } & Omit<BaseContract, keyof BaseContract>'. Type 'Provider & { deploymentTransaction(): ContractTransactionResponse; }' is missing the following properties from type 'BaseContract': target, interface, runner, filters, and 11 more.

My environment:

    "@typechain/ethers-v6": "^0.5.1",
    "ethers": "^6.13.2",
    "hardhat": "^2.22.8",

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions