Ethers.js

ethers.js 如何使用列舉參數呼叫重載函式

  • May 26, 2022

Ethers 通常不允許您像這樣呼叫重載函式contract.overloaded(1),但它確實允許您使用像這樣的完全限定函式名來呼叫它contract["overloaded(uint)"](1)。但是,我現在有一個將 anenum作為輸入的函式,但我不知道如何為此進行完全限定的函式呼叫。考慮範例合約

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;
       }
   }
}

現在我可以呼叫非重載函式或沒有enums 作為參數的重載函式(都返回 0,表明enum唯一函式中的輸入被正確解析):

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()"]());

但是,如果我嘗試使用enum這樣的參數呼叫重載函式

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

或者像這樣

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

我總是收到類似**TypeError: myContract.overloaded(MyEnum) is not a functionor的錯誤TypeError: myContract.overloaded(enum) is not a function**。我在ethers 文件中也找不到呼叫重載函式的語法

好的,我找到了答案 - enums 在uint8內部被solidity 處理,所以myContract["overloaded(uint8)"](0)有效。把這個留在這裡,以防它幫助任何人。

引用自:https://ethereum.stackexchange.com/questions/129031