我在安全帽控制台中创建了一个合约实例,如下所示:
\nconst contract_fac = await ethers.getContractFactory("ContractName");\nconst contract = await contract_fac.attach("CONTRACTADDR...");\nRun Code Online (Sandbox Code Playgroud)\n合约对象具有除 之外的所有公共/外部函数safeTransferFrom。为什么?
当我用它调用它时,它contract.safeTransferFrom(\xe2\x80\xa6)会抛出 JavaScript 错误 \xe2\x80\x9csafeTransferFrom 不是函数\xe2\x80\x9d。这是一个错误还是我不明白什么?safeTransferFrom函数在 ABI 中列出。
我使用未做任何更改的 OpenZeppelin (v. 4.2) 721 令牌模板、Ethers.js (v. 5.4.1) 和 Hardhat (v. 2.4.1)。
\n更新: \n问题已解决。safeTransferFrom 是一个重载函数。在 ethers 中,调用重载合约函数的语法与非重载函数不同。\n Ethers.js doc
\n错误的:
\ncontract.safeTransferFrom(addr1, addr2, 1);\nRun Code Online (Sandbox Code Playgroud)\n正确的:
\ncontract["safeTransferFrom(address,address,uint256)"](addr1, addr2, 1);\nRun Code Online (Sandbox Code Playgroud)\n