1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
pragma solidity >=0.8.2< 0.9.0;
import "./IERC721.sol";
contract ERC721 is IERC721 {
mapping (bytes4 => bool) supportsInterfaces; bytes4 invalID = 0xffffffff; bytes4 constant ERC165ID = 0x01ffc9a7; bytes4 constant ERC721ID = 0x80ac58cd;
mapping (address => uint256) ercTokenCount; mapping (uint256 => address) ercTokenOwner; mapping (uint256 => address) ercTokenApproved; mapping (address => mapping (address => bool)) ercOperatorForAll;
address private owner;
constructor() { _registerInterface(ERC165ID); _registerInterface(ERC721ID);
owner = msg.sender; }
modifier canOperator(uint256 _tokenId) { address _owner = ercTokenOwner[_tokenId]; require(msg.sender == _owner || ercOperatorForAll[owner][msg.sender], "ERC721: permission denied"); _; }
modifier canTransfer(uint256 _tokenId, address _from) { address _owner = ercTokenOwner[_tokenId]; require(_owner == _from, "ERC721: token owner is not _from"); require(msg.sender == owner || ercTokenApproved[_tokenId] == msg.sender || ercOperatorForAll[owner][msg.sender], "ERC721: permission denied"); _; }
function mint(address _to, uint256 _tokenId, bytes memory data) external { require(msg.sender == owner, "ERC721: caller is not owner"); require(_to != address(0), "ERC721: to is a zero address"); require(ercTokenOwner[_tokenId] == address(0), "ERC721: _tokenId. already exists");
ercTokenOwner[_tokenId] = _to; ercTokenCount[_to] += 1;
bytes4 result = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _to, _tokenId, data); require(result == ERC721TokenReceiver.onERC721Received.selector, "ERC721: result not equal onERC721Received interfaceID");
emit Transfer(address(0), _to, _tokenId); }
function _registerInterface(bytes4 interfaceID) internal { supportsInterfaces[interfaceID] = true; }
function supportsInterface(bytes4 interfaceID) override external view returns (bool) { require(interfaceID != invalID, "ERC721: invalid interfaceID"); return supportsInterfaces[interfaceID]; }
function balanceOf(address _owner) override external view returns (uint256) { return ercTokenCount[_owner]; }
function ownerOf(uint256 _tokenId) override external view returns (address) { return ercTokenOwner[_tokenId]; }
function approve(address _approved, uint256 _tokenId) override canOperator(_tokenId) external payable { ercTokenApproved[_tokenId] = _approved;
emit Approval(msg.sender, _approved, _tokenId); }
function setApprovalForAll(address _operator, bool _approved) override external { ercOperatorForAll[msg.sender][_operator] = _approved;
emit ApprovalForAll(msg.sender, _operator, _approved); }
function getApproved(uint256 _tokenId) override external view returns (address) { return ercTokenApproved[_tokenId]; }
function isApprovedForAll(address _owner, address _operator) override external view returns (bool) { return ercOperatorForAll[_owner][_operator]; }
function transferFrom(address _from, address _to, uint256 _tokenId) override external payable { _transferFrom(_from, _to, _tokenId); }
function _transferFrom(address _from, address _to, uint256 _tokenId) internal canTransfer(_tokenId, _from) { ercTokenOwner[_tokenId] = _to; ercTokenCount[_from] -= 1; ercTokenCount[_to] += 1; ercTokenApproved[_tokenId] = address(0);
emit Transfer(_from, _to, _tokenId); }
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) override external payable { _safeTransferFrom(_from, _to, _tokenId, data); }
function safeTransferFrom(address _from, address _to, uint256 _tokenId) override external payable { _safeTransferFrom(_from, _to, _tokenId, ""); }
function _safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) internal { _transferFrom(_from, _to, _tokenId);
bytes4 result = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, data); require(result == ERC721TokenReceiver.onERC721Received.selector, "ERC721: result not equal onERC721Received interfaceID"); } }
|