簡體   English   中英

如何測試合約接收 ERC721 代幣的能力?

[英]How to test a contract's ability to receive an ERC721 token?

我正在 Truffle 測試我的合同。 我啟用了合約以接收 ERC721 代幣:

function onERC721Received(address, address _from, uint256 _tokenId, bytes calldata) external override returns(bytes4) {
    nftContract = ERC721(msg.sender);
    tokenId = _tokenId;
    tokenAdded = true;

    return 0x150b7a02;
}

有沒有辦法使用 Mocha 和 Chai 模擬發送到該合約的代幣?

在 EVM 之外(例如在 JS 測試中),無法檢查事務的返回值。 只有它的狀態(成功/恢復),發出的事件(在你的情況下不是)和其他一些元數據。 您還可以檢查調用的返回值,如assert.equal語句。

contract('MyContract', () => {
    it('receives a token', async () => {
        const tx = await myContract.onERC721Received(
            '0x123',      // address
            '0x456',      // address _from
            1,            // uint256 _tokenId
            [0x01, 0x02]  // bytes calldata
        );

        assert.equal(tx.receipt.status, true); // tx succeeded

        assert.equal(await contract.nftContract, '0x123');
        assert.equal((await contract.tokenId).toNumber(), 1);
        assert.equal(await contract.tokenAdded, true);
    });
});

文件:

  • 松露contract而不是 Mocha describe - 文檔
  • 收據狀態 - Truffle docs 、Web3 docs (Truffle docs 中指向 Web3 的鏈接已過時)
  • 不必在 Truffle 中使用.send()或 .call( .call() ,因為它會從合約 ABI 中自動選擇 tx 或調用 - 文檔

我也在我的測試中使用 ERC721 模擬合約對此進行了測試。 所以我部署兩個合約並為它們創建新實例,然后從 ERC721 調用 mint 函數到被測合約地址。 然后檢查 ERC721 的余額:

ERC721.balanceOf(underTest.address, 1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM