Hardhat
安全帽無法辨識功能
我有一個簡單的契約:
//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