Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MeowChangeTheChannel
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @artist: Mad Dog Jones /// @author: manifold.xyz //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // // // #### #### ####################### ###### ####### ################## ###### ############### #### #### // // #### #### ###################### ####### ######## #################### ###### ################ #### #### // // #### #### #### ################# ######## ######### ###### ###### ###### ############# #### #### #### // // #### #### #### ################ ######### ########## ###### ###### ###### ############## #### #### #### // // #### #### ################### ########## ########### ###### ###### ###### ################### #### #### // // #### #### ################## ########### ########### ###### ###### ###### #################### #### #### // // #### #### #### ############# ####################### ###### ###### ###### ###### ################# #### #### #### // // #### #### #### ############ ###### ####### ###### ###### ###### ###### ###### ################## #### #### #### // // #### #### #### ####### ###### ##### ###### #################### ################# ############### #### #### #### // // #### #### #### ###### ###### ###### ################## ############### ################# #### #### #### // // // // // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// import "./core/IERC721CreatorCore.sol"; import "./extensions/ICreatorExtensionTokenURI.sol"; import "./redeem/ERC721BurnRedeem.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; /** * Meow - Change the channel */ contract MeowChangeTheChannel is Ownable, ERC721BurnRedeem, ICreatorExtensionTokenURI { using Strings for uint256; string constant private _EDITION_TAG = '<EDITION>'; string[] private _uriParts; bool private _active; constructor(address creator) ERC721BurnRedeem(creator, 1, 99) { _uriParts.push('data:application/json;utf8,{"name":"Change the channel. #'); _uriParts.push('<EDITION>'); _uriParts.push('/99", "created_by":"Mad Dog Jones", '); _uriParts.push('"description":"Meow.\\n\\nMichah Dowbak aka Mad Dog Jones (b. 1985)\\n\\nChange the channel., 2023", '); _uriParts.push('"image":"https://arweave.net/cudfQEuB1oJSFOsFaSTxI9DpP85K0JnSvA5f-_3Nsh4","image_url":"https://arweave.net/cudfQEuB1oJSFOsFaSTxI9DpP85K0JnSvA5f-_3Nsh4","image_details":{"sha256":"015d8a7259f4cb0d5aef3c5a28bf1b2660d4a3e3372e8be97498c53c3f667843","bytes":8820652,"width":4000,"height":5000,"format":"PNG"},'); _uriParts.push('"animation":"https://arweave.net/g_3sDenW4iJYdekAPN3qBLDBDDcl1LqY7wTbHRzH0F0","animation_url":"https://arweave.net/g_3sDenW4iJYdekAPN3qBLDBDDcl1LqY7wTbHRzH0F0","animation_details":{"sha256":"ddc7ef32e88c4528b3f4f200bd7ab7ca908e17eef805e5b56bf416f3b94446dc","bytes":180178899,"width":4000,"height":5000,"duration":33,"format":"MP4","codecs":["H.264","AAC"]},'); _uriParts.push('"attributes":[{"trait_type":"Artist","value":"Mad Dog Jones"},{"trait_type":"Collection","value":"Meow"},{"trait_type":"Edition","value":"D"},{"display_type":"number","trait_type":"Edition","value":'); _uriParts.push('<EDITION>'); _uriParts.push(',"max_value":99}]}'); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721BurnRedeem, IERC165) returns (bool) { return interfaceId == type(ICreatorExtensionTokenURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Activate the contract and mint the first token */ function activate() public onlyOwner { // Mint the first one to the owner require(!_active, "Already active"); _active = true; _mintRedemption(owner()); } /** * @dev update the URI data */ function updateURIParts(string[] memory uriParts) public onlyOwner { _uriParts = uriParts; } /** * @dev Generate uri */ function _generateURI(uint256 tokenId) private view returns(string memory) { bytes memory byteString; for (uint i = 0; i < _uriParts.length; i++) { if (_checkTag(_uriParts[i], _EDITION_TAG)) { byteString = abi.encodePacked(byteString, (100-_mintNumbers[tokenId]).toString()); } else { byteString = abi.encodePacked(byteString, _uriParts[i]); } } return string(byteString); } function _checkTag(string storage a, string memory b) private pure returns (bool) { return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b)))); } /** * @dev See {IERC721RedeemBase-mintNumber}. * Override for reverse numbering */ function mintNumber(uint256 tokenId) external view override returns(uint256) { require(_mintNumbers[tokenId] != 0, "Invalid token"); return 100-_mintNumbers[tokenId]; } /** * @dev See {IRedeemBase-redeemable}. */ function redeemable(address contract_, uint256 tokenId) public view virtual override returns(bool) { require(_active, "Inactive"); return super.redeemable(contract_, tokenId); } /** * @dev See {ICreatorExtensionTokenURI-tokenURI}. */ function tokenURI(address creator, uint256 tokenId) external view override returns (string memory) { require(creator == _creator && _mintNumbers[tokenId] != 0, "Invalid token"); return _generateURI(tokenId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT 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; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "../core/IERC721CreatorCore.sol"; import "./ERC721RedeemBase.sol"; import "./IERC721BurnRedeem.sol"; /** * @dev Burn NFT's to receive another lazy minted NFT */ contract ERC721BurnRedeem is ReentrancyGuard, ERC721RedeemBase, IERC721BurnRedeem { using EnumerableSet for EnumerableSet.UintSet; mapping (address => mapping (uint256 => address)) private _recoverableERC721; constructor(address creator, uint16 redemptionRate, uint16 redemptionMax) ERC721RedeemBase(creator, redemptionRate, redemptionMax) {} /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721RedeemBase, IERC165) returns (bool) { return interfaceId == type(IERC721BurnRedeem).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721BurnRedeem-setERC721Recoverable} */ function setERC721Recoverable(address contract_, uint256 tokenId, address recoverer) external virtual override adminRequired { require(ERC165Checker.supportsInterface(contract_, type(IERC721).interfaceId), "BurnRedeem: Must implement IERC721"); _recoverableERC721[contract_][tokenId] = recoverer; } /** * @dev See {IERC721BurnRedeem-recoverERC721} */ function recoverERC721(address contract_, uint256 tokenId) external virtual override { address recoverer = _recoverableERC721[contract_][tokenId]; require(recoverer == msg.sender, "BurnRedeem: Permission denied"); IERC721(contract_).safeTransferFrom(address(this), msg.sender, tokenId); } /** * @dev See {IERC721BurnRedeem-redeemERC721} */ function redeemERC721(address[] calldata contracts, uint256[] calldata tokenIds) external virtual override nonReentrant { require(contracts.length == tokenIds.length, "BurnRedeem: Invalid parameters"); require(contracts.length == _redemptionRate, "BurnRedeem: Incorrect number of NFTs being redeemed"); // Attempt Burn for (uint i=0; i<contracts.length; i++) { // Check that we can burn require(redeemable(contracts[i], tokenIds[i]), "BurnRedeem: Invalid NFT"); try IERC721(contracts[i]).ownerOf(tokenIds[i]) returns (address ownerOfAddress) { require(ownerOfAddress == msg.sender, "BurnRedeem: Caller must own NFTs"); } catch (bytes memory) { revert("BurnRedeem: Bad token contract"); } try IERC721(contracts[i]).getApproved(tokenIds[i]) returns (address approvedAddress) { require(approvedAddress == address(this), "BurnRedeem: Contract must be given approval to burn NFT"); } catch (bytes memory) { revert("BurnRedeem: Bad token contract"); } // Then burn try IERC721(contracts[i]).transferFrom(msg.sender, address(0xdEaD), tokenIds[i]) { } catch (bytes memory) { revert("BurnRedeem: Burn failure"); } } // Mint reward _mintRedemption(msg.sender); } /** * @dev See {IERC721Receiver-onERC721Received}. */ function onERC721Received(address, address from, uint256 tokenId, bytes calldata data) external override nonReentrant returns (bytes4) { require(redeemable(msg.sender, tokenId), "BurnRedeem: Invalid NFT"); require(_redemptionRate == 1, "BurnRedeem: Can only allow direct receiving of redemptions of 1 NFT"); // Burn it try IERC721(msg.sender).safeTransferFrom(address(this), address(0xdEaD), tokenId, data) { } catch (bytes memory) { revert("BurnRedeem: Burn failure"); } // Mint reward _mintRedemption(from); return this.onERC721Received.selector; } /** * @dev See {IERC1155Receiver-onERC1155Received}. */ function onERC1155Received( address, address from, uint256 id, uint256 value, bytes calldata data ) external override nonReentrant returns(bytes4) { require(redeemable(msg.sender, id), "BurnRedeem: Invalid NFT"); require(value == _redemptionRate, "BurnRedeem: Incorrect number of NFTs being redeemed"); // Burn it try IERC1155(msg.sender).safeTransferFrom(address(this), address(0xdEaD), id, value, data) { } catch (bytes memory) { revert("BurnRedeem: Burn failure"); } // Mint reward _mintRedemption(from); return this.onERC1155Received.selector; } /** * @dev See {IERC1155Receiver-onERC1155BatchReceived}. */ function onERC1155BatchReceived( address, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external override nonReentrant returns(bytes4) { require(ids.length == values.length, "BurnRedeem: Invalid input"); uint256 totalValue = 0; for (uint i=0; i<ids.length; i++) { require(redeemable(msg.sender, ids[i]), "BurnRedeem: Invalid NFT"); totalValue += values[i]; } require(totalValue == _redemptionRate, "BurnRedeem: Incorrect number of NFTs being redeemed"); // Burn it try IERC1155(msg.sender).safeBatchTransferFrom(address(this), address(0xdEaD), ids, values, data) { } catch (bytes memory) { revert("BurnRedeem: Burn failure"); } // Mint reward _mintRedemption(from); return this.onERC1155BatchReceived.selector; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Implement this if you want your extension to have overloadable URI's */ interface ICreatorExtensionTokenURI is IERC165 { /** * Get the uri for a given creator/tokenId */ function tokenURI(address creator, uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "./ICreatorCore.sol"; /** * @dev Core ERC721 creator interface */ interface IERC721CreatorCore is ICreatorCore { /** * @dev mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBase(address to) external returns (uint256); /** * @dev mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBase(address to, string calldata uri) external returns (uint256); /** * @dev batch mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBaseBatch(address to, uint16 count) external returns (uint256[] memory); /** * @dev batch mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBaseBatch(address to, string[] calldata uris) external returns (uint256[] memory); /** * @dev mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtension(address to) external returns (uint256); /** * @dev mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtension(address to, string calldata uri) external returns (uint256); /** * @dev batch mint a token. Can only be called by a registered extension. * Returns tokenIds minted */ function mintExtensionBatch(address to, uint16 count) external returns (uint256[] memory); /** * @dev batch mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtensionBatch(address to, string[] calldata uris) external returns (uint256[] memory); /** * @dev burn a token. Can only be called by token owner or approved address. * On burn, calls back to the registered extension's onBurn method */ function burn(uint256 tokenId) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "./IERC721RedeemBase.sol"; /** * @dev Burn NFT's to receive another lazy minted NFT */ interface IERC721BurnRedeem is IERC721RedeemBase, IERC1155Receiver, IERC721Receiver { /** * @dev Enable recovery of a given token. Can only be called by contract owner/admin. * This is a special function used in case someone accidentally sends a token to this contract. */ function setERC721Recoverable(address contract_, uint256 tokenId, address recoverer) external; /** * @dev Recover a token. Returns it to the recoverer set by setERC721Recoverable * This is a special function used in case someone accidentally sends a token to this contract. */ function recoverERC721(address contract_, uint256 tokenId) external; /** * @dev Redeem ERC721 tokens for redemption reward NFT. * Requires the user to grant approval beforehand by calling contract's 'approve' function. * If the it cannot redeem the NFT, it will clear approvals */ function redeemERC721(address[] calldata contracts, uint256[] calldata tokenIds) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; import "../core/IERC721CreatorCore.sol"; import "../extensions/CreatorExtension.sol"; import "../libraries/LegacyInterfaces.sol"; import "./RedeemBase.sol"; import "./IERC721RedeemBase.sol"; /** * @dev Burn NFT's to receive another lazy minted NFT */ abstract contract ERC721RedeemBase is RedeemBase, CreatorExtension, IERC721RedeemBase { // The creator mint contract address internal _creator; uint16 internal immutable _redemptionRate; uint16 private _redemptionMax; uint16 private _redemptionCount; uint256[] private _mintedTokens; mapping(uint256 => uint256) internal _mintNumbers; constructor(address creator, uint16 redemptionRate_, uint16 redemptionMax_) { require(ERC165Checker.supportsInterface(creator, type(IERC721CreatorCore).interfaceId) || ERC165Checker.supportsInterface(creator, LegacyInterfaces.IERC721CreatorCore_v1), "Redeem: Minting reward contract must implement IERC721CreatorCore"); _redemptionRate = redemptionRate_; _redemptionMax = redemptionMax_; _creator = creator; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(RedeemBase, CreatorExtension, IERC165) returns (bool) { return interfaceId == type(IERC721RedeemBase).interfaceId || RedeemBase.supportsInterface(interfaceId) || CreatorExtension.supportsInterface(interfaceId); } /** * @dev See {IERC721RedeemBase-redemptionMax} */ function redemptionMax() external view virtual override returns(uint16) { return _redemptionMax; } /** * @dev See {IERC721RedeemBase-redemptionRate} */ function redemptionRate() external view virtual override returns(uint16) { return _redemptionRate; } /** * @dev See {IERC721RedeemBase-redemptionRemaining} */ function redemptionRemaining() external view virtual override returns(uint16) { return _redemptionMax-_redemptionCount; } /** * @dev See {IERC721RedeemBase-mintNumber}. */ function mintNumber(uint256 tokenId) external view virtual override returns(uint256) { return _mintNumbers[tokenId]; } /** * @dev See {IERC721RedeemBase-mintedTokens}. */ function mintedTokens() external view override returns(uint256[] memory) { return _mintedTokens; } /** * @dev mint token that was redeemed for */ function _mintRedemption(address to) internal { require(_redemptionCount < _redemptionMax, "Redeem: No redemptions remaining"); _redemptionCount++; // Mint token uint256 tokenId = _mint(to, _redemptionCount); _mintedTokens.push(tokenId); _mintNumbers[tokenId] = _redemptionCount; } /** * @dev override if you want to perform different mint functionality */ function _mint(address to, uint16) internal returns (uint256) { return IERC721CreatorCore(_creator).mintExtension(to); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Library used to query support of an interface declared via {IERC165}. * * Note that these functions return the actual result of the query: they do not * `revert` if an interface is not supported. It is up to the caller to decide * what to do in these cases. */ library ERC165Checker { // As per the EIP-165 spec, no interface should ever match 0xffffffff bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff; /** * @dev Returns true if `account` supports the {IERC165} interface, */ function supportsERC165(address account) internal view returns (bool) { // Any contract that implements ERC165 must explicitly indicate support of // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid return _supportsERC165Interface(account, type(IERC165).interfaceId) && !_supportsERC165Interface(account, _INTERFACE_ID_INVALID); } /** * @dev Returns true if `account` supports the interface defined by * `interfaceId`. Support for {IERC165} itself is queried automatically. * * See {IERC165-supportsInterface}. */ function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { // query support of both ERC165 as per the spec and support of _interfaceId return supportsERC165(account) && _supportsERC165Interface(account, interfaceId); } /** * @dev Returns a boolean array where each value corresponds to the * interfaces passed in and whether they're supported or not. This allows * you to batch check interfaces for a contract where your expectation * is that some interfaces may not be supported. * * See {IERC165-supportsInterface}. * * _Available since v3.4._ */ function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) { // an array of booleans corresponding to interfaceIds and whether they're supported or not bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); // query support of ERC165 itself if (supportsERC165(account)) { // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]); } } return interfaceIdsSupported; } /** * @dev Returns true if `account` supports all the interfaces defined in * `interfaceIds`. Support for {IERC165} itself is queried automatically. * * Batch-querying can lead to gas savings by skipping repeated checks for * {IERC165} support. * * See {IERC165-supportsInterface}. */ function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { // query support of ERC165 itself if (!supportsERC165(account)) { return false; } // query support of each interface in _interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { if (!_supportsERC165Interface(account, interfaceIds[i])) { return false; } } // all interfaces supported return true; } /** * @notice Query if a contract implements an interface, does not check ERC165 support * @param account The address of the contract to query for support of an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @return true if the contract at account indicates support of the interface with * identifier interfaceId, false otherwise * @dev Assumes that account contains a contract that supports ERC165, otherwise * the behavior of this method is undefined. This precondition can be checked * with {supportsERC165}. * Interface identification is specified in ERC-165. */ function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) { bytes memory encodedParams = abi.encodeWithSelector(IERC165(account).supportsInterface.selector, interfaceId); (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams); if (result.length < 32) return false; return success && abi.decode(result, (bool)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Core creator interface */ interface ICreatorCore is IERC165 { event ExtensionRegistered(address indexed extension, address indexed sender); event ExtensionUnregistered(address indexed extension, address indexed sender); event ExtensionBlacklisted(address indexed extension, address indexed sender); event MintPermissionsUpdated(address indexed extension, address indexed permissions, address indexed sender); event RoyaltiesUpdated(uint256 indexed tokenId, address payable[] receivers, uint256[] basisPoints); event DefaultRoyaltiesUpdated(address payable[] receivers, uint256[] basisPoints); event ExtensionRoyaltiesUpdated(address indexed extension, address payable[] receivers, uint256[] basisPoints); event ExtensionApproveTransferUpdated(address indexed extension, bool enabled); /** * @dev gets address of all extensions */ function getExtensions() external view returns (address[] memory); /** * @dev add an extension. Can only be called by contract owner or admin. * extension address must point to a contract implementing ICreatorExtension. * Returns True if newly added, False if already added. */ function registerExtension(address extension, string calldata baseURI) external; /** * @dev add an extension. Can only be called by contract owner or admin. * extension address must point to a contract implementing ICreatorExtension. * Returns True if newly added, False if already added. */ function registerExtension(address extension, string calldata baseURI, bool baseURIIdentical) external; /** * @dev add an extension. Can only be called by contract owner or admin. * Returns True if removed, False if already removed. */ function unregisterExtension(address extension) external; /** * @dev blacklist an extension. Can only be called by contract owner or admin. * This function will destroy all ability to reference the metadata of any tokens created * by the specified extension. It will also unregister the extension if needed. * Returns True if removed, False if already removed. */ function blacklistExtension(address extension) external; /** * @dev set the baseTokenURI of an extension. Can only be called by extension. */ function setBaseTokenURIExtension(string calldata uri) external; /** * @dev set the baseTokenURI of an extension. Can only be called by extension. * For tokens with no uri configured, tokenURI will return "uri+tokenId" */ function setBaseTokenURIExtension(string calldata uri, bool identical) external; /** * @dev set the common prefix of an extension. Can only be called by extension. * If configured, and a token has a uri set, tokenURI will return "prefixURI+tokenURI" * Useful if you want to use ipfs/arweave */ function setTokenURIPrefixExtension(string calldata prefix) external; /** * @dev set the tokenURI of a token extension. Can only be called by extension that minted token. */ function setTokenURIExtension(uint256 tokenId, string calldata uri) external; /** * @dev set the tokenURI of a token extension for multiple tokens. Can only be called by extension that minted token. */ function setTokenURIExtension(uint256[] memory tokenId, string[] calldata uri) external; /** * @dev set the baseTokenURI for tokens with no extension. Can only be called by owner/admin. * For tokens with no uri configured, tokenURI will return "uri+tokenId" */ function setBaseTokenURI(string calldata uri) external; /** * @dev set the common prefix for tokens with no extension. Can only be called by owner/admin. * If configured, and a token has a uri set, tokenURI will return "prefixURI+tokenURI" * Useful if you want to use ipfs/arweave */ function setTokenURIPrefix(string calldata prefix) external; /** * @dev set the tokenURI of a token with no extension. Can only be called by owner/admin. */ function setTokenURI(uint256 tokenId, string calldata uri) external; /** * @dev set the tokenURI of multiple tokens with no extension. Can only be called by owner/admin. */ function setTokenURI(uint256[] memory tokenIds, string[] calldata uris) external; /** * @dev set a permissions contract for an extension. Used to control minting. */ function setMintPermissions(address extension, address permissions) external; /** * @dev Configure so transfers of tokens created by the caller (must be extension) gets approval * from the extension before transferring */ function setApproveTransferExtension(bool enabled) external; /** * @dev get the extension of a given token */ function tokenExtension(uint256 tokenId) external view returns (address); /** * @dev Set default royalties */ function setRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Set royalties of a token */ function setRoyalties(uint256 tokenId, address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Set royalties of an extension */ function setRoyaltiesExtension(address extension, address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Get royalites of a token. Returns list of receivers and basisPoints */ function getRoyalties(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); // Royalty support for various other standards function getFeeRecipients(uint256 tokenId) external view returns (address payable[] memory); function getFeeBps(uint256 tokenId) external view returns (uint[] memory); function getFees(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address, uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "./IRedeemBase.sol"; /** * @dev Base redemption interface */ interface IERC721RedeemBase is IRedeemBase { /** * @dev Get the max number of redemptions */ function redemptionMax() external view returns(uint16); /** * @dev Get the redemption rate */ function redemptionRate() external view returns(uint16); /** * @dev Get number of redemptions left */ function redemptionRemaining() external view returns(uint16); /** * @dev Get the mint number of a created token id */ function mintNumber(uint256 tokenId) external view returns(uint256); /** * @dev Get list of all minted tokens */ function mintedTokens() external view returns(uint256[] memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@manifoldxyz/libraries-solidity/contracts/access/AdminControl.sol"; import "./IRedeemBase.sol"; struct range{ uint256 min; uint256 max; } /** * @dev Burn NFT's to receive another lazy minted NFT */ abstract contract RedeemBase is AdminControl, IRedeemBase { using EnumerableSet for EnumerableSet.UintSet; // approved contract tokens mapping(address => bool) private _approvedContracts; // approved specific tokens mapping(address => EnumerableSet.UintSet) private _approvedTokens; mapping(address => range[]) private _approvedTokenRange; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(AdminControl, IERC165) returns (bool) { return interfaceId == type(IRedeemBase).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IRedeemBase-updateApprovedContracts} */ function updateApprovedContracts(address[] memory contracts, bool[] memory approved) public virtual override adminRequired { require(contracts.length == approved.length, "Redeem: Invalid input parameters"); for (uint i=0; i < contracts.length; i++) { _approvedContracts[contracts[i]] = approved[i]; } emit UpdateApprovedContracts(contracts, approved); } /** * @dev See {IRedeemBase-updateApprovedTokens} */ function updateApprovedTokens(address contract_, uint256[] memory tokenIds, bool[] memory approved) public virtual override adminRequired { require(tokenIds.length == approved.length, "Redeem: Invalid input parameters"); for (uint i=0; i < tokenIds.length; i++) { if (approved[i] && !_approvedTokens[contract_].contains(tokenIds[i])) { _approvedTokens[contract_].add(tokenIds[i]); } else if (!approved[i] && _approvedTokens[contract_].contains(tokenIds[i])) { _approvedTokens[contract_].remove(tokenIds[i]); } } emit UpdateApprovedTokens(contract_, tokenIds, approved); } /** * @dev See {IRedeemBase-updateApprovedTokenRanges} */ function updateApprovedTokenRanges(address contract_, uint256[] memory minTokenIds, uint256[] memory maxTokenIds) public virtual override adminRequired { require(minTokenIds.length == maxTokenIds.length, "Redeem: Invalid input parameters"); uint existingRangesLength = _approvedTokenRange[contract_].length; for (uint i=0; i < existingRangesLength; i++) { _approvedTokenRange[contract_][i].min = 0; _approvedTokenRange[contract_][i].max = 0; } for (uint i=0; i < minTokenIds.length; i++) { require(minTokenIds[i] < maxTokenIds[i], "Redeem: min must be less than max"); if (i < existingRangesLength) { _approvedTokenRange[contract_][i].min = minTokenIds[i]; _approvedTokenRange[contract_][i].max = maxTokenIds[i]; } else { _approvedTokenRange[contract_].push(range(minTokenIds[i], maxTokenIds[i])); } } emit UpdateApprovedTokenRanges(contract_, minTokenIds, maxTokenIds); } /** * @dev See {IRedeemBase-redeemable} */ function redeemable(address contract_, uint256 tokenId) public view virtual override returns(bool) { if (_approvedContracts[contract_]) { return true; } if (_approvedTokens[contract_].contains(tokenId)) { return true; } if (_approvedTokenRange[contract_].length > 0) { for (uint i=0; i < _approvedTokenRange[contract_].length; i++) { if (_approvedTokenRange[contract_][i].max != 0 && tokenId >= _approvedTokenRange[contract_][i].min && tokenId <= _approvedTokenRange[contract_][i].max) { return true; } } } return false; } }
// SPDX-License-Identifier: BSD-4-Clause pragma solidity ^0.8.0; /// @author: manifold.xyz /** * Library of legacy interface constants */ library LegacyInterfaces { // LEGACY ERC721CreatorCore interface bytes4 internal constant IERC721CreatorCore_v1 = 0x478c8530; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; /** * @dev Base creator extension variables */ abstract contract CreatorExtension is ERC165 { /** * @dev Legacy extension interface identifiers * * {IERC165-supportsInterface} needs to return 'true' for this interface * in order backwards compatible with older creator contracts */ bytes4 constant internal LEGACY_EXTENSION_INTERFACE = 0x7005caad; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165) returns (bool) { return interfaceId == LEGACY_EXTENSION_INTERFACE || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@manifoldxyz/libraries-solidity/contracts/access/IAdminControl.sol"; /** * @dev Base redemption interface */ interface IRedeemBase is IAdminControl { event UpdateApprovedContracts(address[] contracts, bool[] approved); event UpdateApprovedTokens(address contract_, uint256[] tokenIds, bool[] approved); event UpdateApprovedTokenRanges(address contract_, uint256[] minTokenIds, uint256[] maxTokenIds); /** * @dev Update approved contracts that can be used to redeem. Can only be called by contract owner/admin. */ function updateApprovedContracts(address[] calldata contracts, bool[] calldata approved) external; /** * @dev Update approved tokens that can be used to redeem. Can only be called by contract owner/admin. */ function updateApprovedTokens(address contract_, uint256[] calldata tokenIds, bool[] calldata approved) external; /** * @dev Update approved token ranges that can be used to redeem. Can only be called by contract owner/admin. * Clears out old ranges */ function updateApprovedTokenRanges(address contract_, uint256[] calldata minTokenIds, uint256[] calldata maxTokenIds) external; /** * @dev Check if an NFT is redeemable */ function redeemable(address contract_, uint256 tokenId) external view returns(bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./IAdminControl.sol"; abstract contract AdminControl is Ownable, IAdminControl, ERC165 { using EnumerableSet for EnumerableSet.AddressSet; // Track registered admins EnumerableSet.AddressSet private _admins; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IAdminControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Only allows approved admins to call the specified function */ modifier adminRequired() { require(owner() == msg.sender || _admins.contains(msg.sender), "AdminControl: Must be owner or admin"); _; } /** * @dev See {IAdminControl-getAdmins}. */ function getAdmins() external view override returns (address[] memory admins) { admins = new address[](_admins.length()); for (uint i = 0; i < _admins.length(); i++) { admins[i] = _admins.at(i); } return admins; } /** * @dev See {IAdminControl-approveAdmin}. */ function approveAdmin(address admin) external override onlyOwner { if (!_admins.contains(admin)) { emit AdminApproved(admin, msg.sender); _admins.add(admin); } } /** * @dev See {IAdminControl-revokeAdmin}. */ function revokeAdmin(address admin) external override onlyOwner { if (_admins.contains(admin)) { emit AdminRevoked(admin, msg.sender); _admins.remove(admin); } } /** * @dev See {IAdminControl-isAdmin}. */ function isAdmin(address admin) public override view returns (bool) { return (owner() == admin || _admins.contains(admin)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Interface for admin control */ interface IAdminControl is IERC165 { event AdminApproved(address indexed account, address indexed sender); event AdminRevoked(address indexed account, address indexed sender); /** * @dev gets address of all admins */ function getAdmins() external view returns (address[] memory); /** * @dev add an admin. Can only be called by contract owner. */ function approveAdmin(address admin) external; /** * @dev remove an admin. Can only be called by contract owner. */ function revokeAdmin(address admin) external; /** * @dev checks whether or not given address is an admin * Returns True if they are */ function isAdmin(address admin) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"creator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"contracts","type":"address[]"},{"indexed":false,"internalType":"bool[]","name":"approved","type":"bool[]"}],"name":"UpdateApprovedContracts","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contract_","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"minTokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"maxTokenIds","type":"uint256[]"}],"name":"UpdateApprovedTokenRanges","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contract_","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"bool[]","name":"approved","type":"bool[]"}],"name":"UpdateApprovedTokens","type":"event"},{"inputs":[],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"approveAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"admins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contract_","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"recoverERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"redeemERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contract_","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"redeemable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redemptionMax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redemptionRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redemptionRemaining","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contract_","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"recoverer","type":"address"}],"name":"setERC721Recoverable","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":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"bool[]","name":"approved","type":"bool[]"}],"name":"updateApprovedContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contract_","type":"address"},{"internalType":"uint256[]","name":"minTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"maxTokenIds","type":"uint256[]"}],"name":"updateApprovedTokenRanges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contract_","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bool[]","name":"approved","type":"bool[]"}],"name":"updateApprovedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"uriParts","type":"string[]"}],"name":"updateURIParts","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162004804380380620048048339810160408190526200003491620006a2565b60016000819055819060638282826200004d3362000456565b6200006b83639088c20760e01b620004a860201b620022881760201c565b80620000905750620000908363478c853060e01b620004a860201b620022881760201c565b620001115760405162461bcd60e51b815260206004820152604160248201527f52656465656d3a204d696e74696e672072657761726420636f6e74726163742060448201527f6d75737420696d706c656d656e74204945524337323143726561746f72436f726064820152606560f81b608482015260a40160405180910390fd5b61ffff918216608052600780546001600160a01b039094166001600160a01b031992909316600160a01b02919091166001600160b01b0319909316929092171790555050600b80546001810182556000918252604080516060810190915260398082526000805160206200451f833981519152909201935090620047cb60208301398051620001a8939250602090910190620005fc565b50600b8054600181018255600091909152604080518082019091526009808252681e22a224aa24a7a71f60b91b6020909201918252620001fb926000805160206200451f833981519152019190620005fc565b50600b80546001810182556000918252604080516060810190915260248082526000805160206200451f8339815191529092019291620044fb602083013980516200024e939250602090910190620005fc565b50600b805460018101825560009182526040805160a0810190915260618082526000805160206200451f8339815191529092019291620046a460208301398051620002a1939250602090910190620005fc565b50600b805460018101825560009182526040805161016081019091526101308082526000805160206200451f8339815191529092019291620043cb60208301398051620002f6939250602090910190620005fc565b50600b80546001810182556000918252604080516101a081019091526101658082526000805160206200451f83398151915290920192916200453f602083013980516200034b939250602090910190620005fc565b50600b8054600181018255600091825260408051610100810190915260c68082526000805160206200451f833981519152909201929162004705602083013980516200039f939250602090910190620005fc565b50600b8054600181018255600091909152604080518082019091526009808252681e22a224aa24a7a71f60b91b6020909201918252620003f2926000805160206200451f833981519152019190620005fc565b50600b8054600181018255600091909152604080518082019091526012808252712c226d61785f76616c7565223a39397d5d7d60701b60209092019182526200044e926000805160206200451f833981519152019190620005fc565b505062000773565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000620004b583620004d2565b8015620004c95750620004c983836200050a565b90505b92915050565b6000620004e7826301ffc9a760e01b6200050a565b8015620004cc575062000503826001600160e01b03196200050a565b1592915050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b179052905160009190829081906001600160a01b038716906175309062000573908690620006d4565b6000604051808303818686fa925050503d8060008114620005b1576040519150601f19603f3d011682016040523d82523d6000602084013e620005b6565b606091505b5091509150602081511015620005d35760009350505050620004cc565b818015620005f2575080806020019051810190620005f2919062000712565b9695505050505050565b8280546200060a9062000736565b90600052602060002090601f0160209004810192826200062e576000855562000679565b82601f106200064957805160ff191683800117855562000679565b8280016001018555821562000679579182015b82811115620006795782518255916020019190600101906200065c565b50620006879291506200068b565b5090565b5b808211156200068757600081556001016200068c565b600060208284031215620006b557600080fd5b81516001600160a01b0381168114620006cd57600080fd5b9392505050565b6000825160005b81811015620006f75760208186018101518583015201620006db565b8181111562000707576000828501525b509190910192915050565b6000602082840312156200072557600080fd5b81518015158114620006cd57600080fd5b600181811c908216806200074b57607f821691505b602082108114156200076d57634e487b7160e01b600052602260045260246000fd5b50919050565b608051613c20620007ab6000396000818161028f015281816105f70152818161178e015281816119b30152611fd20152613c206000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c8063715018a6116100ee578063ac52e64411610097578063e9dc637511610071578063e9dc637514610396578063f23a6e61146103b6578063f2fde38b146103c9578063f79f20b5146103dc57600080fd5b8063ac52e6441461035d578063bc197c8114610370578063d3e3ac8c1461038357600080fd5b80638da5cb5b116100c85780638da5cb5b1461031c57806399b96aab14610337578063ac4cc1481461034a57600080fd5b8063715018a6146102ec578063819d4cc6146102f45780638d75fe051461030757600080fd5b80632d3456701161015b578063540385a311610135578063540385a31461028d57806367627b62146102b35780636c2ab4ba146102c65780636d73e669146102d957600080fd5b80632d3456701461025257806331ae450b1461026557806348efee0a1461027a57600080fd5b8063150b7a021161018c578063150b7a021461020057806324d7806c1461022c5780632af8a4131461023f57600080fd5b806301ffc9a7146101b357806304c9fdb0146101db5780630f15f4c0146101f6575b600080fd5b6101c66101c1366004612e9d565b6103fd565b60405190151581526020015b60405180910390f35b6101e3610441565b60405161ffff90911681526020016101d2565b6101fe61046a565b005b61021361020e366004612f25565b610545565b6040516001600160e01b031990911681526020016101d2565b6101c661023a366004612f98565b6107db565b6101fe61024d36600461308b565b610814565b6101fe610260366004612f98565b610c0e565b61026d610cbe565b6040516101d29190613145565b6101fe6102883660046131ca565b610d6d565b7f00000000000000000000000000000000000000000000000000000000000000006101e3565b6101c66102c1366004613236565b610fff565b6101fe6102d4366004613262565b611065565b6101fe6102e7366004612f98565b6111cf565b6101fe611279565b6101fe610302366004613236565b6112dd565b61030f6113d6565b6040516101d291906132d4565b6001546040516001600160a01b0390911681526020016101d2565b6101fe6103453660046132e7565b61142e565b600754600160a01b900461ffff166101e3565b6101fe61036b3660046133ee565b61149b565b61021361037e3660046134f5565b611630565b6101fe6103913660046135b4565b611907565b6103a96103a4366004613236565b611eae565b6040516101d29190613650565b6102136103c4366004613683565b611f20565b6101fe6103d7366004612f98565b612144565b6103ef6103ea3660046136ff565b612223565b6040519081526020016101d2565b60006001600160e01b031982167fe9dc637500000000000000000000000000000000000000000000000000000000148061043b575061043b826122a4565b92915050565b6007546000906104659061ffff600160b01b8204811691600160a01b90041661372e565b905090565b6001546001600160a01b031633146104c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600c5460ff161561051c5760405162461bcd60e51b815260206004820152600e60248201527f416c72656164792061637469766500000000000000000000000000000000000060448201526064016104c0565b600c805460ff1916600117905561054361053e6001546001600160a01b031690565b6122e2565b565b60006002600054141561059a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104c0565b60026000556105a93385610fff565b6105f55760405162461bcd60e51b815260206004820152601760248201527f4275726e52656465656d3a20496e76616c6964204e465400000000000000000060448201526064016104c0565b7f000000000000000000000000000000000000000000000000000000000000000061ffff166001146106b55760405162461bcd60e51b815260206004820152604360248201527f4275726e52656465656d3a2043616e206f6e6c7920616c6c6f7720646972656360448201527f7420726563656976696e67206f6620726564656d7074696f6e73206f6620312060648201527f4e46540000000000000000000000000000000000000000000000000000000000608482015260a4016104c0565b6040517fb88d4fde000000000000000000000000000000000000000000000000000000008152339063b88d4fde906106fb90309061dead9089908990899060040161377a565b600060405180830381600087803b15801561071557600080fd5b505af1925050508015610726575060015b6107a2573d808015610754576040519150601f19603f3d011682016040523d82523d6000602084013e610759565b606091505b5060405162461bcd60e51b815260206004820152601860248201527f4275726e52656465656d3a204275726e206661696c757265000000000000000060448201526064016104c0565b6107ab856122e2565b507f150b7a0200000000000000000000000000000000000000000000000000000000600160005595945050505050565b6000816001600160a01b03166107f96001546001600160a01b031690565b6001600160a01b0316148061043b575061043b6002836123ed565b336108276001546001600160a01b031690565b6001600160a01b0316148061084257506108426002336123ed565b61089a5760405162461bcd60e51b8152602060048201526024808201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616044820152633236b4b760e11b60648201526084016104c0565b80518251146108eb5760405162461bcd60e51b815260206004820181905260248201527f52656465656d3a20496e76616c696420696e70757420706172616d657465727360448201526064016104c0565b6001600160a01b038316600090815260066020526040812054905b8181101561099b576001600160a01b0385166000908152600660205260408120805483908110610938576109386137b8565b600091825260208083206002909202909101929092556001600160a01b0387168152600690915260408120805483908110610975576109756137b8565b600091825260209091206001600290920201015580610993816137ce565b915050610906565b5060005b8351811015610bcc578281815181106109ba576109ba6137b8565b60200260200101518482815181106109d4576109d46137b8565b602002602001015110610a4f5760405162461bcd60e51b815260206004820152602160248201527f52656465656d3a206d696e206d757374206265206c657373207468616e206d6160448201527f780000000000000000000000000000000000000000000000000000000000000060648201526084016104c0565b81811015610b2657838181518110610a6957610a696137b8565b602002602001015160066000876001600160a01b03166001600160a01b031681526020019081526020016000208281548110610aa757610aa76137b8565b906000526020600020906002020160000181905550828181518110610ace57610ace6137b8565b602002602001015160066000876001600160a01b03166001600160a01b031681526020019081526020016000208281548110610b0c57610b0c6137b8565b906000526020600020906002020160010181905550610bba565b60066000866001600160a01b03166001600160a01b031681526020019081526020016000206040518060400160405280868481518110610b6857610b686137b8565b60200260200101518152602001858481518110610b8757610b876137b8565b60209081029190910181015190915282546001818101855560009485529382902083516002909202019081559101519101555b80610bc4816137ce565b91505061099f565b507fc834fb6349b577e8519e3cb6df7274bdd4957d7388d8cc9b54467d8af9d6537b848484604051610c00939291906137e9565b60405180910390a150505050565b6001546001600160a01b03163314610c685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c0565b610c736002826123ed565b15610cbb5760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a3610cb960028261240f565b505b50565b6060610cca6002612424565b67ffffffffffffffff811115610ce257610ce2612fb5565b604051908082528060200260200182016040528015610d0b578160200160208202803683370190505b50905060005b610d1b6002612424565b811015610d6957610d2d60028261242e565b828281518110610d3f57610d3f6137b8565b6001600160a01b039092166020928302919091019091015280610d61816137ce565b915050610d11565b5090565b33610d806001546001600160a01b031690565b6001600160a01b03161480610d9b5750610d9b6002336123ed565b610df35760405162461bcd60e51b8152602060048201526024808201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616044820152633236b4b760e11b60648201526084016104c0565b8051825114610e445760405162461bcd60e51b815260206004820181905260248201527f52656465656d3a20496e76616c696420696e70757420706172616d657465727360448201526064016104c0565b60005b8251811015610fbe57818181518110610e6257610e626137b8565b60200260200101518015610ec35750610ec1838281518110610e8657610e866137b8565b602002602001015160056000876001600160a01b03166001600160a01b0316815260200190815260200160002061243a90919063ffffffff16565b155b15610f1e57610f18838281518110610edd57610edd6137b8565b602002602001015160056000876001600160a01b03166001600160a01b0316815260200190815260200160002061245290919063ffffffff16565b50610fac565b818181518110610f3057610f306137b8565b6020026020010151158015610f555750610f55838281518110610e8657610e866137b8565b15610fac57610faa838281518110610f6f57610f6f6137b8565b602002602001015160056000876001600160a01b03166001600160a01b0316815260200190815260200160002061245e90919063ffffffff16565b505b80610fb6816137ce565b915050610e47565b507f0ed1ede59c177063e00a17d07584b15a0eb10205d90702aeff646f55bb33aa89838383604051610ff29392919061384f565b60405180910390a1505050565b600c5460009060ff166110545760405162461bcd60e51b815260206004820152600860248201527f496e61637469766500000000000000000000000000000000000000000000000060448201526064016104c0565b61105e838361246a565b9392505050565b336110786001546001600160a01b031690565b6001600160a01b0316148061109357506110936002336123ed565b6110eb5760405162461bcd60e51b8152602060048201526024808201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616044820152633236b4b760e11b60648201526084016104c0565b611115837f80ac58cd00000000000000000000000000000000000000000000000000000000612288565b6111875760405162461bcd60e51b815260206004820152602260248201527f4275726e52656465656d3a204d75737420696d706c656d656e7420494552433760448201527f323100000000000000000000000000000000000000000000000000000000000060648201526084016104c0565b6001600160a01b039283166000908152600a6020908152604080832094835293905291909120805473ffffffffffffffffffffffffffffffffffffffff191691909216179055565b6001546001600160a01b031633146112295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c0565b6112346002826123ed565b610cbb5760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a3610cb96002826125fd565b6001546001600160a01b031633146112d35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c0565b6105436000612612565b6001600160a01b038083166000908152600a60209081526040808320858452909152902054163381146113525760405162461bcd60e51b815260206004820152601d60248201527f4275726e52656465656d3a205065726d697373696f6e2064656e69656400000060448201526064016104c0565b6040517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152336024820152604481018390526001600160a01b038416906342842e0e90606401600060405180830381600087803b1580156113b957600080fd5b505af11580156113cd573d6000803e3d6000fd5b50505050505050565b6060600880548060200260200160405190810160405280929190818152602001828054801561142457602002820191906000526020600020905b815481526020019060010190808311611410575b5050505050905090565b6001546001600160a01b031633146114885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c0565b8051610cb990600b906020840190612d58565b336114ae6001546001600160a01b031690565b6001600160a01b031614806114c957506114c96002336123ed565b6115215760405162461bcd60e51b8152602060048201526024808201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616044820152633236b4b760e11b60648201526084016104c0565b80518251146115725760405162461bcd60e51b815260206004820181905260248201527f52656465656d3a20496e76616c696420696e70757420706172616d657465727360448201526064016104c0565b60005b82518110156115f257818181518110611590576115906137b8565b6020026020010151600460008584815181106115ae576115ae6137b8565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806115ea816137ce565b915050611575565b507fb987f16cb95c27617d184f54a4a9d80cfa894b91e2d679ed76042493954481488282604051611624929190613883565b60405180910390a15050565b6000600260005414156116855760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104c0565b60026000558584146116d95760405162461bcd60e51b815260206004820152601960248201527f4275726e52656465656d3a20496e76616c696420696e7075740000000000000060448201526064016104c0565b6000805b8781101561178b57611707338a8a848181106116fb576116fb6137b8565b90506020020135610fff565b6117535760405162461bcd60e51b815260206004820152601760248201527f4275726e52656465656d3a20496e76616c6964204e465400000000000000000060448201526064016104c0565b868682818110611765576117656137b8565b905060200201358261177791906138b1565b915080611783816137ce565b9150506116dd565b507f000000000000000000000000000000000000000000000000000000000000000061ffff1681146118255760405162461bcd60e51b815260206004820152603360248201527f4275726e52656465656d3a20496e636f7272656374206e756d626572206f662060448201527f4e465473206265696e672072656465656d65640000000000000000000000000060648201526084016104c0565b6040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081523390632eb2c2d69061187190309061dead908d908d908d908d908d908d90600401613918565b600060405180830381600087803b15801561188b57600080fd5b505af192505050801561189c575060015b6118ca573d808015610754576040519150601f19603f3d011682016040523d82523d6000602084013e610759565b6118d3896122e2565b50506001600055507fbc197c8100000000000000000000000000000000000000000000000000000000979650505050505050565b6002600054141561195a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104c0565b60026000558281146119ae5760405162461bcd60e51b815260206004820152601e60248201527f4275726e52656465656d3a20496e76616c696420706172616d6574657273000060448201526064016104c0565b61ffff7f0000000000000000000000000000000000000000000000000000000000000000168314611a475760405162461bcd60e51b815260206004820152603360248201527f4275726e52656465656d3a20496e636f7272656374206e756d626572206f662060448201527f4e465473206265696e672072656465656d65640000000000000000000000000060648201526084016104c0565b60005b83811015611e9957611a8e858583818110611a6757611a676137b8565b9050602002016020810190611a7c9190612f98565b8484848181106116fb576116fb6137b8565b611ada5760405162461bcd60e51b815260206004820152601760248201527f4275726e52656465656d3a20496e76616c6964204e465400000000000000000060448201526064016104c0565b848482818110611aec57611aec6137b8565b9050602002016020810190611b019190612f98565b6001600160a01b0316636352211e848484818110611b2157611b216137b8565b905060200201356040518263ffffffff1660e01b8152600401611b4691815260200190565b602060405180830381865afa925050508015611b7f575060408051601f3d908101601f19168201909252611b7c9181019061397c565b60015b611bfb573d808015611bad576040519150601f19603f3d011682016040523d82523d6000602084013e611bb2565b606091505b5060405162461bcd60e51b815260206004820152601e60248201527f4275726e52656465656d3a2042616420746f6b656e20636f6e7472616374000060448201526064016104c0565b6001600160a01b0381163314611c535760405162461bcd60e51b815260206004820181905260248201527f4275726e52656465656d3a2043616c6c6572206d757374206f776e204e46547360448201526064016104c0565b50848482818110611c6657611c666137b8565b9050602002016020810190611c7b9190612f98565b6001600160a01b031663081812fc848484818110611c9b57611c9b6137b8565b905060200201356040518263ffffffff1660e01b8152600401611cc091815260200190565b602060405180830381865afa925050508015611cf9575060408051601f3d908101601f19168201909252611cf69181019061397c565b60015b611d27573d808015611bad576040519150601f19603f3d011682016040523d82523d6000602084013e611bb2565b6001600160a01b0381163014611da55760405162461bcd60e51b815260206004820152603760248201527f4275726e52656465656d3a20436f6e7472616374206d7573742062652067697660448201527f656e20617070726f76616c20746f206275726e204e465400000000000000000060648201526084016104c0565b50848482818110611db857611db86137b8565b9050602002016020810190611dcd9190612f98565b6001600160a01b03166323b872dd3361dead868686818110611df157611df16137b8565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015611e4857600080fd5b505af1925050508015611e59575060015b611e87573d808015610754576040519150601f19603f3d011682016040523d82523d6000602084013e610759565b80611e91816137ce565b915050611a4a565b50611ea3336122e2565b505060016000555050565b6007546060906001600160a01b038481169116148015611edb575060008281526009602052604090205415155b611f175760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b60448201526064016104c0565b61105e82612671565b600060026000541415611f755760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104c0565b6002600055611f843386610fff565b611fd05760405162461bcd60e51b815260206004820152601760248201527f4275726e52656465656d3a20496e76616c6964204e465400000000000000000060448201526064016104c0565b7f000000000000000000000000000000000000000000000000000000000000000061ffff1684146120695760405162461bcd60e51b815260206004820152603360248201527f4275726e52656465656d3a20496e636f7272656374206e756d626572206f662060448201527f4e465473206265696e672072656465656d65640000000000000000000000000060648201526084016104c0565b6040517ff242432a000000000000000000000000000000000000000000000000000000008152339063f242432a906120b190309061dead908a908a908a908a90600401613999565b600060405180830381600087803b1580156120cb57600080fd5b505af19250505080156120dc575060015b61210a573d808015610754576040519150601f19603f3d011682016040523d82523d6000602084013e610759565b612113866122e2565b507ff23a6e610000000000000000000000000000000000000000000000000000000060016000559695505050505050565b6001546001600160a01b0316331461219e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c0565b6001600160a01b03811661221a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104c0565b610cbb81612612565b60008181526009602052604081205461226e5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b60448201526064016104c0565b60008281526009602052604090205461043b9060646139de565b600061229383612787565b801561105e575061105e83836127ba565b60006001600160e01b031982167f3e5454f000000000000000000000000000000000000000000000000000000000148061043b575061043b826128b8565b60075461ffff600160a01b82048116600160b01b90920416106123475760405162461bcd60e51b815260206004820181905260248201527f52656465656d3a204e6f20726564656d7074696f6e732072656d61696e696e6760448201526064016104c0565b60078054600160b01b900461ffff16906016612362836139f5565b91906101000a81548161ffff021916908361ffff16021790555050600061239982600760169054906101000a900461ffff16612905565b60088054600181019091557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301819055600754600091825260096020526040909120600160b01b90910461ffff1690555050565b6001600160a01b0381166000908152600183016020526040812054151561105e565b600061105e836001600160a01b03841661298f565b600061043b825490565b600061105e8383612a82565b6000818152600183016020526040812054151561105e565b600061105e8383612aac565b600061105e838361298f565b6001600160a01b03821660009081526004602052604081205460ff16156124935750600161043b565b6001600160a01b03831660009081526005602052604090206124b5908361243a565b156124c25750600161043b565b6001600160a01b038316600090815260066020526040902054156125f45760005b6001600160a01b0384166000908152600660205260409020548110156125f2576001600160a01b038416600090815260066020526040902080548290811061252d5761252d6137b8565b90600052602060002090600202016001015460001415801561258a57506001600160a01b0384166000908152600660205260409020805482908110612574576125746137b8565b9060005260206000209060020201600001548310155b80156125d157506001600160a01b03841660009081526006602052604090208054829081106125bb576125bb6137b8565b9060005260206000209060020201600101548311155b156125e057600191505061043b565b806125ea816137ce565b9150506124e3565b505b50600092915050565b600061105e836001600160a01b038416612aac565b600180546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60608060005b600b54811015612780576126dc600b8281548110612697576126976137b8565b906000526020600020016040518060400160405280600981526020017f3c45444954494f4e3e0000000000000000000000000000000000000000000000815250612afb565b1561272d576000848152600960205260409020548290612706906127019060646139de565b612b54565b604051602001612717929190613a17565b604051602081830303815290604052915061276e565b81600b8281548110612741576127416137b8565b9060005260206000200160405160200161275c929190613b1a565b60405160208183030381529060405291505b80612778816137ce565b915050612677565b5092915050565b600061279a826301ffc9a760e01b6127ba565b801561043b57506127b3826001600160e01b03196127ba565b1592915050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b179052905160009190829081906001600160a01b0387169061753090612836908690613b38565b6000604051808303818686fa925050503d8060008114612872576040519150601f19603f3d011682016040523d82523d6000602084013e612877565b606091505b5091509150602081511015612892576000935050505061043b565b8180156128ae5750808060200190518101906128ae9190613b54565b9695505050505050565b60006001600160e01b031982167f866c67eb0000000000000000000000000000000000000000000000000000000014806128f657506128f682612c8e565b8061043b575061043b82612ccc565b6007546040517f2928ca580000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526000921690632928ca58906024016020604051808303816000875af115801561296b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105e9190613b71565b60008181526001830160205260408120548015612a785760006129b36001836139de565b85549091506000906129c7906001906139de565b9050818114612a2c5760008660000182815481106129e7576129e76137b8565b9060005260206000200154905080876000018481548110612a0a57612a0a6137b8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612a3d57612a3d613b8a565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061043b565b600091505061043b565b6000826000018281548110612a9957612a996137b8565b9060005260206000200154905092915050565b6000818152600183016020526040812054612af35750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561043b565b50600061043b565b600081604051602001612b0e9190613b38565b6040516020818303038152906040528051906020012083604051602001612b359190613ba0565b6040516020818303038152906040528051906020012014905092915050565b606081612b9457505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612bbe5780612ba8816137ce565b9150612bb79050600a83613bc2565b9150612b98565b60008167ffffffffffffffff811115612bd957612bd9612fb5565b6040519080825280601f01601f191660200182016040528015612c03576020820181803683370190505b5090505b8415612c8657612c186001836139de565b9150612c25600a86613bd6565b612c309060306138b1565b60f81b818381518110612c4557612c456137b8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612c7f600a86613bc2565b9450612c07565b949350505050565b60006001600160e01b031982167fa927d73f00000000000000000000000000000000000000000000000000000000148061043b575061043b82612d0a565b60006001600160e01b031982167f7005caad00000000000000000000000000000000000000000000000000000000148061043b575061043b82612c8e565b60006001600160e01b031982167f553e757e00000000000000000000000000000000000000000000000000000000148061043b57506301ffc9a760e01b6001600160e01b031983161461043b565b828054828255906000526020600020908101928215612da5579160200282015b82811115612da55782518051612d95918491602090910190612db1565b5091602001919060010190612d78565b50610d69929150612e31565b828054612dbd90613a46565b90600052602060002090601f016020900481019282612ddf5760008555612e25565b82601f10612df857805160ff1916838001178555612e25565b82800160010185558215612e25579182015b82811115612e25578251825591602001919060010190612e0a565b50610d69929150612e4e565b80821115610d69576000612e458282612e63565b50600101612e31565b5b80821115610d695760008155600101612e4f565b508054612e6f90613a46565b6000825580601f10612e7f575050565b601f016020900490600052602060002090810190610cbb9190612e4e565b600060208284031215612eaf57600080fd5b81356001600160e01b03198116811461105e57600080fd5b6001600160a01b0381168114610cbb57600080fd5b60008083601f840112612eee57600080fd5b50813567ffffffffffffffff811115612f0657600080fd5b602083019150836020828501011115612f1e57600080fd5b9250929050565b600080600080600060808688031215612f3d57600080fd5b8535612f4881612ec7565b94506020860135612f5881612ec7565b935060408601359250606086013567ffffffffffffffff811115612f7b57600080fd5b612f8788828901612edc565b969995985093965092949392505050565b600060208284031215612faa57600080fd5b813561105e81612ec7565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612ff457612ff4612fb5565b604052919050565b600067ffffffffffffffff82111561301657613016612fb5565b5060051b60200190565b600082601f83011261303157600080fd5b8135602061304661304183612ffc565b612fcb565b82815260059290921b8401810191818101908684111561306557600080fd5b8286015b848110156130805780358352918301918301613069565b509695505050505050565b6000806000606084860312156130a057600080fd5b83356130ab81612ec7565b9250602084013567ffffffffffffffff808211156130c857600080fd5b6130d487838801613020565b935060408601359150808211156130ea57600080fd5b506130f786828701613020565b9150509250925092565b600081518084526020808501945080840160005b8381101561313a5781516001600160a01b031687529582019590820190600101613115565b509495945050505050565b60208152600061105e6020830184613101565b8015158114610cbb57600080fd5b600082601f83011261317757600080fd5b8135602061318761304183612ffc565b82815260059290921b840181019181810190868411156131a657600080fd5b8286015b848110156130805780356131bd81613158565b83529183019183016131aa565b6000806000606084860312156131df57600080fd5b83356131ea81612ec7565b9250602084013567ffffffffffffffff8082111561320757600080fd5b61321387838801613020565b9350604086013591508082111561322957600080fd5b506130f786828701613166565b6000806040838503121561324957600080fd5b823561325481612ec7565b946020939093013593505050565b60008060006060848603121561327757600080fd5b833561328281612ec7565b925060208401359150604084013561329981612ec7565b809150509250925092565b600081518084526020808501945080840160005b8381101561313a578151875295820195908201906001016132b8565b60208152600061105e60208301846132a4565b600060208083850312156132fa57600080fd5b823567ffffffffffffffff8082111561331257600080fd5b8185019150601f868184011261332757600080fd5b823561333561304182612ffc565b81815260059190911b8401850190858101908983111561335457600080fd5b8686015b838110156133e0578035868111156133705760008081fd5b8701603f81018c136133825760008081fd5b8881013560408882111561339857613398612fb5565b6133a9828901601f19168c01612fcb565b8281528e828486010111156133be5760008081fd5b828285018d83013760009281018c019290925250845250918701918701613358565b509998505050505050505050565b6000806040838503121561340157600080fd5b823567ffffffffffffffff8082111561341957600080fd5b818501915085601f83011261342d57600080fd5b8135602061343d61304183612ffc565b82815260059290921b8401810191818101908984111561345c57600080fd5b948201945b8386101561348357853561347481612ec7565b82529482019490820190613461565b9650508601359250508082111561349957600080fd5b506134a685828601613166565b9150509250929050565b60008083601f8401126134c257600080fd5b50813567ffffffffffffffff8111156134da57600080fd5b6020830191508360208260051b8501011115612f1e57600080fd5b60008060008060008060008060a0898b03121561351157600080fd5b883561351c81612ec7565b9750602089013561352c81612ec7565b9650604089013567ffffffffffffffff8082111561354957600080fd5b6135558c838d016134b0565b909850965060608b013591508082111561356e57600080fd5b61357a8c838d016134b0565b909650945060808b013591508082111561359357600080fd5b506135a08b828c01612edc565b999c989b5096995094979396929594505050565b600080600080604085870312156135ca57600080fd5b843567ffffffffffffffff808211156135e257600080fd5b6135ee888389016134b0565b9096509450602087013591508082111561360757600080fd5b50613614878288016134b0565b95989497509550505050565b60005b8381101561363b578181015183820152602001613623565b8381111561364a576000848401525b50505050565b602081526000825180602084015261366f816040850160208701613620565b601f01601f19169190910160400192915050565b60008060008060008060a0878903121561369c57600080fd5b86356136a781612ec7565b955060208701356136b781612ec7565b94506040870135935060608701359250608087013567ffffffffffffffff8111156136e157600080fd5b6136ed89828a01612edc565b979a9699509497509295939492505050565b60006020828403121561371157600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b600061ffff8381169083168181101561374957613749613718565b039392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006001600160a01b038088168352808716602084015250846040830152608060608301526137ad608083018486613751565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156137e2576137e2613718565b5060010190565b6001600160a01b038416815260606020820152600061380b60608301856132a4565b82810360408401526128ae81856132a4565b600081518084526020808501945080840160005b8381101561313a578151151587529582019590820190600101613831565b6001600160a01b038416815260606020820152600061387160608301856132a4565b82810360408401526128ae818561381d565b6040815260006138966040830185613101565b82810360208401526138a8818561381d565b95945050505050565b600082198211156138c4576138c4613718565b500190565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156138fb57600080fd5b8260051b8083602087013760009401602001938452509192915050565b60006001600160a01b03808b168352808a1660208401525060a0604083015261394560a08301888a6138c9565b82810360608401526139588187896138c9565b9050828103608084015261396d818587613751565b9b9a5050505050505050505050565b60006020828403121561398e57600080fd5b815161105e81612ec7565b60006001600160a01b03808916835280881660208401525085604083015284606083015260a060808301526139d260a083018486613751565b98975050505050505050565b6000828210156139f0576139f0613718565b500390565b600061ffff80831681811415613a0d57613a0d613718565b6001019392505050565b60008351613a29818460208801613620565b835190830190613a3d818360208801613620565b01949350505050565b600181811c90821680613a5a57607f821691505b60208210811415613a7b57634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c9080831680613a9b57607f831692505b6020808410821415613abd57634e487b7160e01b600052602260045260246000fd5b818015613ad15760018114613ae257613b0e565b60ff19861689528489019650613b0e565b876000528160002060005b86811015613b065781548b820152908501908301613aed565b505084890196505b50505050505092915050565b60008351613b2c818460208801613620565b6138a881840185613a81565b60008251613b4a818460208701613620565b9190910192915050565b600060208284031215613b6657600080fd5b815161105e81613158565b600060208284031215613b8357600080fd5b5051919050565b634e487b7160e01b600052603160045260246000fd5b600061105e8284613a81565b634e487b7160e01b600052601260045260246000fd5b600082613bd157613bd1613bac565b500490565b600082613be557613be5613bac565b50069056fea26469706673582212201c5a907619a954fa3af9704f55b4fd41ec0524958ce92a32c22025d5eb65c10664736f6c634300080b003322696d616765223a2268747470733a2f2f617277656176652e6e65742f6375646651457542316f4a53464f734661535478493944705038354b304a6e53764135662d5f334e736834222c22696d6167655f75726c223a2268747470733a2f2f617277656176652e6e65742f6375646651457542316f4a53464f734661535478493944705038354b304a6e53764135662d5f334e736834222c22696d6167655f64657461696c73223a7b22736861323536223a2230313564386137323539663463623064356165663363356132386266316232363630643461336533333732653862653937343938633533633366363637383433222c226279746573223a383832303635322c227769647468223a343030302c22686569676874223a353030302c22666f726d6174223a22504e47227d2c2f3939222c2022637265617465645f6279223a224d616420446f67204a6f6e6573222c200175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db922616e696d6174696f6e223a2268747470733a2f2f617277656176652e6e65742f675f337344656e5734694a5964656b41504e3371424c44424444636c314c71593777546248527a48304630222c22616e696d6174696f6e5f75726c223a2268747470733a2f2f617277656176652e6e65742f675f337344656e5734694a5964656b41504e3371424c44424444636c314c71593777546248527a48304630222c22616e696d6174696f6e5f64657461696c73223a7b22736861323536223a2264646337656633326538386334353238623366346632303062643761623763613930386531376565663830356535623536626634313666336239343434366463222c226279746573223a3138303137383839392c227769647468223a343030302c22686569676874223a353030302c226475726174696f6e223a33332c22666f726d6174223a224d5034222c22636f64656373223a5b22482e323634222c22414143225d7d2c226465736372697074696f6e223a224d656f772e5c6e5c6e4d696368616820446f7762616b20616b61204d616420446f67204a6f6e65732028622e2031393835295c6e5c6e4368616e676520746865206368616e6e656c2e2c2032303233222c202261747472696275746573223a5b7b2274726169745f74797065223a22417274697374222c2276616c7565223a224d616420446f67204a6f6e6573227d2c7b2274726169745f74797065223a22436f6c6c656374696f6e222c2276616c7565223a224d656f77227d2c7b2274726169745f74797065223a2245646974696f6e222c2276616c7565223a2244227d2c7b22646973706c61795f74797065223a226e756d626572222c2274726169745f74797065223a2245646974696f6e222c2276616c7565223a646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d65223a224368616e676520746865206368616e6e656c2e2023000000000000000000000000fce4bf28ab33a38bfb8bf3604ae6f09fa78ff6ce
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ae5760003560e01c8063715018a6116100ee578063ac52e64411610097578063e9dc637511610071578063e9dc637514610396578063f23a6e61146103b6578063f2fde38b146103c9578063f79f20b5146103dc57600080fd5b8063ac52e6441461035d578063bc197c8114610370578063d3e3ac8c1461038357600080fd5b80638da5cb5b116100c85780638da5cb5b1461031c57806399b96aab14610337578063ac4cc1481461034a57600080fd5b8063715018a6146102ec578063819d4cc6146102f45780638d75fe051461030757600080fd5b80632d3456701161015b578063540385a311610135578063540385a31461028d57806367627b62146102b35780636c2ab4ba146102c65780636d73e669146102d957600080fd5b80632d3456701461025257806331ae450b1461026557806348efee0a1461027a57600080fd5b8063150b7a021161018c578063150b7a021461020057806324d7806c1461022c5780632af8a4131461023f57600080fd5b806301ffc9a7146101b357806304c9fdb0146101db5780630f15f4c0146101f6575b600080fd5b6101c66101c1366004612e9d565b6103fd565b60405190151581526020015b60405180910390f35b6101e3610441565b60405161ffff90911681526020016101d2565b6101fe61046a565b005b61021361020e366004612f25565b610545565b6040516001600160e01b031990911681526020016101d2565b6101c661023a366004612f98565b6107db565b6101fe61024d36600461308b565b610814565b6101fe610260366004612f98565b610c0e565b61026d610cbe565b6040516101d29190613145565b6101fe6102883660046131ca565b610d6d565b7f00000000000000000000000000000000000000000000000000000000000000016101e3565b6101c66102c1366004613236565b610fff565b6101fe6102d4366004613262565b611065565b6101fe6102e7366004612f98565b6111cf565b6101fe611279565b6101fe610302366004613236565b6112dd565b61030f6113d6565b6040516101d291906132d4565b6001546040516001600160a01b0390911681526020016101d2565b6101fe6103453660046132e7565b61142e565b600754600160a01b900461ffff166101e3565b6101fe61036b3660046133ee565b61149b565b61021361037e3660046134f5565b611630565b6101fe6103913660046135b4565b611907565b6103a96103a4366004613236565b611eae565b6040516101d29190613650565b6102136103c4366004613683565b611f20565b6101fe6103d7366004612f98565b612144565b6103ef6103ea3660046136ff565b612223565b6040519081526020016101d2565b60006001600160e01b031982167fe9dc637500000000000000000000000000000000000000000000000000000000148061043b575061043b826122a4565b92915050565b6007546000906104659061ffff600160b01b8204811691600160a01b90041661372e565b905090565b6001546001600160a01b031633146104c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600c5460ff161561051c5760405162461bcd60e51b815260206004820152600e60248201527f416c72656164792061637469766500000000000000000000000000000000000060448201526064016104c0565b600c805460ff1916600117905561054361053e6001546001600160a01b031690565b6122e2565b565b60006002600054141561059a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104c0565b60026000556105a93385610fff565b6105f55760405162461bcd60e51b815260206004820152601760248201527f4275726e52656465656d3a20496e76616c6964204e465400000000000000000060448201526064016104c0565b7f000000000000000000000000000000000000000000000000000000000000000161ffff166001146106b55760405162461bcd60e51b815260206004820152604360248201527f4275726e52656465656d3a2043616e206f6e6c7920616c6c6f7720646972656360448201527f7420726563656976696e67206f6620726564656d7074696f6e73206f6620312060648201527f4e46540000000000000000000000000000000000000000000000000000000000608482015260a4016104c0565b6040517fb88d4fde000000000000000000000000000000000000000000000000000000008152339063b88d4fde906106fb90309061dead9089908990899060040161377a565b600060405180830381600087803b15801561071557600080fd5b505af1925050508015610726575060015b6107a2573d808015610754576040519150601f19603f3d011682016040523d82523d6000602084013e610759565b606091505b5060405162461bcd60e51b815260206004820152601860248201527f4275726e52656465656d3a204275726e206661696c757265000000000000000060448201526064016104c0565b6107ab856122e2565b507f150b7a0200000000000000000000000000000000000000000000000000000000600160005595945050505050565b6000816001600160a01b03166107f96001546001600160a01b031690565b6001600160a01b0316148061043b575061043b6002836123ed565b336108276001546001600160a01b031690565b6001600160a01b0316148061084257506108426002336123ed565b61089a5760405162461bcd60e51b8152602060048201526024808201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616044820152633236b4b760e11b60648201526084016104c0565b80518251146108eb5760405162461bcd60e51b815260206004820181905260248201527f52656465656d3a20496e76616c696420696e70757420706172616d657465727360448201526064016104c0565b6001600160a01b038316600090815260066020526040812054905b8181101561099b576001600160a01b0385166000908152600660205260408120805483908110610938576109386137b8565b600091825260208083206002909202909101929092556001600160a01b0387168152600690915260408120805483908110610975576109756137b8565b600091825260209091206001600290920201015580610993816137ce565b915050610906565b5060005b8351811015610bcc578281815181106109ba576109ba6137b8565b60200260200101518482815181106109d4576109d46137b8565b602002602001015110610a4f5760405162461bcd60e51b815260206004820152602160248201527f52656465656d3a206d696e206d757374206265206c657373207468616e206d6160448201527f780000000000000000000000000000000000000000000000000000000000000060648201526084016104c0565b81811015610b2657838181518110610a6957610a696137b8565b602002602001015160066000876001600160a01b03166001600160a01b031681526020019081526020016000208281548110610aa757610aa76137b8565b906000526020600020906002020160000181905550828181518110610ace57610ace6137b8565b602002602001015160066000876001600160a01b03166001600160a01b031681526020019081526020016000208281548110610b0c57610b0c6137b8565b906000526020600020906002020160010181905550610bba565b60066000866001600160a01b03166001600160a01b031681526020019081526020016000206040518060400160405280868481518110610b6857610b686137b8565b60200260200101518152602001858481518110610b8757610b876137b8565b60209081029190910181015190915282546001818101855560009485529382902083516002909202019081559101519101555b80610bc4816137ce565b91505061099f565b507fc834fb6349b577e8519e3cb6df7274bdd4957d7388d8cc9b54467d8af9d6537b848484604051610c00939291906137e9565b60405180910390a150505050565b6001546001600160a01b03163314610c685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c0565b610c736002826123ed565b15610cbb5760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a3610cb960028261240f565b505b50565b6060610cca6002612424565b67ffffffffffffffff811115610ce257610ce2612fb5565b604051908082528060200260200182016040528015610d0b578160200160208202803683370190505b50905060005b610d1b6002612424565b811015610d6957610d2d60028261242e565b828281518110610d3f57610d3f6137b8565b6001600160a01b039092166020928302919091019091015280610d61816137ce565b915050610d11565b5090565b33610d806001546001600160a01b031690565b6001600160a01b03161480610d9b5750610d9b6002336123ed565b610df35760405162461bcd60e51b8152602060048201526024808201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616044820152633236b4b760e11b60648201526084016104c0565b8051825114610e445760405162461bcd60e51b815260206004820181905260248201527f52656465656d3a20496e76616c696420696e70757420706172616d657465727360448201526064016104c0565b60005b8251811015610fbe57818181518110610e6257610e626137b8565b60200260200101518015610ec35750610ec1838281518110610e8657610e866137b8565b602002602001015160056000876001600160a01b03166001600160a01b0316815260200190815260200160002061243a90919063ffffffff16565b155b15610f1e57610f18838281518110610edd57610edd6137b8565b602002602001015160056000876001600160a01b03166001600160a01b0316815260200190815260200160002061245290919063ffffffff16565b50610fac565b818181518110610f3057610f306137b8565b6020026020010151158015610f555750610f55838281518110610e8657610e866137b8565b15610fac57610faa838281518110610f6f57610f6f6137b8565b602002602001015160056000876001600160a01b03166001600160a01b0316815260200190815260200160002061245e90919063ffffffff16565b505b80610fb6816137ce565b915050610e47565b507f0ed1ede59c177063e00a17d07584b15a0eb10205d90702aeff646f55bb33aa89838383604051610ff29392919061384f565b60405180910390a1505050565b600c5460009060ff166110545760405162461bcd60e51b815260206004820152600860248201527f496e61637469766500000000000000000000000000000000000000000000000060448201526064016104c0565b61105e838361246a565b9392505050565b336110786001546001600160a01b031690565b6001600160a01b0316148061109357506110936002336123ed565b6110eb5760405162461bcd60e51b8152602060048201526024808201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616044820152633236b4b760e11b60648201526084016104c0565b611115837f80ac58cd00000000000000000000000000000000000000000000000000000000612288565b6111875760405162461bcd60e51b815260206004820152602260248201527f4275726e52656465656d3a204d75737420696d706c656d656e7420494552433760448201527f323100000000000000000000000000000000000000000000000000000000000060648201526084016104c0565b6001600160a01b039283166000908152600a6020908152604080832094835293905291909120805473ffffffffffffffffffffffffffffffffffffffff191691909216179055565b6001546001600160a01b031633146112295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c0565b6112346002826123ed565b610cbb5760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a3610cb96002826125fd565b6001546001600160a01b031633146112d35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c0565b6105436000612612565b6001600160a01b038083166000908152600a60209081526040808320858452909152902054163381146113525760405162461bcd60e51b815260206004820152601d60248201527f4275726e52656465656d3a205065726d697373696f6e2064656e69656400000060448201526064016104c0565b6040517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152336024820152604481018390526001600160a01b038416906342842e0e90606401600060405180830381600087803b1580156113b957600080fd5b505af11580156113cd573d6000803e3d6000fd5b50505050505050565b6060600880548060200260200160405190810160405280929190818152602001828054801561142457602002820191906000526020600020905b815481526020019060010190808311611410575b5050505050905090565b6001546001600160a01b031633146114885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c0565b8051610cb990600b906020840190612d58565b336114ae6001546001600160a01b031690565b6001600160a01b031614806114c957506114c96002336123ed565b6115215760405162461bcd60e51b8152602060048201526024808201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616044820152633236b4b760e11b60648201526084016104c0565b80518251146115725760405162461bcd60e51b815260206004820181905260248201527f52656465656d3a20496e76616c696420696e70757420706172616d657465727360448201526064016104c0565b60005b82518110156115f257818181518110611590576115906137b8565b6020026020010151600460008584815181106115ae576115ae6137b8565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806115ea816137ce565b915050611575565b507fb987f16cb95c27617d184f54a4a9d80cfa894b91e2d679ed76042493954481488282604051611624929190613883565b60405180910390a15050565b6000600260005414156116855760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104c0565b60026000558584146116d95760405162461bcd60e51b815260206004820152601960248201527f4275726e52656465656d3a20496e76616c696420696e7075740000000000000060448201526064016104c0565b6000805b8781101561178b57611707338a8a848181106116fb576116fb6137b8565b90506020020135610fff565b6117535760405162461bcd60e51b815260206004820152601760248201527f4275726e52656465656d3a20496e76616c6964204e465400000000000000000060448201526064016104c0565b868682818110611765576117656137b8565b905060200201358261177791906138b1565b915080611783816137ce565b9150506116dd565b507f000000000000000000000000000000000000000000000000000000000000000161ffff1681146118255760405162461bcd60e51b815260206004820152603360248201527f4275726e52656465656d3a20496e636f7272656374206e756d626572206f662060448201527f4e465473206265696e672072656465656d65640000000000000000000000000060648201526084016104c0565b6040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081523390632eb2c2d69061187190309061dead908d908d908d908d908d908d90600401613918565b600060405180830381600087803b15801561188b57600080fd5b505af192505050801561189c575060015b6118ca573d808015610754576040519150601f19603f3d011682016040523d82523d6000602084013e610759565b6118d3896122e2565b50506001600055507fbc197c8100000000000000000000000000000000000000000000000000000000979650505050505050565b6002600054141561195a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104c0565b60026000558281146119ae5760405162461bcd60e51b815260206004820152601e60248201527f4275726e52656465656d3a20496e76616c696420706172616d6574657273000060448201526064016104c0565b61ffff7f0000000000000000000000000000000000000000000000000000000000000001168314611a475760405162461bcd60e51b815260206004820152603360248201527f4275726e52656465656d3a20496e636f7272656374206e756d626572206f662060448201527f4e465473206265696e672072656465656d65640000000000000000000000000060648201526084016104c0565b60005b83811015611e9957611a8e858583818110611a6757611a676137b8565b9050602002016020810190611a7c9190612f98565b8484848181106116fb576116fb6137b8565b611ada5760405162461bcd60e51b815260206004820152601760248201527f4275726e52656465656d3a20496e76616c6964204e465400000000000000000060448201526064016104c0565b848482818110611aec57611aec6137b8565b9050602002016020810190611b019190612f98565b6001600160a01b0316636352211e848484818110611b2157611b216137b8565b905060200201356040518263ffffffff1660e01b8152600401611b4691815260200190565b602060405180830381865afa925050508015611b7f575060408051601f3d908101601f19168201909252611b7c9181019061397c565b60015b611bfb573d808015611bad576040519150601f19603f3d011682016040523d82523d6000602084013e611bb2565b606091505b5060405162461bcd60e51b815260206004820152601e60248201527f4275726e52656465656d3a2042616420746f6b656e20636f6e7472616374000060448201526064016104c0565b6001600160a01b0381163314611c535760405162461bcd60e51b815260206004820181905260248201527f4275726e52656465656d3a2043616c6c6572206d757374206f776e204e46547360448201526064016104c0565b50848482818110611c6657611c666137b8565b9050602002016020810190611c7b9190612f98565b6001600160a01b031663081812fc848484818110611c9b57611c9b6137b8565b905060200201356040518263ffffffff1660e01b8152600401611cc091815260200190565b602060405180830381865afa925050508015611cf9575060408051601f3d908101601f19168201909252611cf69181019061397c565b60015b611d27573d808015611bad576040519150601f19603f3d011682016040523d82523d6000602084013e611bb2565b6001600160a01b0381163014611da55760405162461bcd60e51b815260206004820152603760248201527f4275726e52656465656d3a20436f6e7472616374206d7573742062652067697660448201527f656e20617070726f76616c20746f206275726e204e465400000000000000000060648201526084016104c0565b50848482818110611db857611db86137b8565b9050602002016020810190611dcd9190612f98565b6001600160a01b03166323b872dd3361dead868686818110611df157611df16137b8565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015611e4857600080fd5b505af1925050508015611e59575060015b611e87573d808015610754576040519150601f19603f3d011682016040523d82523d6000602084013e610759565b80611e91816137ce565b915050611a4a565b50611ea3336122e2565b505060016000555050565b6007546060906001600160a01b038481169116148015611edb575060008281526009602052604090205415155b611f175760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b60448201526064016104c0565b61105e82612671565b600060026000541415611f755760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104c0565b6002600055611f843386610fff565b611fd05760405162461bcd60e51b815260206004820152601760248201527f4275726e52656465656d3a20496e76616c6964204e465400000000000000000060448201526064016104c0565b7f000000000000000000000000000000000000000000000000000000000000000161ffff1684146120695760405162461bcd60e51b815260206004820152603360248201527f4275726e52656465656d3a20496e636f7272656374206e756d626572206f662060448201527f4e465473206265696e672072656465656d65640000000000000000000000000060648201526084016104c0565b6040517ff242432a000000000000000000000000000000000000000000000000000000008152339063f242432a906120b190309061dead908a908a908a908a90600401613999565b600060405180830381600087803b1580156120cb57600080fd5b505af19250505080156120dc575060015b61210a573d808015610754576040519150601f19603f3d011682016040523d82523d6000602084013e610759565b612113866122e2565b507ff23a6e610000000000000000000000000000000000000000000000000000000060016000559695505050505050565b6001546001600160a01b0316331461219e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c0565b6001600160a01b03811661221a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104c0565b610cbb81612612565b60008181526009602052604081205461226e5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b60448201526064016104c0565b60008281526009602052604090205461043b9060646139de565b600061229383612787565b801561105e575061105e83836127ba565b60006001600160e01b031982167f3e5454f000000000000000000000000000000000000000000000000000000000148061043b575061043b826128b8565b60075461ffff600160a01b82048116600160b01b90920416106123475760405162461bcd60e51b815260206004820181905260248201527f52656465656d3a204e6f20726564656d7074696f6e732072656d61696e696e6760448201526064016104c0565b60078054600160b01b900461ffff16906016612362836139f5565b91906101000a81548161ffff021916908361ffff16021790555050600061239982600760169054906101000a900461ffff16612905565b60088054600181019091557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301819055600754600091825260096020526040909120600160b01b90910461ffff1690555050565b6001600160a01b0381166000908152600183016020526040812054151561105e565b600061105e836001600160a01b03841661298f565b600061043b825490565b600061105e8383612a82565b6000818152600183016020526040812054151561105e565b600061105e8383612aac565b600061105e838361298f565b6001600160a01b03821660009081526004602052604081205460ff16156124935750600161043b565b6001600160a01b03831660009081526005602052604090206124b5908361243a565b156124c25750600161043b565b6001600160a01b038316600090815260066020526040902054156125f45760005b6001600160a01b0384166000908152600660205260409020548110156125f2576001600160a01b038416600090815260066020526040902080548290811061252d5761252d6137b8565b90600052602060002090600202016001015460001415801561258a57506001600160a01b0384166000908152600660205260409020805482908110612574576125746137b8565b9060005260206000209060020201600001548310155b80156125d157506001600160a01b03841660009081526006602052604090208054829081106125bb576125bb6137b8565b9060005260206000209060020201600101548311155b156125e057600191505061043b565b806125ea816137ce565b9150506124e3565b505b50600092915050565b600061105e836001600160a01b038416612aac565b600180546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60608060005b600b54811015612780576126dc600b8281548110612697576126976137b8565b906000526020600020016040518060400160405280600981526020017f3c45444954494f4e3e0000000000000000000000000000000000000000000000815250612afb565b1561272d576000848152600960205260409020548290612706906127019060646139de565b612b54565b604051602001612717929190613a17565b604051602081830303815290604052915061276e565b81600b8281548110612741576127416137b8565b9060005260206000200160405160200161275c929190613b1a565b60405160208183030381529060405291505b80612778816137ce565b915050612677565b5092915050565b600061279a826301ffc9a760e01b6127ba565b801561043b57506127b3826001600160e01b03196127ba565b1592915050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b179052905160009190829081906001600160a01b0387169061753090612836908690613b38565b6000604051808303818686fa925050503d8060008114612872576040519150601f19603f3d011682016040523d82523d6000602084013e612877565b606091505b5091509150602081511015612892576000935050505061043b565b8180156128ae5750808060200190518101906128ae9190613b54565b9695505050505050565b60006001600160e01b031982167f866c67eb0000000000000000000000000000000000000000000000000000000014806128f657506128f682612c8e565b8061043b575061043b82612ccc565b6007546040517f2928ca580000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526000921690632928ca58906024016020604051808303816000875af115801561296b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105e9190613b71565b60008181526001830160205260408120548015612a785760006129b36001836139de565b85549091506000906129c7906001906139de565b9050818114612a2c5760008660000182815481106129e7576129e76137b8565b9060005260206000200154905080876000018481548110612a0a57612a0a6137b8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612a3d57612a3d613b8a565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061043b565b600091505061043b565b6000826000018281548110612a9957612a996137b8565b9060005260206000200154905092915050565b6000818152600183016020526040812054612af35750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561043b565b50600061043b565b600081604051602001612b0e9190613b38565b6040516020818303038152906040528051906020012083604051602001612b359190613ba0565b6040516020818303038152906040528051906020012014905092915050565b606081612b9457505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612bbe5780612ba8816137ce565b9150612bb79050600a83613bc2565b9150612b98565b60008167ffffffffffffffff811115612bd957612bd9612fb5565b6040519080825280601f01601f191660200182016040528015612c03576020820181803683370190505b5090505b8415612c8657612c186001836139de565b9150612c25600a86613bd6565b612c309060306138b1565b60f81b818381518110612c4557612c456137b8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612c7f600a86613bc2565b9450612c07565b949350505050565b60006001600160e01b031982167fa927d73f00000000000000000000000000000000000000000000000000000000148061043b575061043b82612d0a565b60006001600160e01b031982167f7005caad00000000000000000000000000000000000000000000000000000000148061043b575061043b82612c8e565b60006001600160e01b031982167f553e757e00000000000000000000000000000000000000000000000000000000148061043b57506301ffc9a760e01b6001600160e01b031983161461043b565b828054828255906000526020600020908101928215612da5579160200282015b82811115612da55782518051612d95918491602090910190612db1565b5091602001919060010190612d78565b50610d69929150612e31565b828054612dbd90613a46565b90600052602060002090601f016020900481019282612ddf5760008555612e25565b82601f10612df857805160ff1916838001178555612e25565b82800160010185558215612e25579182015b82811115612e25578251825591602001919060010190612e0a565b50610d69929150612e4e565b80821115610d69576000612e458282612e63565b50600101612e31565b5b80821115610d695760008155600101612e4f565b508054612e6f90613a46565b6000825580601f10612e7f575050565b601f016020900490600052602060002090810190610cbb9190612e4e565b600060208284031215612eaf57600080fd5b81356001600160e01b03198116811461105e57600080fd5b6001600160a01b0381168114610cbb57600080fd5b60008083601f840112612eee57600080fd5b50813567ffffffffffffffff811115612f0657600080fd5b602083019150836020828501011115612f1e57600080fd5b9250929050565b600080600080600060808688031215612f3d57600080fd5b8535612f4881612ec7565b94506020860135612f5881612ec7565b935060408601359250606086013567ffffffffffffffff811115612f7b57600080fd5b612f8788828901612edc565b969995985093965092949392505050565b600060208284031215612faa57600080fd5b813561105e81612ec7565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612ff457612ff4612fb5565b604052919050565b600067ffffffffffffffff82111561301657613016612fb5565b5060051b60200190565b600082601f83011261303157600080fd5b8135602061304661304183612ffc565b612fcb565b82815260059290921b8401810191818101908684111561306557600080fd5b8286015b848110156130805780358352918301918301613069565b509695505050505050565b6000806000606084860312156130a057600080fd5b83356130ab81612ec7565b9250602084013567ffffffffffffffff808211156130c857600080fd5b6130d487838801613020565b935060408601359150808211156130ea57600080fd5b506130f786828701613020565b9150509250925092565b600081518084526020808501945080840160005b8381101561313a5781516001600160a01b031687529582019590820190600101613115565b509495945050505050565b60208152600061105e6020830184613101565b8015158114610cbb57600080fd5b600082601f83011261317757600080fd5b8135602061318761304183612ffc565b82815260059290921b840181019181810190868411156131a657600080fd5b8286015b848110156130805780356131bd81613158565b83529183019183016131aa565b6000806000606084860312156131df57600080fd5b83356131ea81612ec7565b9250602084013567ffffffffffffffff8082111561320757600080fd5b61321387838801613020565b9350604086013591508082111561322957600080fd5b506130f786828701613166565b6000806040838503121561324957600080fd5b823561325481612ec7565b946020939093013593505050565b60008060006060848603121561327757600080fd5b833561328281612ec7565b925060208401359150604084013561329981612ec7565b809150509250925092565b600081518084526020808501945080840160005b8381101561313a578151875295820195908201906001016132b8565b60208152600061105e60208301846132a4565b600060208083850312156132fa57600080fd5b823567ffffffffffffffff8082111561331257600080fd5b8185019150601f868184011261332757600080fd5b823561333561304182612ffc565b81815260059190911b8401850190858101908983111561335457600080fd5b8686015b838110156133e0578035868111156133705760008081fd5b8701603f81018c136133825760008081fd5b8881013560408882111561339857613398612fb5565b6133a9828901601f19168c01612fcb565b8281528e828486010111156133be5760008081fd5b828285018d83013760009281018c019290925250845250918701918701613358565b509998505050505050505050565b6000806040838503121561340157600080fd5b823567ffffffffffffffff8082111561341957600080fd5b818501915085601f83011261342d57600080fd5b8135602061343d61304183612ffc565b82815260059290921b8401810191818101908984111561345c57600080fd5b948201945b8386101561348357853561347481612ec7565b82529482019490820190613461565b9650508601359250508082111561349957600080fd5b506134a685828601613166565b9150509250929050565b60008083601f8401126134c257600080fd5b50813567ffffffffffffffff8111156134da57600080fd5b6020830191508360208260051b8501011115612f1e57600080fd5b60008060008060008060008060a0898b03121561351157600080fd5b883561351c81612ec7565b9750602089013561352c81612ec7565b9650604089013567ffffffffffffffff8082111561354957600080fd5b6135558c838d016134b0565b909850965060608b013591508082111561356e57600080fd5b61357a8c838d016134b0565b909650945060808b013591508082111561359357600080fd5b506135a08b828c01612edc565b999c989b5096995094979396929594505050565b600080600080604085870312156135ca57600080fd5b843567ffffffffffffffff808211156135e257600080fd5b6135ee888389016134b0565b9096509450602087013591508082111561360757600080fd5b50613614878288016134b0565b95989497509550505050565b60005b8381101561363b578181015183820152602001613623565b8381111561364a576000848401525b50505050565b602081526000825180602084015261366f816040850160208701613620565b601f01601f19169190910160400192915050565b60008060008060008060a0878903121561369c57600080fd5b86356136a781612ec7565b955060208701356136b781612ec7565b94506040870135935060608701359250608087013567ffffffffffffffff8111156136e157600080fd5b6136ed89828a01612edc565b979a9699509497509295939492505050565b60006020828403121561371157600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b600061ffff8381169083168181101561374957613749613718565b039392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006001600160a01b038088168352808716602084015250846040830152608060608301526137ad608083018486613751565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156137e2576137e2613718565b5060010190565b6001600160a01b038416815260606020820152600061380b60608301856132a4565b82810360408401526128ae81856132a4565b600081518084526020808501945080840160005b8381101561313a578151151587529582019590820190600101613831565b6001600160a01b038416815260606020820152600061387160608301856132a4565b82810360408401526128ae818561381d565b6040815260006138966040830185613101565b82810360208401526138a8818561381d565b95945050505050565b600082198211156138c4576138c4613718565b500190565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156138fb57600080fd5b8260051b8083602087013760009401602001938452509192915050565b60006001600160a01b03808b168352808a1660208401525060a0604083015261394560a08301888a6138c9565b82810360608401526139588187896138c9565b9050828103608084015261396d818587613751565b9b9a5050505050505050505050565b60006020828403121561398e57600080fd5b815161105e81612ec7565b60006001600160a01b03808916835280881660208401525085604083015284606083015260a060808301526139d260a083018486613751565b98975050505050505050565b6000828210156139f0576139f0613718565b500390565b600061ffff80831681811415613a0d57613a0d613718565b6001019392505050565b60008351613a29818460208801613620565b835190830190613a3d818360208801613620565b01949350505050565b600181811c90821680613a5a57607f821691505b60208210811415613a7b57634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c9080831680613a9b57607f831692505b6020808410821415613abd57634e487b7160e01b600052602260045260246000fd5b818015613ad15760018114613ae257613b0e565b60ff19861689528489019650613b0e565b876000528160002060005b86811015613b065781548b820152908501908301613aed565b505084890196505b50505050505092915050565b60008351613b2c818460208801613620565b6138a881840185613a81565b60008251613b4a818460208701613620565b9190910192915050565b600060208284031215613b6657600080fd5b815161105e81613158565b600060208284031215613b8357600080fd5b5051919050565b634e487b7160e01b600052603160045260246000fd5b600061105e8284613a81565b634e487b7160e01b600052601260045260246000fd5b600082613bd157613bd1613bac565b500490565b600082613be557613be5613bac565b50069056fea26469706673582212201c5a907619a954fa3af9704f55b4fd41ec0524958ce92a32c22025d5eb65c10664736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000fce4bf28ab33a38bfb8bf3604ae6f09fa78ff6ce
-----Decoded View---------------
Arg [0] : creator (address): 0xfcE4Bf28aB33A38BFB8BF3604AE6F09Fa78Ff6ce
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000fce4bf28ab33a38bfb8bf3604ae6f09fa78ff6ce
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.