在合约中调用IERC712(address).safeTransferFrom的话,
IERC721(address)可以是实现IERC721接口的任何合同地址 因此,在函数中调用IERC721(address)safetransferfrom(msg sender,address(this)nfttokenid)可能会带来危险的影响.
那么如何检查并确保address指定的合同是一个标准IERC721合约.?
判断一个地址符不符合某个标准,就是看他是否实现了对应的函数。
ERC721 实现了 ERC165 标准, 因此可以查询用 supportsInterface(bytes4 _interfaceId)
查询到其实现了哪些接口。
ERC721 有这些接口:
bytes4 private constant _InterfaceId_ERC721 = 0x80ac58cd;
/*
* 0x80ac58cd ===
* bytes4(keccak256('balanceOf(address)')) ^
* bytes4(keccak256('ownerOf(uint256)')) ^
* bytes4(keccak256('approve(address,uint256)')) ^
* bytes4(keccak256('getApproved(uint256)')) ^
* bytes4(keccak256('setApprovalForAll(address,bool)')) ^
* bytes4(keccak256('isApprovedForAll(address,address)')) ^
* bytes4(keccak256('transferFrom(address,address,uint256)')) ^
* bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^
* bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'))
*/
可以调用
IERC721(contractAddress).supportsInterface(0x80ac58cd)
来检查。
ERC20 没有很好的方法, 只能尝试调用(用call 调用),检查返回值,看看有没有对应的方法。