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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
|
pragma solidity >= 0.8.20 < 0.9.0;
import "./IERC1155.sol"; import "./IERC165.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
contract ERC1155 is IERC165, IERC1155, IERC1155MetadataURI {
using Strings for uint256; string public name; string public symbol; mapping (address => mapping (uint256 => uint256)) public _balanceOf; mapping (address => mapping (address => bool)) public _isApprovedForAll;
constructor(string memory name_, string memory symbol_) { name = name_; symbol = symbol_; }
function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) override external { require(msg.sender == _from || _isApprovedForAll[_from][msg.sender], "ERC1155: not approved!"); require(_to != address(0), "ERC1155: to is a zero address");
_balanceOf[_from][_id] -= _value; _balanceOf[_to][_id] += _value;
emit TransferSingle(msg.sender, _from, _to, _id, _value);
if (_to.code.length > 0) { require( IERC1155TokenReceiver(_to).onERC1155Received(msg.sender, _from, _id, _value, _data) == IERC1155TokenReceiver.onERC1155Received.selector, "ERC1155: unsaft transfer!" ); } }
function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) override external { require(msg.sender == _from || _isApprovedForAll[_from][msg.sender], "ERC1155: not approved!"); require(_to != address(0), "ERC1155: to is a zero address"); require(_ids.length == _values.length, "ERC1155: _ids length != _values length!");
for (uint256 i = 0; i < _ids.length; i++) { _balanceOf[_from][_ids[i]] -= _values[i]; _balanceOf[_to][_ids[i]] += _values[i]; }
emit TransferBatch(msg.sender, _from, _to, _ids, _values);
if (_to.code.length > 0 ) { require( IERC1155TokenReceiver(_to).onERC1155BatchReceived(msg.sender, _from, _ids, _values, _data) == IERC1155TokenReceiver.onERC1155BatchReceived.selector, "ERC1155: unsaft transfer!" ); } }
function balanceOf(address _owner, uint256 _id) override external view returns (uint256) { require(_owner != address(0), "ERC1155: address zero is not a vaild owner!"); return _balanceOf[_owner][_id]; }
function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) override external view returns (uint256[] memory balances) { require(_owners.length == _ids.length, "ERC1155: owner length != ids length!");
balances = new uint256[](_owners.length);
unchecked { for (uint256 i = 0; i < _owners.length; i++) { balances[i] = _balanceOf[_owners[i]][_ids[i]]; } }
}
function setApprovalForAll(address _operator, bool _approved) override external { _isApprovedForAll[msg.sender][_operator] = _approved;
emit ApprovalForAll(msg.sender, _operator, _approved); }
function isApprovedForAll(address _owner, address _operator) override external view returns (bool) { return _isApprovedForAll[_owner][_operator]; }
function supportsInterface(bytes4 interfaceID) override external pure returns (bool) { return interfaceID == type(IERC1155).interfaceId || interfaceID == type(IERC1155MetadataURI).interfaceId || interfaceID == type(IERC165).interfaceId; }
function uri(uint256 _id) override external view returns (string memory) { string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, _id.toString())) : ""; }
function _baseURI() internal view virtual returns (string memory) { return ""; }
function _mint(address _to, uint256 _id, uint256 _value, bytes memory _data) internal { require(_to != address(0), "ERC1155: _to is a zero address");
_balanceOf[_to][_id] += _value;
emit TransferSingle(msg.sender, address(0), _to, _id, _value);
if (_to.code.length > 0) { require( IERC1155TokenReceiver(_to).onERC1155Received(msg.sender, address(0), _id, _value, _data) == IERC1155TokenReceiver.onERC1155Received.selector, "ERC1155: unsaft transfer!" ); } }
function _batchMint(address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) internal { require(_to != address(0), "ERC1155: _to is a zero address"); require(_ids.length == _values.length, "ERC1155: _ids length != _values length!");
for (uint256 i = 0; i < _ids.length; i++) { _balanceOf[_to][_ids[i]] += _values[i]; }
emit TransferBatch(msg.sender, address(0), _to, _ids, _values);
if (_to.code.length > 0) { require( IERC1155TokenReceiver(_to).onERC1155BatchReceived(msg.sender, address(0), _ids, _values, _data) == IERC1155TokenReceiver.onERC1155BatchReceived.selector, "ERC1155: unsaft transfer!" ); } }
function _burn(address _from, uint256 _id, uint256 _value) internal { require(_from != address(0), "ERC1155: _from is a zero address"); _balanceOf[_from][_id] -= _value;
emit TransferSingle(msg.sender, _from, address(0), _id, _value); }
function _batchBurn(address _from, uint256[] calldata _ids, uint256[] calldata _values) internal { require(_from != address(0), "ERC1155: _from is a zero address"); require(_ids.length == _values.length, "ERC1155: _ids length != _values length!");
for (uint256 i = 0; i < _ids.length; i++) { _balanceOf[_from][_ids[i]] -= _values[i]; }
emit TransferBatch(msg.sender, _from, address(0), _ids, _values); } }
|