function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}发布于 2022-01-12 06:14:44
If通常在令牌被传输后调用(在相同的tx中)。
如果令牌的接收方是契约,则检查契约是否实现了onERC721Received接口。
如果不是,它将恢复事务。
如果是,则接收方合同有一个onERC721Received方法。ERC721调用这个方法,现在执行到接收方合同中去做他想做的任何事情。例如-对接收到的令牌进行托管。或者更危险的是-重新进入统721控制系统.
在接收方令牌的onERC721Received完成后,将在ERC721合同中恢复执行。
https://ethereum.stackexchange.com/questions/118682
复制相似问题