12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- // SPDX-License-Identifier: MIT
- pragma solidity ^0.8.20;
- import {IERC721Receiver} from "../IERC721Receiver.sol";
- import {IERC721Errors} from "../../../interfaces/draft-IERC6093.sol";
- /**
- * @dev Library that provide common ERC-721 utility functions.
- *
- * See https://eips.ethereum.org/EIPS/eip-721[ERC-721].
- *
- * _Available since v5.1._
- */
- library ERC721Utils {
- /**
- * @dev Performs an acceptance check for the provided `operator` by calling {IERC721-onERC721Received}
- * on the `to` address. The `operator` is generally the address that initiated the token transfer (i.e. `msg.sender`).
- *
- * The acceptance call is not executed and treated as a no-op if the target address doesn't contain code (i.e. an EOA).
- * Otherwise, the recipient must implement {IERC721Receiver-onERC721Received} and return the acceptance magic value to accept
- * the transfer.
- */
- function checkOnERC721Received(
- address operator,
- address from,
- address to,
- uint256 tokenId,
- bytes memory data
- ) internal {
- if (to.code.length > 0) {
- try IERC721Receiver(to).onERC721Received(operator, from, tokenId, data) returns (bytes4 retval) {
- if (retval != IERC721Receiver.onERC721Received.selector) {
- // Token rejected
- revert IERC721Errors.ERC721InvalidReceiver(to);
- }
- } catch (bytes memory reason) {
- if (reason.length == 0) {
- // non-IERC721Receiver implementer
- revert IERC721Errors.ERC721InvalidReceiver(to);
- } else {
- assembly ("memory-safe") {
- revert(add(32, reason), mload(reason))
- }
- }
- }
- }
- }
- }
|