Ethers.js – How to Call an Overloaded Function with Enum Argument

enumethers.jshardhat

Ethers generally doesn't let you call an overloaded function like this contract.overloaded(1), but it does let you call it with a fully qualified function name like this contract["overloaded(uint)"](1). However, I now have a function that takes an enum as an input, and I don't know how to do a fully qualified function call for that. Consider the example contract

pragma solidity ^0.8.6;


contract MyContract {
    enum MyEnum{ ZERO, ONE}

    function unique(MyEnum _enum) public view returns(uint) {
        if (_enum == MyEnum.ZERO) {
            return 0;
        } else {
            return 1;
        }
    }

    function overloaded() public view returns(uint) {
        return 0;
    }

    function overloaded(MyEnum _enum) public view returns(uint) {
        if (_enum == MyEnum.ZERO) {
            return 0;
        } else {
            return 1;
        }
    }
}

Now I can call non-overloaded functions or overloaded functions that don't have enums as arguments (both return 0, showing that the enum input in the unique function is parsed correctly):

const ethers = require("ethers");
const MyContract = await ethers.getContractFactory("MyContract");
myContract = await MyContract.deploy();
await myContract.deployed();

console.log(await myContract.unique(0));
console.log(await myContract["overloaded()"]());

However, if I try calling the overloaded function with an enum argument like this

console.log(await myContract["overloaded(MyEnum)"](0));

or like this

console.log(await myContract["overloaded(enum)"](0));

I always get errors like TypeError: myContract.overloaded(MyEnum) is not a function or TypeError: myContract.overloaded(enum) is not a function. I couldn't find the syntax for calling overloaded functions in the ethers documentation either

Best Answer

Ok, I found the answer - enums are treated as uint8 internally by solidity, so myContract["overloaded(uint8)"](0) works. Leaving this here in case it helps anyone.

Related Topic