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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions