ethers.js 合约实例中没有 safeTransferFrom 函数?

Lig*_*orm 28 ethereum solidity openzeppelin ethers.js hardhat

我在安全帽控制台中创建了一个合约实例,如下所示:

\n
const contract_fac = await ethers.getContractFactory("ContractName");\nconst contract = await contract_fac.attach("CONTRACTADDR...");\n
Run Code Online (Sandbox Code Playgroud)\n

合约对象具有除 之外的所有公共/外部函数safeTransferFrom。为什么?

\n

当我用它调用它时,它contract.safeTransferFrom(\xe2\x80\xa6)会抛出 JavaScript 错误 \xe2\x80\x9csafeTransferFrom 不是函数\xe2\x80\x9d。这是一个错误还是我不明白什么?safeTransferFrom函数在 ABI 中列出。

\n

我使用未做任何更改的 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

错误的:

\n
contract.safeTransferFrom(addr1, addr2, 1);\n
Run Code Online (Sandbox Code Playgroud)\n

正确的:

\n
contract["safeTransferFrom(address,address,uint256)"](addr1, addr2, 1);\n
Run Code Online (Sandbox Code Playgroud)\n

tha*_*ech 20

(为了清晰起见,复制@Lightstorm的编辑)


safeTransferFrom是一个重载函数。在 ethers.js 中,调用重载合约函数的语法与调用非重载函数的语法不同。

重载函数需要通过指定函数签名来调用。

来自ethers.js文档:

// ethers
const abi = [
  "function getMessage(string) public view returns (string)",
  "function getMessage() public view returns (string)"
]
const contract = new ethers.Contract(address, abi, signer);

// for ambiguous functions (two functions with the same
// name), the signature must also be specified
message = await contract['getMessage(string)']('nice');
Run Code Online (Sandbox Code Playgroud)

所以对于问题中的例子:

错误的:

contract.safeTransferFrom(addr1, addr2, 1);

正确的:

contract["safeTransferFrom(address,address,uint256)"](addr1, addr2, 1);