Hardhat

安全帽無法辨識功能

  • December 28, 2021

我有一個簡單的契約:

//SPDX-License-Identifier: Unlicensed
pragma solidity 0.8.9;

import '@openzeppelin/contracts-upgradeable/finance/VestingWalletUpgradeable.sol';

contract VestingWallet is VestingWalletUpgradeable {

   function initialize(address beneficiaryAddress, uint64 startTimestamp, uint64 durationSeconds) external initializer {
       __VestingWallet_init(beneficiaryAddress, startTimestamp, durationSeconds);
   }
}

在我的測試中,我不能在契約上呼叫一些方法:

# these do work
expect(await wallet.beneficiary()).to.eq(beneficiaryAddress);
expect(await wallet.start()).to.eq(now);
expect(await wallet.duration()).to.eq(2);

# this (and others) do not work
expect(await wallet.released()).to.eq(utils.parseEther("0"));

錯誤是

error TS2551: Property 'released' does not exist on type 'VestingWallet'. Did you mean 'released()'?

我已經發現在生成的類型中似乎不起作用的那些是引號(綠色有效,紅色無效):

在此處輸入圖像描述

因此起作用的是

expect(await wallet["released()"]()).to.eq(utils.parseEther("0"));

為什麼會出現這種情況以及如何規避它?

問題是函式的名稱不是唯一的。例如,您有一個released沒有參數和一個地址參數。因此,您需要指定使用哪一個。據我所知,ethers 無法自動檢測到這一點(也因為在某些情況下這是模棱兩可的,例如example(address)example(uint160))。如果您確保這些功能中的每一個都是唯一的,則預設方式將再次起作用。

有關此的更多詳細資訊:https ://github.com/ethers-io/ethers.js/issues/407

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