ERC-1155
Overview
Max Total Supply
680
Holders
249
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Achievements
Compiler Version
v0.8.14+commit.80d49f37
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.14; import "openzeppelin/utils/Strings.sol"; import "solmate/tokens/ERC1155.sol"; import "./Owned.sol"; /// @title Solarbots Achievements /// @author Solarbots (https://solarbots.io) /// @notice All achievements are soulbound, /// i.e. can't be transferred by the token owner. /// Only approved operators can mint, transfer, and burn /// tokens. Token owners can only burn their own tokens. contract Achievements is ERC1155, Owned { // ---------- CONSTANTS ---------- /// @dev "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)"))) bytes32 private constant _ERROR_FUNCTION_SIGNATURE = 0x08c379a000000000000000000000000000000000000000000000000000000000; /// @dev bytes32(abi.encodePacked("INSUFFICIENT_BALANCE")) bytes32 private constant _INSUFFICIENT_BALANCE_MESSAGE = 0x494e53554646494349454e545f42414c414e4345000000000000000000000000; /// @dev "INSUFFICIENT_BALANCE" is 20 characters long uint256 private constant _INSUFFICIENT_BALANCE_LENGTH = 20; // ---------- STATE ---------- /// @notice Metadata base URI string public baseURI; /// @notice Metadata URI suffix string public uriSuffix; // ---------- CONSTRUCTOR ---------- /// @param owner Contract owner constructor(address owner) Owned(owner) {} // ---------- METADATA ---------- /// @notice Get metadata URI /// @param id Token ID /// @return Metadata URI of token ID `id` function uri(uint256 id) public view override returns (string memory) { require(bytes(baseURI).length > 0, "NO_METADATA"); return string(abi.encodePacked(baseURI, Strings.toString(id), uriSuffix)); } /// @notice Set metadata base URI /// @param _baseURI New metadata base URI /// @dev Doesn't emit URI event, because `id` argument isn't used function setBaseURI(string calldata _baseURI) public onlyOwner { baseURI = _baseURI; } /// @notice Set metadata URI suffix /// @param _uriSuffix New metadata URI suffix /// @dev Doesn't emit URI event, because `id` argument isn't used function setURISuffix(string calldata _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } // ---------- APPROVAL ---------- /// @notice Grants or revokes permission to `operator` to transfer tokens /// @dev Only callable by contract owner /// @param operator Operator address /// @param approved Whether to grant or revoke permission function setApprovalForAll( address operator, bool approved ) public virtual override onlyOwner { isApprovedForAll[address(0)][operator] = approved; emit ApprovalForAll(address(0), operator, approved); } // ---------- TRANSFER ---------- function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) public virtual override { require(isApprovedForAll[address(0)][msg.sender], "NOT_AUTHORIZED"); // Use assembly to perform optimized balance updates // Same balance updates in unoptimized Solidity: // // balanceOf[from][id] -= amount; // balanceOf[to][id] += amount; // /// @solidity memory-safe-assembly assembly { // Calculate the storage slot of `balanceOf[from]` // by concatenating the `from` address and the // slot of `balanceOf` in the scratch space used // by hashing methods, i.e. the first two 32 bytes // of memory. The keccak256 hash of the concatenated // values is the storage slot we're looking for. mstore(0x00, from) mstore(0x20, balanceOf.slot) let balanceOfFromSlot := keccak256(0x00, 0x40) // Calculate storage slot of `balanceOf[to]` mstore(0x00, to) // 0x20 still contains `balanceOf.slot` let balanceOfToSlot := keccak256(0x00, 0x40) // Calculate storage slot of `balanceOf[from][id]` mstore(0x00, id) mstore(0x20, balanceOfFromSlot) let amountFromSlot := keccak256(0x00, 0x40) // Calculate storage slot of `balanceOf[to][id]` // 0x00 still contains current id mstore(0x20, balanceOfToSlot) let amountToSlot := keccak256(0x00, 0x40) // Load amount currently stored in `balanceOf[from][id]` let currentAmountFrom := sload(amountFromSlot) // Revert with message "INSUFFICIENT_BALANCE" if the // transfer amount is greater than the current amount // of `from` to prevent an integer underflow if gt(amount, currentAmountFrom) { let freeMemory := mload(0x40) // Store "Error(string)" signature mstore(freeMemory, _ERROR_FUNCTION_SIGNATURE) // Store data offset mstore(add(freeMemory, 0x04), 0x20) // Store length of revert string mstore(add(freeMemory, 0x24), _INSUFFICIENT_BALANCE_LENGTH) // Store revert string mstore(add(freeMemory, 0x44), _INSUFFICIENT_BALANCE_MESSAGE) revert(freeMemory, 0x64) } // Subtract transfer amount from current amount of `from` let newAmountFrom := sub(currentAmountFrom, amount) // Load amount currently stored in `balanceOf[to][id]` let currentAmountTo := sload(amountToSlot) // Add transfer amount to current amount of `to` // Realistically this will never overflow let newAmountTo := add(currentAmountTo, amount) // Store new amount of `from` in `balanceOf[from][id]` sstore(amountFromSlot, newAmountFrom) // Store new amount of `to` in `balanceOf[to][id]` sstore(amountToSlot, newAmountTo) } emit TransferSingle(msg.sender, from, to, id, amount); if (to.code.length != 0) { require( ERC1155TokenReceiver(to).onERC1155Received(msg.sender, from, id, amount, data) == ERC1155TokenReceiver.onERC1155Received.selector, "UNSAFE_RECIPIENT" ); } else require(to != address(0), "INVALID_RECIPIENT"); } function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) public virtual override { require(isApprovedForAll[address(0)][msg.sender], "NOT_AUTHORIZED"); require(ids.length == amounts.length, "LENGTH_MISMATCH"); // Use assembly to perform optimized balance updates // Same balance updates in unoptimized Solidity: // // for (uint256 i = 0; i < ids.length; ++i) { // uint256 id = ids[i]; // uint256 amount = amounts[i]; // // balanceOf[from][id] -= amount; // balanceOf[to][id] += amount; // } /// @solidity memory-safe-assembly assembly { // Calculate the storage slot of `balanceOf[from]` // by concatenating the `from` address and the // slot of `balanceOf` in the scratch space used // by hashing methods, i.e. the first two 32 bytes // of memory. The keccak256 hash of the concatenated // values is the storage slot we're looking for. mstore(0x00, from) mstore(0x20, balanceOf.slot) let balanceOfFromSlot := keccak256(0x00, 0x40) // Calculate storage slot of `balanceOf[to]` mstore(0x00, to) // 0x20 still contains `balanceOf.slot` let balanceOfToSlot := keccak256(0x00, 0x40) // Calculate length of arrays `ids` and `amounts` in bytes let arrayLength := mul(ids.length, 0x20) // Loop over all values in `ids` and `amounts` by starting // with an index offset of 0 to access the first array element // and incrementing this index by 32 after each iteration to // access the next array element until the offset reaches the end // of the arrays, at which point all values the arrays contain // have been accessed for { let indexOffset := 0x00 } lt(indexOffset, arrayLength) { indexOffset := add(indexOffset, 0x20) } { // Load current array elements by adding offset of current // array index to start of each array's data area inside calldata let amount := calldataload(add(amounts.offset, indexOffset)) // Calculate storage slot of `balanceOf[from][id]` // Load current id from calldata into the first 32 bytes of memory mstore(0x00, calldataload(add(ids.offset, indexOffset))) mstore(0x20, balanceOfFromSlot) let amountFromSlot := keccak256(0x00, 0x40) // Calculate storage slot of `balanceOf[to][id]` // 0x00 still contains current id mstore(0x20, balanceOfToSlot) let amountToSlot := keccak256(0x00, 0x40) // Load amount currently stored in `balanceOf[from][id]` let currentAmountFrom := sload(amountFromSlot) // Revert with message "INSUFFICIENT_BALANCE" if the // transfer amount is greater than the current amount // of `from` to prevent an integer underflow if gt(amount, currentAmountFrom) { let freeMemory := mload(0x40) // Store "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)"))) mstore(freeMemory, _ERROR_FUNCTION_SIGNATURE) // Store data offset mstore(add(freeMemory, 0x04), 0x20) // Store length of revert string mstore(add(freeMemory, 0x24), _INSUFFICIENT_BALANCE_LENGTH) // Store revert string mstore(add(freeMemory, 0x44), _INSUFFICIENT_BALANCE_MESSAGE) revert(freeMemory, 0x64) } // Subtract transfer amount from current amount of `from` let newAmountFrom := sub(currentAmountFrom, amount) // Load amount currently stored in `balanceOf[to][id]` let currentAmountTo := sload(amountToSlot) // Add transfer amount to current amount of `to` // Realistically this will never overflow let newAmountTo := add(currentAmountTo, amount) // Store new amount of `from` in `balanceOf[from][id]` sstore(amountFromSlot, newAmountFrom) // Store new amount of `to` in `balanceOf[to][id]` sstore(amountToSlot, newAmountTo) } } emit TransferBatch(msg.sender, from, to, ids, amounts); if (to.code.length != 0) { require( ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, from, ids, amounts, data) == ERC1155TokenReceiver.onERC1155BatchReceived.selector, "UNSAFE_RECIPIENT" ); } else require(to != address(0), "INVALID_RECIPIENT"); } // ---------- MINT ---------- function mint( address to, uint256 id, uint256 amount ) public { require(isApprovedForAll[address(0)][msg.sender], "NOT_AUTHORIZED"); // Realistically this will never overflow unchecked { balanceOf[to][id] += amount; } emit TransferSingle(msg.sender, address(0), to, id, amount); } function mint( address[] calldata addresses, uint256[] calldata ids, uint256[] calldata amounts ) public { require(addresses.length == ids.length && ids.length == amounts.length, "LENGTH_MISMATCH"); // Calculate array length in bytes uint256 arrayLength; unchecked { arrayLength = addresses.length * 0x20; } for (uint256 indexOffset = 0x00; indexOffset < arrayLength;) { address addr; uint256 id; uint256 amount; /// @solidity memory-safe-assembly assembly { // Load current array elements by adding offset of current // array index to start of each array's data area inside calldata addr := calldataload(add(addresses.offset, indexOffset)) id := calldataload(add(ids.offset, indexOffset)) amount := calldataload(add(amounts.offset, indexOffset)) // Increment index offset by 32 for next iteration indexOffset := add(indexOffset, 0x20) } mint(addr, id, amount); } } function safeMint( address to, uint256 id, uint256 amount, bytes calldata data ) public { mint(to, id, amount); if (to.code.length != 0) { require( ERC1155TokenReceiver(to).onERC1155Received(msg.sender, address(0), id, amount, data) == ERC1155TokenReceiver.onERC1155Received.selector, "UNSAFE_RECIPIENT" ); } else require(to != address(0), "INVALID_RECIPIENT"); } function batchMint( address to, uint256[] calldata ids, uint256[] calldata amounts ) public { require(isApprovedForAll[address(0)][msg.sender], "NOT_AUTHORIZED"); require(ids.length == amounts.length, "LENGTH_MISMATCH"); // Use assembly to perform optimized balance updates // Same balance updates in unoptimized Solidity: // // for (uint256 i = 0; i < ids.length; ++i) { // uint256 id = ids[i]; // uint256 amount = amounts[i]; // // balanceOf[to][id] += amount; // } /// @solidity memory-safe-assembly assembly { // Calculate the storage slot of `balanceOf[to]` // by concatenating the `to` address and the // slot of `balanceOf` in the scratch space used // by hashing methods, i.e. the first two 32 bytes // of memory. The keccak256 hash of the concatenated // values is the storage slot we're looking for. mstore(0x00, to) mstore(0x20, balanceOf.slot) let balanceOfToSlot := keccak256(0x00, 0x40) // Store storage slot of `balanceOf[to]` in the second // 32 bytes of scratch space to later calculate the storage // slot of `balanceOf[to][id]` inside the loop mstore(0x20, balanceOfToSlot) // Calculate length of arrays `ids` and `amounts` in bytes let arrayLength := mul(ids.length, 0x20) // Loop over all values in `ids` and `amounts` by starting // with an index offset of 0 to access the first array element // and incrementing this index by 32 after each iteration to // access the next array element until the offset reaches the end // of the arrays, at which point all values the arrays contain // have been accessed for { let indexOffset := 0x00 } lt(indexOffset, arrayLength) { indexOffset := add(indexOffset, 0x20) } { // Load current array elements by adding offset of current // array index to start of each array's data area inside calldata let id := calldataload(add(ids.offset, indexOffset)) let amount := calldataload(add(amounts.offset, indexOffset)) // Calculate storage slot of `balanceOf[to][id]` mstore(0x00, id) // 0x20 still contains `balanceOfToSlot` let amountToSlot := keccak256(0x00, 0x40) // Load amount currently stored in `balanceOf[to][id]` let currentAmountTo := sload(amountToSlot) // Add mint amount to current amount of `to` // Realistically this will never overflow let newAmountTo := add(currentAmountTo, amount) // Store new amount in `balanceOf[to][id]` sstore(amountToSlot, newAmountTo) } } emit TransferBatch(msg.sender, address(0), to, ids, amounts); } function batchMint( address[] calldata addresses, uint256[][] calldata ids, uint256[][] calldata amounts ) public { require(addresses.length == ids.length && ids.length == amounts.length, "LENGTH_MISMATCH"); for (uint256 i = 0; i < addresses.length;) { address addr; /// @solidity memory-safe-assembly assembly { // Load current array element by adding offset of current // array index to start of array's data area inside calldata let indexOffset := mul(i, 0x20) addr := calldataload(add(addresses.offset, indexOffset)) } batchMint(addr, ids[i], amounts[i]); unchecked { i++; } } } function safeBatchMint( address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) public { batchMint(to, ids, amounts); if (to.code.length != 0) { require( ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, address(0), ids, amounts, data) == ERC1155TokenReceiver.onERC1155BatchReceived.selector, "UNSAFE_RECIPIENT" ); } else require(to != address(0), "INVALID_RECIPIENT"); } // ---------- BURN ---------- function burn( address from, uint256 id, uint256 amount ) public virtual { require(msg.sender == from || isApprovedForAll[address(0)][msg.sender], "NOT_AUTHORIZED"); // Use assembly to perform optimized balance update // Same balance update in unoptimized Solidity: // // balanceOf[from][id] -= amount; // /// @solidity memory-safe-assembly assembly { // Calculate the storage slot of `balanceOf[from]` // by concatenating the `from` address and the // slot of `balanceOf` in the scratch space used // by hashing methods, i.e. the first two 32 bytes // of memory. The keccak256 hash of the concatenated // values is the storage slot we're looking for. mstore(0x00, from) mstore(0x20, balanceOf.slot) let balanceOfFromSlot := keccak256(0x00, 0x40) // Calculate storage slot of `balanceOf[from][id]` mstore(0x00, id) mstore(0x20, balanceOfFromSlot) let amountFromSlot := keccak256(0x00, 0x40) // Load amount currently stored in `balanceOf[from][id]` let currentAmountFrom := sload(amountFromSlot) // Revert with message "INSUFFICIENT_BALANCE" if the burn // amount is greater than the current amount of `from` to // prevent an integer underflow if gt(amount, currentAmountFrom) { let freeMemory := mload(0x40) // Store "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)"))) mstore(freeMemory, _ERROR_FUNCTION_SIGNATURE) // Store data offset mstore(add(freeMemory, 0x04), 0x20) // Store length of revert string mstore(add(freeMemory, 0x24), _INSUFFICIENT_BALANCE_LENGTH) // Store revert string mstore(add(freeMemory, 0x44), _INSUFFICIENT_BALANCE_MESSAGE) revert(freeMemory, 0x64) } // Subtract burn amount from current amount of `from` let newAmountFrom := sub(currentAmountFrom, amount) // Store new amount of `from` in `balanceOf[from][id]` sstore(amountFromSlot, newAmountFrom) } emit TransferSingle(msg.sender, from, address(0), id, amount); } function batchBurn( address from, uint256[] calldata ids, uint256[] calldata amounts ) public virtual { require(msg.sender == from || isApprovedForAll[address(0)][msg.sender], "NOT_AUTHORIZED"); require(ids.length == amounts.length, "LENGTH_MISMATCH"); // Use assembly to perform optimized balance updates // Same balance updates in unoptimized Solidity: // // for (uint256 i = 0; i < ids.length; ++i) { // uint256 id = ids[i]; // uint256 amount = amounts[i]; // // balanceOf[from][id] -= amount; // } /// @solidity memory-safe-assembly assembly { // Calculate the storage slot of `balanceOf[from]` // by concatenating the `from` address and the // slot of `balanceOf` in the scratch space used // by hashing methods, i.e. the first two 32 bytes // of memory. The keccak256 hash of the concatenated // values is the storage slot we're looking for. mstore(0x00, from) mstore(0x20, balanceOf.slot) let balanceOfFromSlot := keccak256(0x00, 0x40) // Store storage slot of `balanceOf[from]` in the second // 32 bytes of scratch space to later calculate the storage // slot of `balanceOf[from][id]` inside the loop mstore(0x20, balanceOfFromSlot) // Calculate length of arrays `ids` and `amounts` in bytes let arrayLength := mul(ids.length, 0x20) // Loop over all values in `ids` and `amounts` by starting // with an index offset of 0 to access the first array element // and incrementing this index by 32 after each iteration to // access the next array element until the offset reaches the end // of the arrays, at which point all values the arrays contain // have been accessed for { let indexOffset := 0x00 } lt(indexOffset, arrayLength) { indexOffset := add(indexOffset, 0x20) } { // Load current array elements by adding offset of current // array index to start of each array's data area inside calldata let id := calldataload(add(ids.offset, indexOffset)) let amount := calldataload(add(amounts.offset, indexOffset)) // Calculate storage slot of `balanceOf[from][id]` mstore(0x00, id) // 0x20 still contains `balanceOfFromSlot` let amountFromSlot := keccak256(0x00, 0x40) // Load amount currently stored in `balanceOf[from][id]` let currentAmountFrom := sload(amountFromSlot) // Revert with message "INSUFFICIENT_BALANCE" if the burn // amount is greater than the current amount of `from` to // prevent an integer underflow if gt(amount, currentAmountFrom) { let freeMemory := mload(0x40) // Store "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)"))) mstore(freeMemory, _ERROR_FUNCTION_SIGNATURE) // Store data offset mstore(add(freeMemory, 0x04), 0x20) // Store length of revert string mstore(add(freeMemory, 0x24), _INSUFFICIENT_BALANCE_LENGTH) // Store revert string mstore(add(freeMemory, 0x44), _INSUFFICIENT_BALANCE_MESSAGE) revert(freeMemory, 0x64) } // Subtract burn amount from current amount of `from` let newAmountFrom := sub(currentAmountFrom, amount) // Store new amount of `from` in `balanceOf[from][id]` sstore(amountFromSlot, newAmountFrom) } } emit TransferBatch(msg.sender, from, address(0), ids, amounts); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; /// @notice Minimalist and gas efficient standard ERC1155 implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC1155.sol) abstract contract ERC1155 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event TransferSingle( address indexed operator, address indexed from, address indexed to, uint256 id, uint256 amount ); event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] amounts ); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); event URI(string value, uint256 indexed id); /*////////////////////////////////////////////////////////////// ERC1155 STORAGE //////////////////////////////////////////////////////////////*/ mapping(address => mapping(uint256 => uint256)) public balanceOf; mapping(address => mapping(address => bool)) public isApprovedForAll; /*////////////////////////////////////////////////////////////// METADATA LOGIC //////////////////////////////////////////////////////////////*/ function uri(uint256 id) public view virtual returns (string memory); /*////////////////////////////////////////////////////////////// ERC1155 LOGIC //////////////////////////////////////////////////////////////*/ function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) public virtual { require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED"); balanceOf[from][id] -= amount; balanceOf[to][id] += amount; emit TransferSingle(msg.sender, from, to, id, amount); if (to.code.length != 0) { require( ERC1155TokenReceiver(to).onERC1155Received(msg.sender, from, id, amount, data) == ERC1155TokenReceiver.onERC1155Received.selector, "UNSAFE_RECIPIENT" ); } else require(to != address(0), "INVALID_RECIPIENT"); } function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) public virtual { require(ids.length == amounts.length, "LENGTH_MISMATCH"); require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED"); // Storing these outside the loop saves ~15 gas per iteration. uint256 id; uint256 amount; for (uint256 i = 0; i < ids.length; ) { id = ids[i]; amount = amounts[i]; balanceOf[from][id] -= amount; balanceOf[to][id] += amount; // An array can't have a total length // larger than the max uint256 value. unchecked { ++i; } } emit TransferBatch(msg.sender, from, to, ids, amounts); if (to.code.length != 0) { require( ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, from, ids, amounts, data) == ERC1155TokenReceiver.onERC1155BatchReceived.selector, "UNSAFE_RECIPIENT" ); } else require(to != address(0), "INVALID_RECIPIENT"); } function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) public view virtual returns (uint256[] memory balances) { require(owners.length == ids.length, "LENGTH_MISMATCH"); balances = new uint256[](owners.length); // Unchecked because the only math done is incrementing // the array index counter which cannot possibly overflow. unchecked { for (uint256 i = 0; i < owners.length; ++i) { balances[i] = balanceOf[owners[i]][ids[i]]; } } } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155 interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { balanceOf[to][id] += amount; emit TransferSingle(msg.sender, address(0), to, id, amount); if (to.code.length != 0) { require( ERC1155TokenReceiver(to).onERC1155Received(msg.sender, address(0), id, amount, data) == ERC1155TokenReceiver.onERC1155Received.selector, "UNSAFE_RECIPIENT" ); } else require(to != address(0), "INVALID_RECIPIENT"); } function _batchMint( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { uint256 idsLength = ids.length; // Saves MLOADs. require(idsLength == amounts.length, "LENGTH_MISMATCH"); for (uint256 i = 0; i < idsLength; ) { balanceOf[to][ids[i]] += amounts[i]; // An array can't have a total length // larger than the max uint256 value. unchecked { ++i; } } emit TransferBatch(msg.sender, address(0), to, ids, amounts); if (to.code.length != 0) { require( ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, address(0), ids, amounts, data) == ERC1155TokenReceiver.onERC1155BatchReceived.selector, "UNSAFE_RECIPIENT" ); } else require(to != address(0), "INVALID_RECIPIENT"); } function _batchBurn( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { uint256 idsLength = ids.length; // Saves MLOADs. require(idsLength == amounts.length, "LENGTH_MISMATCH"); for (uint256 i = 0; i < idsLength; ) { balanceOf[from][ids[i]] -= amounts[i]; // An array can't have a total length // larger than the max uint256 value. unchecked { ++i; } } emit TransferBatch(msg.sender, from, address(0), ids, amounts); } function _burn( address from, uint256 id, uint256 amount ) internal virtual { balanceOf[from][id] -= amount; emit TransferSingle(msg.sender, from, address(0), id, amount); } } /// @notice A generic interface for a contract which properly accepts ERC1155 tokens. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC1155.sol) abstract contract ERC1155TokenReceiver { function onERC1155Received( address, address, uint256, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC1155TokenReceiver.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] calldata, uint256[] calldata, bytes calldata ) external virtual returns (bytes4) { return ERC1155TokenReceiver.onERC1155BatchReceived.selector; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.14; /// @notice Simple contract ownership module /// @author Solarbots (https://solarbots.io) abstract contract Owned { address public owner; event OwnershipTransfer(address indexed previousOwner, address indexed newOwner); modifier onlyOwner() virtual { require(msg.sender == owner, "NOT_OWNER"); _; } constructor(address _owner) { owner = _owner; emit OwnershipTransfer(address(0), _owner); } function setOwner(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "INVALID_OWNER"); owner = newOwner; emit OwnershipTransfer(msg.sender, newOwner); } }
{ "remappings": [ "ds-test/=lib/solmate/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "openzeppelin/=lib/openzeppelin-contracts/contracts/", "script/=script/", "solmate/=lib/solmate/src/", "src/=src/", "test/=test/", "src/=src/", "test/=test/", "script/=script/" ], "optimizer": { "enabled": true, "runs": 10000 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[][]","name":"ids","type":"uint256[][]"},{"internalType":"uint256[][]","name":"amounts","type":"uint256[][]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setURISuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620029c6380380620029c6833981016040819052620000349162000088565b600280546001600160a01b0319166001600160a01b0383169081179091556040518291906000907f22500af037c600dd7b720644ab6e358635085601d9ac508ad83eb2d6b2d729ca908290a35050620000ba565b6000602082840312156200009b57600080fd5b81516001600160a01b0381168114620000b357600080fd5b9392505050565b6128fc80620000ca6000396000f3fe608060405234801561001057600080fd5b50600436106101815760003560e01c80635cfa9297116100d85780638da5cb5b1161008c578063f242432a11610066578063f242432a1461037a578063f5298aca1461038d578063f6eb127a146103a057600080fd5b80638da5cb5b146102f4578063a22cb46514610339578063e985e9c51461034c57600080fd5b806378b34f05116100bd57806378b34f05146102bb5780637970ce9f146102ce57806381b3e575146102e157600080fd5b80635cfa9297146102a05780636c0360eb146102b357600080fd5b806313af40351161013a5780634e1273f4116101145780634e1273f4146102655780635503a0e81461028557806355f804b31461028d57600080fd5b806313af40351461022c578063156e29f61461023f5780632eb2c2d61461025257600080fd5b80630ca834801161016b5780630ca83480146101e45780630d6a5bbb146101f95780630e89341c1461020c57600080fd5b8062fdd58e1461018657806301ffc9a7146101c1575b600080fd5b6101ae610194366004611d8a565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6101d46101cf366004611de5565b6103b3565b60405190151581526020016101b8565b6101f76101f2366004611e55565b610498565b005b6101f7610207366004611f18565b610630565b61021f61021a366004611fc3565b6107e0565b6040516101b8919061200c565b6101f761023a36600461205d565b610875565b6101f761024d366004612078565b6109b0565b6101f76102603660046120ab565b610aa0565b610278610273366004612166565b610e3d565b6040516101b891906121d2565b61021f610f9a565b6101f761029b366004612216565b611028565b6101f76102ae366004612258565b6110a0565b61021f611248565b6101f76102c93660046122af565b611255565b6101f76102dc3660046122af565b611316565b6101f76102ef366004612216565b6113a4565b6002546103149073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b8565b6101f7610347366004612349565b611417565b6101d461035a366004612385565b600160209081526000928352604080842090915290825290205460ff1681565b6101f76103883660046123b8565b611526565b6101f761039b366004612078565b611819565b6101f76103ae366004611e55565b61197a565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061044657507fd9b67a26000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061049257507f0e89341c000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff1661051b5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b82811461056a5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b600085815260208181526040822081528402905b818110156105a4578581013560009081526040902080548583013501905560200161057e565b50508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87878787604051610621949392919061246d565b60405180910390a45050505050565b61063d8787878787610498565b73ffffffffffffffffffffffffffffffffffffffff87163b15610774576040517fbc197c81000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff89169063bc197c81906106bd9033906000908c908c908c908c908c908c906004016124e8565b6020604051808303816000875af11580156106dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107009190612559565b7fffffffff00000000000000000000000000000000000000000000000000000000161461076f5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b6107d7565b73ffffffffffffffffffffffffffffffffffffffff87166107d75760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b50505050505050565b60606000600380546107f190612576565b9050116108405760405162461bcd60e51b815260206004820152600b60248201527f4e4f5f4d455441444154410000000000000000000000000000000000000000006044820152606401610512565b600361084b83611b6d565b600460405160200161085f93929190612699565b6040516020818303038152906040529050919050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146108dc5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b73ffffffffffffffffffffffffffffffffffffffff811661093f5760405162461bcd60e51b815260206004820152600d60248201527f494e56414c49445f4f574e4552000000000000000000000000000000000000006044820152606401610512565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f22500af037c600dd7b720644ab6e358635085601d9ac508ad83eb2d6b2d729ca90600090a350565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff16610a2e5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208684528252808320805486019055805186815291820185905233917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6291015b60405180910390a4505050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff16610b1e5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b848314610b6d5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b87600052600060205260406000208760005260406000206020870260005b81811015610c145780880135818b0135600052846020526040600020846020526040600020815480841115610bff5760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b81549084900390925591019055602001610b8b565b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89898989604051610c92949392919061246d565b60405180910390a473ffffffffffffffffffffffffffffffffffffffff87163b15610dd0576040517fbc197c81000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff89169063bc197c8190610d199033908d908c908c908c908c908c908c906004016124e8565b6020604051808303816000875af1158015610d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5c9190612559565b7fffffffff000000000000000000000000000000000000000000000000000000001614610dcb5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b610e33565b73ffffffffffffffffffffffffffffffffffffffff8716610e335760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b5050505050505050565b6060838214610e8e5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b8367ffffffffffffffff811115610ea757610ea76126c1565b604051908082528060200260200182016040528015610ed0578160200160208202803683370190505b50905060005b84811015610f9157600080878784818110610ef357610ef36126f0565b9050602002016020810190610f08919061205d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858584818110610f5657610f566126f0565b90506020020135815260200190815260200160002054828281518110610f7e57610f7e6126f0565b6020908102919091010152600101610ed6565b50949350505050565b60048054610fa790612576565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd390612576565b80156110205780601f10610ff557610100808354040283529160200191611020565b820191906000526020600020905b81548152906001019060200180831161100357829003601f168201915b505050505081565b60025473ffffffffffffffffffffffffffffffffffffffff16331461108f5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b61109b60038383611caa565b505050565b6110ab8585856109b0565b73ffffffffffffffffffffffffffffffffffffffff85163b156111de576040517ff23a6e61000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff87169063f23a6e61906111279033906000908a908a908a908a9060040161271f565b6020604051808303816000875af1158015611146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116a9190612559565b7fffffffff0000000000000000000000000000000000000000000000000000000016146111d95760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b611241565b73ffffffffffffffffffffffffffffffffffffffff85166112415760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b5050505050565b60038054610fa790612576565b848314801561126357508281145b6112af5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b60005b858110156107d7576020810287013561130d818787858181106112d7576112d76126f0565b90506020028101906112e99190612771565b8787878181106112fb576112fb6126f0565b90506020028101906101f29190612771565b506001016112b2565b848314801561132457508281145b6113705760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b6020850260005b81811015610e335760208101908881013590878101359086013561139c8383836109b0565b505050611377565b60025473ffffffffffffffffffffffffffffffffffffffff16331461140b5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b61109b60048383611caa565b60025473ffffffffffffffffffffffffffffffffffffffff16331461147e5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b73ffffffffffffffffffffffffffffffffffffffff821660008181527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb496020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff166115a45760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b60008681526020818152604080832088845281842088855290835281842092529091208154808611156116165760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b8154908690039092559084019055604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff878116929089169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a473ffffffffffffffffffffffffffffffffffffffff85163b156117ae576040517ff23a6e61000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff87169063f23a6e61906116f79033908b908a908a908a908a9060040161271f565b6020604051808303816000875af1158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a9190612559565b7fffffffff0000000000000000000000000000000000000000000000000000000016146117a95760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b611811565b73ffffffffffffffffffffffffffffffffffffffff85166118115760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff8416148061186b57503360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff165b6118b75760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b826000526000602052604060002082600052806020525060406000208054808311156119225760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b8290039055604080518381526020810183905260009173ffffffffffffffffffffffffffffffffffffffff86169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629101610a93565b3373ffffffffffffffffffffffffffffffffffffffff861614806119cc57503360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff165b611a185760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b828114611a675760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b600085815260208181526040822081528402905b81811015611af05780860135818501358160005260406000209150815480821115611ae55760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b039055602001611a7b565b5050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87878787604051610621949392919061246d565b606081600003611bb057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611bda5780611bc481612808565b9150611bd39050600a8361286f565b9150611bb4565b60008167ffffffffffffffff811115611bf557611bf56126c1565b6040519080825280601f01601f191660200182016040528015611c1f576020820181803683370190505b5090505b8415611ca257611c34600183612883565b9150611c41600a8661289a565b611c4c9060306128ae565b60f81b818381518110611c6157611c616126f0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611c9b600a8661286f565b9450611c23565b949350505050565b828054611cb690612576565b90600052602060002090601f016020900481019282611cd85760008555611d3c565b82601f10611d0f578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555611d3c565b82800160010185558215611d3c579182015b82811115611d3c578235825591602001919060010190611d21565b50611d48929150611d4c565b5090565b5b80821115611d485760008155600101611d4d565b803573ffffffffffffffffffffffffffffffffffffffff81168114611d8557600080fd5b919050565b60008060408385031215611d9d57600080fd5b611da683611d61565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611de257600080fd5b50565b600060208284031215611df757600080fd5b8135611e0281611db4565b9392505050565b60008083601f840112611e1b57600080fd5b50813567ffffffffffffffff811115611e3357600080fd5b6020830191508360208260051b8501011115611e4e57600080fd5b9250929050565b600080600080600060608688031215611e6d57600080fd5b611e7686611d61565b9450602086013567ffffffffffffffff80821115611e9357600080fd5b611e9f89838a01611e09565b90965094506040880135915080821115611eb857600080fd5b50611ec588828901611e09565b969995985093965092949392505050565b60008083601f840112611ee857600080fd5b50813567ffffffffffffffff811115611f0057600080fd5b602083019150836020828501011115611e4e57600080fd5b60008060008060008060006080888a031215611f3357600080fd5b611f3c88611d61565b9650602088013567ffffffffffffffff80821115611f5957600080fd5b611f658b838c01611e09565b909850965060408a0135915080821115611f7e57600080fd5b611f8a8b838c01611e09565b909650945060608a0135915080821115611fa357600080fd5b50611fb08a828b01611ed6565b989b979a50959850939692959293505050565b600060208284031215611fd557600080fd5b5035919050565b60005b83811015611ff7578181015183820152602001611fdf565b83811115612006576000848401525b50505050565b602081526000825180602084015261202b816040850160208701611fdc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561206f57600080fd5b611e0282611d61565b60008060006060848603121561208d57600080fd5b61209684611d61565b95602085013595506040909401359392505050565b60008060008060008060008060a0898b0312156120c757600080fd5b6120d089611d61565b97506120de60208a01611d61565b9650604089013567ffffffffffffffff808211156120fb57600080fd5b6121078c838d01611e09565b909850965060608b013591508082111561212057600080fd5b61212c8c838d01611e09565b909650945060808b013591508082111561214557600080fd5b506121528b828c01611ed6565b999c989b5096995094979396929594505050565b6000806000806040858703121561217c57600080fd5b843567ffffffffffffffff8082111561219457600080fd5b6121a088838901611e09565b909650945060208701359150808211156121b957600080fd5b506121c687828801611e09565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b8181101561220a578351835292840192918401916001016121ee565b50909695505050505050565b6000806020838503121561222957600080fd5b823567ffffffffffffffff81111561224057600080fd5b61224c85828601611ed6565b90969095509350505050565b60008060008060006080868803121561227057600080fd5b61227986611d61565b94506020860135935060408601359250606086013567ffffffffffffffff8111156122a357600080fd5b611ec588828901611ed6565b600080600080600080606087890312156122c857600080fd5b863567ffffffffffffffff808211156122e057600080fd5b6122ec8a838b01611e09565b9098509650602089013591508082111561230557600080fd5b6123118a838b01611e09565b9096509450604089013591508082111561232a57600080fd5b5061233789828a01611e09565b979a9699509497509295939492505050565b6000806040838503121561235c57600080fd5b61236583611d61565b91506020830135801515811461237a57600080fd5b809150509250929050565b6000806040838503121561239857600080fd5b6123a183611d61565b91506123af60208401611d61565b90509250929050565b60008060008060008060a087890312156123d157600080fd5b6123da87611d61565b95506123e860208801611d61565b94506040870135935060608701359250608087013567ffffffffffffffff81111561241257600080fd5b61233789828a01611ed6565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561245057600080fd5b8260051b8083602087013760009401602001938452509192915050565b60408152600061248160408301868861241e565b828103602084015261249481858761241e565b979650505050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600073ffffffffffffffffffffffffffffffffffffffff808b168352808a1660208401525060a0604083015261252260a08301888a61241e565b828103606084015261253581878961241e565b9050828103608084015261254a81858761249f565b9b9a5050505050505050505050565b60006020828403121561256b57600080fd5b8151611e0281611db4565b600181811c9082168061258a57607f821691505b6020821081036125c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8054600090600181811c90808316806125e357607f831692505b6020808410820361261d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b81801561263157600181146126605761268d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952848901965061268d565b60008881526020902060005b868110156126855781548b82015290850190830161266c565b505084890196505b50505050505092915050565b60006126a582866125c9565b84516126b5818360208901611fdc565b612494818301866125c9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015284606083015260a0608083015261276560a08301848661249f565b98975050505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126127a657600080fd5b83018035915067ffffffffffffffff8211156127c157600080fd5b6020019150600581901b3603821315611e4e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612839576128396127d9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261287e5761287e612840565b500490565b600082821015612895576128956127d9565b500390565b6000826128a9576128a9612840565b500690565b600082198211156128c1576128c16127d9565b50019056fea264697066735822122075817d2b83c38a0b1aa48e837f17930b93ea4900e9efe57e356abebd847dc29664736f6c634300080e00330000000000000000000000005a5fe90cd115d691ee99d90d3607f7005ea817e5
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101815760003560e01c80635cfa9297116100d85780638da5cb5b1161008c578063f242432a11610066578063f242432a1461037a578063f5298aca1461038d578063f6eb127a146103a057600080fd5b80638da5cb5b146102f4578063a22cb46514610339578063e985e9c51461034c57600080fd5b806378b34f05116100bd57806378b34f05146102bb5780637970ce9f146102ce57806381b3e575146102e157600080fd5b80635cfa9297146102a05780636c0360eb146102b357600080fd5b806313af40351161013a5780634e1273f4116101145780634e1273f4146102655780635503a0e81461028557806355f804b31461028d57600080fd5b806313af40351461022c578063156e29f61461023f5780632eb2c2d61461025257600080fd5b80630ca834801161016b5780630ca83480146101e45780630d6a5bbb146101f95780630e89341c1461020c57600080fd5b8062fdd58e1461018657806301ffc9a7146101c1575b600080fd5b6101ae610194366004611d8a565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6101d46101cf366004611de5565b6103b3565b60405190151581526020016101b8565b6101f76101f2366004611e55565b610498565b005b6101f7610207366004611f18565b610630565b61021f61021a366004611fc3565b6107e0565b6040516101b8919061200c565b6101f761023a36600461205d565b610875565b6101f761024d366004612078565b6109b0565b6101f76102603660046120ab565b610aa0565b610278610273366004612166565b610e3d565b6040516101b891906121d2565b61021f610f9a565b6101f761029b366004612216565b611028565b6101f76102ae366004612258565b6110a0565b61021f611248565b6101f76102c93660046122af565b611255565b6101f76102dc3660046122af565b611316565b6101f76102ef366004612216565b6113a4565b6002546103149073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b8565b6101f7610347366004612349565b611417565b6101d461035a366004612385565b600160209081526000928352604080842090915290825290205460ff1681565b6101f76103883660046123b8565b611526565b6101f761039b366004612078565b611819565b6101f76103ae366004611e55565b61197a565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061044657507fd9b67a26000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061049257507f0e89341c000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff1661051b5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b82811461056a5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b600085815260208181526040822081528402905b818110156105a4578581013560009081526040902080548583013501905560200161057e565b50508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87878787604051610621949392919061246d565b60405180910390a45050505050565b61063d8787878787610498565b73ffffffffffffffffffffffffffffffffffffffff87163b15610774576040517fbc197c81000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff89169063bc197c81906106bd9033906000908c908c908c908c908c908c906004016124e8565b6020604051808303816000875af11580156106dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107009190612559565b7fffffffff00000000000000000000000000000000000000000000000000000000161461076f5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b6107d7565b73ffffffffffffffffffffffffffffffffffffffff87166107d75760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b50505050505050565b60606000600380546107f190612576565b9050116108405760405162461bcd60e51b815260206004820152600b60248201527f4e4f5f4d455441444154410000000000000000000000000000000000000000006044820152606401610512565b600361084b83611b6d565b600460405160200161085f93929190612699565b6040516020818303038152906040529050919050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146108dc5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b73ffffffffffffffffffffffffffffffffffffffff811661093f5760405162461bcd60e51b815260206004820152600d60248201527f494e56414c49445f4f574e4552000000000000000000000000000000000000006044820152606401610512565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f22500af037c600dd7b720644ab6e358635085601d9ac508ad83eb2d6b2d729ca90600090a350565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff16610a2e5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208684528252808320805486019055805186815291820185905233917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6291015b60405180910390a4505050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff16610b1e5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b848314610b6d5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b87600052600060205260406000208760005260406000206020870260005b81811015610c145780880135818b0135600052846020526040600020846020526040600020815480841115610bff5760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b81549084900390925591019055602001610b8b565b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89898989604051610c92949392919061246d565b60405180910390a473ffffffffffffffffffffffffffffffffffffffff87163b15610dd0576040517fbc197c81000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff89169063bc197c8190610d199033908d908c908c908c908c908c908c906004016124e8565b6020604051808303816000875af1158015610d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5c9190612559565b7fffffffff000000000000000000000000000000000000000000000000000000001614610dcb5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b610e33565b73ffffffffffffffffffffffffffffffffffffffff8716610e335760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b5050505050505050565b6060838214610e8e5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b8367ffffffffffffffff811115610ea757610ea76126c1565b604051908082528060200260200182016040528015610ed0578160200160208202803683370190505b50905060005b84811015610f9157600080878784818110610ef357610ef36126f0565b9050602002016020810190610f08919061205d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858584818110610f5657610f566126f0565b90506020020135815260200190815260200160002054828281518110610f7e57610f7e6126f0565b6020908102919091010152600101610ed6565b50949350505050565b60048054610fa790612576565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd390612576565b80156110205780601f10610ff557610100808354040283529160200191611020565b820191906000526020600020905b81548152906001019060200180831161100357829003601f168201915b505050505081565b60025473ffffffffffffffffffffffffffffffffffffffff16331461108f5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b61109b60038383611caa565b505050565b6110ab8585856109b0565b73ffffffffffffffffffffffffffffffffffffffff85163b156111de576040517ff23a6e61000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff87169063f23a6e61906111279033906000908a908a908a908a9060040161271f565b6020604051808303816000875af1158015611146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116a9190612559565b7fffffffff0000000000000000000000000000000000000000000000000000000016146111d95760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b611241565b73ffffffffffffffffffffffffffffffffffffffff85166112415760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b5050505050565b60038054610fa790612576565b848314801561126357508281145b6112af5760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b60005b858110156107d7576020810287013561130d818787858181106112d7576112d76126f0565b90506020028101906112e99190612771565b8787878181106112fb576112fb6126f0565b90506020028101906101f29190612771565b506001016112b2565b848314801561132457508281145b6113705760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b6020850260005b81811015610e335760208101908881013590878101359086013561139c8383836109b0565b505050611377565b60025473ffffffffffffffffffffffffffffffffffffffff16331461140b5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b61109b60048383611caa565b60025473ffffffffffffffffffffffffffffffffffffffff16331461147e5760405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152606401610512565b73ffffffffffffffffffffffffffffffffffffffff821660008181527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb496020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff166115a45760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b60008681526020818152604080832088845281842088855290835281842092529091208154808611156116165760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b8154908690039092559084019055604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff878116929089169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a473ffffffffffffffffffffffffffffffffffffffff85163b156117ae576040517ff23a6e61000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff87169063f23a6e61906116f79033908b908a908a908a908a9060040161271f565b6020604051808303816000875af1158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a9190612559565b7fffffffff0000000000000000000000000000000000000000000000000000000016146117a95760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610512565b611811565b73ffffffffffffffffffffffffffffffffffffffff85166118115760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610512565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff8416148061186b57503360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff165b6118b75760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b826000526000602052604060002082600052806020525060406000208054808311156119225760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b8290039055604080518381526020810183905260009173ffffffffffffffffffffffffffffffffffffffff86169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629101610a93565b3373ffffffffffffffffffffffffffffffffffffffff861614806119cc57503360009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604090205460ff165b611a185760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610512565b828114611a675760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610512565b600085815260208181526040822081528402905b81811015611af05780860135818501358160005260406000209150815480821115611ae55760405162461bcd60e51b815260206004820152601460248201527f494e53554646494349454e545f42414c414e43450000000000000000000000006044820152606481fd5b039055602001611a7b565b5050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87878787604051610621949392919061246d565b606081600003611bb057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611bda5780611bc481612808565b9150611bd39050600a8361286f565b9150611bb4565b60008167ffffffffffffffff811115611bf557611bf56126c1565b6040519080825280601f01601f191660200182016040528015611c1f576020820181803683370190505b5090505b8415611ca257611c34600183612883565b9150611c41600a8661289a565b611c4c9060306128ae565b60f81b818381518110611c6157611c616126f0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611c9b600a8661286f565b9450611c23565b949350505050565b828054611cb690612576565b90600052602060002090601f016020900481019282611cd85760008555611d3c565b82601f10611d0f578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555611d3c565b82800160010185558215611d3c579182015b82811115611d3c578235825591602001919060010190611d21565b50611d48929150611d4c565b5090565b5b80821115611d485760008155600101611d4d565b803573ffffffffffffffffffffffffffffffffffffffff81168114611d8557600080fd5b919050565b60008060408385031215611d9d57600080fd5b611da683611d61565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611de257600080fd5b50565b600060208284031215611df757600080fd5b8135611e0281611db4565b9392505050565b60008083601f840112611e1b57600080fd5b50813567ffffffffffffffff811115611e3357600080fd5b6020830191508360208260051b8501011115611e4e57600080fd5b9250929050565b600080600080600060608688031215611e6d57600080fd5b611e7686611d61565b9450602086013567ffffffffffffffff80821115611e9357600080fd5b611e9f89838a01611e09565b90965094506040880135915080821115611eb857600080fd5b50611ec588828901611e09565b969995985093965092949392505050565b60008083601f840112611ee857600080fd5b50813567ffffffffffffffff811115611f0057600080fd5b602083019150836020828501011115611e4e57600080fd5b60008060008060008060006080888a031215611f3357600080fd5b611f3c88611d61565b9650602088013567ffffffffffffffff80821115611f5957600080fd5b611f658b838c01611e09565b909850965060408a0135915080821115611f7e57600080fd5b611f8a8b838c01611e09565b909650945060608a0135915080821115611fa357600080fd5b50611fb08a828b01611ed6565b989b979a50959850939692959293505050565b600060208284031215611fd557600080fd5b5035919050565b60005b83811015611ff7578181015183820152602001611fdf565b83811115612006576000848401525b50505050565b602081526000825180602084015261202b816040850160208701611fdc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561206f57600080fd5b611e0282611d61565b60008060006060848603121561208d57600080fd5b61209684611d61565b95602085013595506040909401359392505050565b60008060008060008060008060a0898b0312156120c757600080fd5b6120d089611d61565b97506120de60208a01611d61565b9650604089013567ffffffffffffffff808211156120fb57600080fd5b6121078c838d01611e09565b909850965060608b013591508082111561212057600080fd5b61212c8c838d01611e09565b909650945060808b013591508082111561214557600080fd5b506121528b828c01611ed6565b999c989b5096995094979396929594505050565b6000806000806040858703121561217c57600080fd5b843567ffffffffffffffff8082111561219457600080fd5b6121a088838901611e09565b909650945060208701359150808211156121b957600080fd5b506121c687828801611e09565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b8181101561220a578351835292840192918401916001016121ee565b50909695505050505050565b6000806020838503121561222957600080fd5b823567ffffffffffffffff81111561224057600080fd5b61224c85828601611ed6565b90969095509350505050565b60008060008060006080868803121561227057600080fd5b61227986611d61565b94506020860135935060408601359250606086013567ffffffffffffffff8111156122a357600080fd5b611ec588828901611ed6565b600080600080600080606087890312156122c857600080fd5b863567ffffffffffffffff808211156122e057600080fd5b6122ec8a838b01611e09565b9098509650602089013591508082111561230557600080fd5b6123118a838b01611e09565b9096509450604089013591508082111561232a57600080fd5b5061233789828a01611e09565b979a9699509497509295939492505050565b6000806040838503121561235c57600080fd5b61236583611d61565b91506020830135801515811461237a57600080fd5b809150509250929050565b6000806040838503121561239857600080fd5b6123a183611d61565b91506123af60208401611d61565b90509250929050565b60008060008060008060a087890312156123d157600080fd5b6123da87611d61565b95506123e860208801611d61565b94506040870135935060608701359250608087013567ffffffffffffffff81111561241257600080fd5b61233789828a01611ed6565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561245057600080fd5b8260051b8083602087013760009401602001938452509192915050565b60408152600061248160408301868861241e565b828103602084015261249481858761241e565b979650505050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600073ffffffffffffffffffffffffffffffffffffffff808b168352808a1660208401525060a0604083015261252260a08301888a61241e565b828103606084015261253581878961241e565b9050828103608084015261254a81858761249f565b9b9a5050505050505050505050565b60006020828403121561256b57600080fd5b8151611e0281611db4565b600181811c9082168061258a57607f821691505b6020821081036125c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8054600090600181811c90808316806125e357607f831692505b6020808410820361261d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b81801561263157600181146126605761268d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952848901965061268d565b60008881526020902060005b868110156126855781548b82015290850190830161266c565b505084890196505b50505050505092915050565b60006126a582866125c9565b84516126b5818360208901611fdc565b612494818301866125c9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015284606083015260a0608083015261276560a08301848661249f565b98975050505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126127a657600080fd5b83018035915067ffffffffffffffff8211156127c157600080fd5b6020019150600581901b3603821315611e4e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612839576128396127d9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261287e5761287e612840565b500490565b600082821015612895576128956127d9565b500390565b6000826128a9576128a9612840565b500690565b600082198211156128c1576128c16127d9565b50019056fea264697066735822122075817d2b83c38a0b1aa48e837f17930b93ea4900e9efe57e356abebd847dc29664736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005a5fe90cd115d691ee99d90d3607f7005ea817e5
-----Decoded View---------------
Arg [0] : owner (address): 0x5a5fe90CD115d691EE99d90D3607f7005Ea817e5
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005a5fe90cd115d691ee99d90d3607f7005ea817e5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.