Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ProzacYouthEngine_1
Compiler Version
v0.8.26+commit.8a97fa7a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ProzacYouthUtils.sol"; //@developed by andrew mitchell (andrewmitchell.eth) //This is the engine for creating the animation url's html header and html footer. contract ProzacYouthEngine_1 { ProzacYouthUtils ProzacYouthUtils1; address public owner; mapping(address => bool) public accessList; modifier onlyOwner() { require(msg.sender == owner, "Not the owner"); _; } modifier onlyAuthorized() { require(msg.sender == owner || accessList[msg.sender], "Not authorized"); _; } constructor(address ProzacYouthUtils_addr) { owner = msg.sender; ProzacYouthUtils1 = ProzacYouthUtils(ProzacYouthUtils_addr); accessList[0xF1Da6E2d387e9DA611dAc8a7FC587Eaa4B010013] = true; // Adding default wallet to accessList } function getAnimHeader() public view returns (string memory) { return string(abi.encodePacked( "<!doctypehtml><html lang=en><meta content='text/html; charset=UTF-8'http-equiv=Content-Type><meta content='width=device-width,initial-scale=1'name=viewport><meta content='ie=edge'http-equiv=X-UA-Compatible><meta developer='Andrew Mitchell'><meta artist=Tjo><title>Prozac Youth</title>" ,"<style>body{font-family:Helvetica,sans-serif;font-size:10pt;margin:0;padding:5px}.andrews-container{margin:auto;width:100%}@media only screen and (max-width:600px){.andrews-container{width:100%}}.table{margin:20px auto;width:100%;border-collapse:collapse}@media only screen and (max-width:600px){.table{width:100%}}.fade-in{opacity:1;animation-name:fadeInOpacity;animation-iteration-count:1;animation-timing-function:ease-in;animation-duration:2s}@keyframes fadeInOpacity{0%{opacity:0}100%{opacity:1}}#loading-text{font-size:10pt;text-align:right}#loading{width:100%}.header-title{font-size:16pt;font-weight:700;text-align:center;background-color:#28403e;padding:10px 0;border-radius:5px}.breadcrumbs{font-size:9pt;color:#777;margin-bottom:10px}#mode-switch{cursor:pointer;position:fixed;bottom:10px;right:10px}.forum-rules{border-radius:5px;padding:10px;font-size:9pt;margin-bottom:20px}.table-header,.table-row{padding:8px}.table-header{background-color:#28403e;font-weight:700}.table>.light-bg:nth-child(even){background-color:rgba(0,0,0,0)!important}.light-bg{background-color:rgba(0,0,0,0)!important}.light-link{color:#a31414!important}.light-border{border:1px solid #28403e!important}.light-border-2{border:1px solid #627876!important}.light-bg-2{background-color:#c4c0bd!important}.light-text{color:#fafafa!important}.light-text-2{color:#0a0a0f!important}.error-text{color:#f03}.dark-link{color:#a4cbc4!important}.dark-text-2{color:#cdcdcd!important}.light-text-3{color:#0d0d14!important}.dark-text-3{color:#cdcdcd!important}.light-text-4{color:#0d0d14!important}.dark-text-4{color:#cdcdcd!important}.table>.dark-bg:nth-child(even){background-color:rgba(0,0,0,0)!important}.dark-bg{background-color:rgba(0,0,0,0)!important}.dark-border{border:1px solid #555!important}.dark-border-2{border:1px solid #333!important}.dark-bg-2{background-color:#444!important}.dark-text{color:#c8c8c8!important}.post-wrapper{display:none}.small-text{font-size:8pt;color:#555}.current-time{font-size:8pt;color:#777;vertical-align:super;margin-right:2px}#table-body{table-layout:fixed}.time-wrapper{display:inline}.loading-cell{display:flex;border:0;text-align:right}.post-info{display:flex;justify-content:space-between;align-items:center}.post-info span{font-size:10pt;color:#28403e;font-weight:700}.post-message{font-size:10pt;line-height:1.5}.footer{margin-top:20px;text-align:center;font-size:9pt;color:#777}#paper-background{position:absolute;background-size:cover;z-index:-1000;top:0;left:0;width:100%;height:100%}</style><body class='light-text-2 light-bg'><div class='fade-in post-wrapper'id=post-wrapper><div class=base64 id=paper-background></div><div class='light-text-2 andrews-container'><div class=breadcrumbs>Prozac Youth > Forums > TJO > Dear Human</div><div class=post-info><span class=light-text-2>Total Posts: <b id=total-posts>" ,ProzacYouthUtils1.getTotalEntries(), "</b></span><span class='current-time light-text-2'></span></div><table class=table style=table-layout:fixed><thead><tr class='light-border light-text table-header'><th colspan=1>Author<th colspan=3>Thread<tbody id=table-body><tr class='light-border light-bg table-row'><td colspan=1><td colspan=3>" ,this.getEntriesHTML(), "</tbody></table><span id=mode-switch onclick=toggleMode()><svg fill=#000000 height=15px id=Capa_1 version=1.1 viewBox='0 0 207.628 207.628'width=15px xml:space=preserve xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink><circle cx=103.814 cy=103.814 r=45.868 /><path d='M103.814,157.183c-29.427,0-53.368-23.941-53.368-53.368s23.941-53.368,53.368-53.368s53.368,23.941,53.368,53.368 S133.241,157.183,103.814,157.183z M103.814,65.446c-21.156,0-38.368,17.212-38.368,38.368s17.212,38.368,38.368,38.368 s38.368-17.212,38.368-38.368S124.97,65.446,103.814,65.446z'/><path d='M103.814,39.385c-4.142,0-7.5-3.358-7.5-7.5V7.5c0-4.142,3.358-7.5,7.5-7.5s7.5,3.358,7.5,7.5v24.385 C111.314,36.027,107.956,39.385,103.814,39.385z'/><path d='M103.814,207.628c-4.142,0-7.5-3.358-7.5-7.5v-24.385c0-4.142,3.358-7.5,7.5-7.5s7.5,3.358,7.5,7.5v24.385 C111.314,204.271,107.956,207.628,103.814,207.628z'/><path d='M200.128,111.314h-24.385c-4.142,0-7.5-3.358-7.5-7.5s3.358-7.5,7.5-7.5h24.385c4.142,0,7.5,3.358,7.5,7.5 S204.271,111.314,200.128,111.314z'/><path d='M31.885,111.314H7.5c-4.142,0-7.5-3.358-7.5-7.5s3.358-7.5,7.5-7.5h24.385c4.142,0,7.5,3.358,7.5,7.5 S36.027,111.314,31.885,111.314z'/><path d='M154.676,60.452c-1.919,0-3.839-0.732-5.303-2.197c-2.929-2.929-2.929-7.678,0-10.606l17.243-17.242 c2.929-2.929,7.678-2.93,10.606,0c2.929,2.929,2.929,7.678,0,10.606l-17.243,17.242C158.515,59.72,156.595,60.452,154.676,60.452z'/><path d='M35.709,179.419c-1.919,0-3.839-0.732-5.303-2.197c-2.929-2.929-2.929-7.678,0-10.606l17.243-17.243 c2.929-2.929,7.678-2.929,10.606,0c2.929,2.929,2.929,7.678,0,10.606l-17.243,17.243C39.548,178.687,37.629,179.419,35.709,179.419z '/><path d='M171.918,179.419c-1.919,0-3.839-0.732-5.303-2.197l-17.243-17.243c-2.929-2.929-2.929-7.678,0-10.606 c2.929-2.929,7.678-2.929,10.606,0l17.243,17.243c2.929,2.929,2.929,7.678,0,10.606 C175.757,178.687,173.838,179.419,171.918,179.419z'/><path d='M52.952,60.452c-1.919,0-3.839-0.732-5.303-2.197L30.406,41.013c-2.929-2.929-2.929-7.677,0-10.606 c2.929-2.929,7.678-2.93,10.606,0l17.243,17.242c2.929,2.929,2.929,7.677,0,10.606C56.791,59.72,54.872,60.452,52.952,60.452z'/></svg></span><div id=andrew style=margin-top:15px;text-align:center;width:100%><span>Designed by <a class=light-link href=" ,ProzacYouthUtils1.getAndrewUrl(), " target=_blank>Andrew Mitchell</a></span></div><div class=footer>© Prozac Youth. All rights reserved.</div><canvas id='notepadCanvas' style='display:none;'></canvas></div></div>")); } function getAnimFooter() public pure returns (string memory) { return "<body></body></html>"; } function setProzacYouthUtils_1(address addr) public onlyAuthorized { ProzacYouthUtils1 = ProzacYouthUtils(addr); } function grantAccess(address _address) external onlyOwner { accessList[_address] = true; } function revokeAccess(address _address) external onlyOwner { accessList[_address] = false; } //Wraps the entries into table rows for injecting into the animation url's HTML. function getEntriesHTML() external view returns (string memory) { string memory html; string memory tjoUrl = ProzacYouthUtils1.getTjoUrl(); string memory etherscanUrl = ProzacYouthUtils1.getEtherscanUrl(); uint256 entriesLength = ProzacYouthUtils1.getTotalEntriesInt(); for (uint256 i = 0; i < entriesLength; i++) { ProzacYouthUtils.Entry memory entry = ProzacYouthUtils1.getEntry(i); html = string(abi.encodePacked( html, "<tr class=\"table-row light-bg light-border light-text\">", "<td colspan=\"1\" class=\"light-bg\" width=\"30%\" align=\"center\">", "<font class=\"small_text\">", "<a class=\"light-link\" target=\"_blank\" href=\"", tjoUrl, "\">Tjo</a>", "<font></font></font></td>", "<td colspan=\"3\" align=\"right\" width=\"70%\" class=\"light-bg light-link\">", "<div class=\"postInfo desktop\">", "<span class=\"postNum desktop\">", "<a class=\"light-link\" style=\"font-size:12px;\" href=\"", etherscanUrl, entry.hash, "\" target=\"_blank\" title=\"Link to this transaction\">", entry.formattedTime, "</a></span></div></td></tr><tr><td style=\"padding-bottom:50px;\"></td></tr>", "<tr><td colspan=\"1\" valign=\"middle\" align=\"left\" class=\"light-bg\">", "<ul align=\"left\" style=\"padding-left: 15px;font-size: 10px;\">", "<li class=\"light-text-3\">Block: ", entry.blockNumber, "</li><li class=\"light-text-3\">Location: UNKNOWN</li></ul></td>", "<td colspan=\"3\" align=\"center\" valign=\"middle\" class=\"light-bg\">", "<font class=\"regular_text\">", "<div class=\"post reply\">", "<blockquote style=\"margin-top:0px;\" class=\"postMessage light-text-2\" id=\"m34079983\"><br>", entry.text, "</blockquote></div></font></td></tr><tr><td style=\"padding-bottom:50px;\"></td></tr>" )); } return html; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@manifoldxyz/creator-core-solidity/contracts/core/IERC721CreatorCore.sol"; import "@manifoldxyz/creator-core-solidity/contracts/extensions/ICreatorExtensionTokenURI.sol"; import "@manifoldxyz/libraries-solidity/contracts/access/IAdminControl.sol"; import "@manifoldxyz/libraries-solidity/contracts/access/AdminControl.sol"; import "@manifoldxyz/creator-core-solidity/contracts/extensions/CreatorExtension.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "./IManifoldERC721Edition.sol"; import "./ProzacYouthEngine_1.sol"; import "./ProzacYouthEngine_2.sol"; //@developed by andrew mitchell (andrewmitchell.eth) //@shoutouts dom aka dhof (dhof.eth), white lights (whitelights.eth), yungwknd (yungwknd.eth), and chainleft (chainleft.eth) contract ProzacYouth is AdminControl, CreatorExtension, ICreatorExtensionTokenURI, IManifoldERC721Edition { using Strings for uint256; using SafeMath for uint256; ProzacYouthEngine_1 ProzacYouthEngine1; ProzacYouthEngine_2 ProzacYouthEngine2; uint256 public _maxSupply = 1; uint256 public _totalSupply = 0; address public _creator; address public _owner; uint256 private _maxIndex; mapping(address => bool) private _accessList; string public _previewImageDataUri; string private _description = ""; string private _name = ""; constructor(address owner, address creator, string memory name, string memory description, address ProzacYouthEngine_1_addr, address ProzacYouthEngine_2_addr) Ownable(owner) { _name = name; _description = description; _creator = creator; _owner = owner; ProzacYouthEngine1 = ProzacYouthEngine_1(ProzacYouthEngine_1_addr); ProzacYouthEngine2 = ProzacYouthEngine_2(ProzacYouthEngine_2_addr); _accessList[0xF1Da6E2d387e9DA611dAc8a7FC587Eaa4B010013] = true; // Adding default wallet to accessList } function supportsInterface(bytes4 interfaceId) public view virtual override(AdminControl, CreatorExtension, IERC165) returns (bool) { return interfaceId == type(ICreatorExtensionTokenURI).interfaceId || interfaceId == type(IManifoldERC721Edition).interfaceId || interfaceId == type(AdminControl).interfaceId || CreatorExtension.supportsInterface(interfaceId); } function totalSupply() external view returns(uint256) { return _totalSupply; } function maxSupply() external pure returns(uint256) { return 1; } function grantAccess(address _address) external onlyOwner { _accessList[_address] = true; } function revokeAccess(address _address) external onlyOwner { _accessList[_address] = false; } function mint(address recipient) external payable { require(msg.sender == _owner || _accessList[msg.sender], "Unauthorized"); require(_totalSupply < 1, "No more tokens left"); IERC721CreatorCore(_creator).mintExtension(recipient); _totalSupply++; } function withdrawAll() public { require(msg.sender == _owner || _accessList[msg.sender], "Unauthorized"); require(payable(msg.sender).send(address(this).balance)); } function setProzacYouthEngine_1(address addr) public { require(msg.sender == _owner || _accessList[msg.sender], "Unauthorized"); ProzacYouthEngine1 = ProzacYouthEngine_1(addr); } function setProzacYouthEngine_2(address addr) public { require(msg.sender == _owner || _accessList[msg.sender], "Unauthorized"); ProzacYouthEngine2 = ProzacYouthEngine_2(addr); } function setDescription(string memory des) public { require(msg.sender == _owner || _accessList[msg.sender], "Unauthorized"); _description = des; } function setName(string memory name) public { require(msg.sender == _owner || _accessList[msg.sender], "Unauthorized"); _name = name; } function addPreviewImageDataChunk(string memory chunkData) public { require(msg.sender == _owner || _accessList[msg.sender], "Unauthorized"); _previewImageDataUri = string(abi.encodePacked(_previewImageDataUri, chunkData)); } function deletePreviewImageDataChunk() public { require(msg.sender == _owner || _accessList[msg.sender], "Unauthorized"); _previewImageDataUri = ""; } function tokenURI(address creator,uint256 tokenId) public view virtual override returns (string memory) { return formatTokenURI(); } function formatTokenURI() public view returns (string memory) { string memory _animURI = animToURI(string(abi.encodePacked( ProzacYouthEngine1.getAnimHeader(), ProzacYouthEngine2.getScript(), ProzacYouthEngine1.getAnimFooter() ))); string memory byteEncoded = Base64.encode(bytes(abi.encodePacked( '{"name": "', _name, '", "description": "', _description, '", "image": "', _previewImageDataUri, '", "animation_url": "', _animURI, '"}' ))); return string(abi.encodePacked("data:application/json;base64,", byteEncoded)); } function animToURI(string memory anim) public pure returns (string memory) { return string(abi.encodePacked("data:text/html;base64,", Base64.encode(bytes(anim)))); } function uint2str(uint _i) public pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len; while (_i != 0) { k = k - 1; uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } function bytes32ToHex(bytes32 _bytes32) public pure returns (string memory) { bytes memory hexString = new bytes(64); // bytes32 will always be 32 bytes long for (uint256 i = 0; i < 32; i++) { bytes1 byteValue = bytes1(uint8(uint256(_bytes32) / (2**(8*(31 - i))))); bytes1 hi = byteValue >> 4; bytes1 lo = byteValue & 0x0f; hexString[i*2] = char(hi); hexString[i*2 + 1] = char(lo); } return string(hexString); } function char(bytes1 _byte) public pure returns (bytes1) { if (_byte < 0x0A) return bytes1(uint8(_byte) + 0x30); else return bytes1(uint8(_byte) + 0x57); } } // OpenZeppelin Contracts (last updated v5.0.2) (utils/Base64.sol) /** * @dev Provides a set of functions to operate with Base64 strings. */ library Base64 { /** * @dev Base64 Encoding/Decoding Table * See sections 4 and 5 of https://datatracker.ietf.org/doc/html/rfc4648 */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; string internal constant _TABLE_URL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { return _encode(data, _TABLE, true); } /** * @dev Converts a `bytes` to its Bytes64Url `string` representation. */ function encodeURL(bytes memory data) internal pure returns (string memory) { return _encode(data, _TABLE_URL, false); } /** * @dev Internal table-agnostic conversion */ function _encode(bytes memory data, string memory table, bool withPadding) private pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // If padding is enabled, the final length should be `bytes` data length divided by 3 rounded up and then // multiplied by 4 so that it leaves room for padding the last chunk // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk // If padding is disabled, the final length should be `bytes` data length multiplied by 4/3 rounded up as // opposed to when padding is required to fill the last chunk. // - `4 *` -> 4 characters for each chunk // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks uint256 resultLength = withPadding ? 4 * ((data.length + 2) / 3) : (4 * data.length + 2) / 3; string memory result = new string(resultLength); /// @solidity memory-safe-assembly assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 0x20) let dataPtr := data let endPtr := add(data, mload(data)) // In some cases, the last iteration will read bytes after the end of the data. We cache the value, and // set it to zero to make sure no dirty bytes are read in that section. let afterPtr := add(endPtr, 0x20) let afterCache := mload(afterPtr) mstore(afterPtr, 0x00) // Run over the input, 3 bytes at a time for { } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 byte (24 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F to bitmask the least significant 6 bits. // Use this as an index into the lookup table, mload an entire word // so the desired character is in the least significant byte, and // mstore8 this least significant byte into the result and continue. mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // Reset the value that was cached mstore(afterPtr, afterCache) if withPadding { // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } } return result; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ProzacYouthUtils.sol"; //@developed by andrew mitchell (andrewmitchell.eth) //This is the engine for creating the animation url's script tag. contract ProzacYouthEngine_2 { ProzacYouthUtils ProzacYouthUtils1; address public owner; mapping(address => bool) public accessList; modifier onlyOwner() { require(msg.sender == owner, "Not the owner"); _; } modifier onlyAuthorized() { require(msg.sender == owner || accessList[msg.sender], "Not authorized"); _; } constructor(address ProzacYouthUtils_addr) { owner = msg.sender; ProzacYouthUtils1 = ProzacYouthUtils(ProzacYouthUtils_addr); accessList[0xF1Da6E2d387e9DA611dAc8a7FC587Eaa4B010013] = true; // Adding default wallet to accessList } function getScript() public view returns (string memory) { return string(abi.encodePacked("<script type='text/javascript'>let mode=" ,ProzacYouthUtils1.getModeRaw(), ";function updateClock(){const now=new Date();const hours=String(now.getHours()).padStart(2,'0');const minutes=String(now.getMinutes()).padStart(2,'0');const seconds=String(now.getSeconds()).padStart(2,'0');const monthNames=['January','February','March','April','May','June','July','August','September','October','November','December'];const month=monthNames[now.getMonth()];const day=now.getDate();const year=now.getFullYear();const suffix=(day)=>{if(day>3&&day<21)return'th';switch(day%10){case 1:return'st';case 2:return'nd';case 3:return'rd';default:return'th'}};const fullDate=`${month} ${day}${suffix(day)}, ${year} ${hours}:${minutes}:${seconds}`;document.querySelector('.current-time').textContent=fullDate}setInterval(updateClock,1000);updateClock();document.addEventListener('DOMContentLoaded',function(){document.getElementById('post-wrapper').style.display='block'});function setDark(){document.getElementById('paper-background').style.filter='invert(1)';document.getElementById('mode-switch').style.filter='invert(.75)';document.querySelectorAll('.light-text').forEach(function(element){element.classList.remove('light-text');element.classList.add('dark-text')});document.querySelectorAll('.light-text-2').forEach(function(element){element.classList.remove('light-text-2');element.classList.add('dark-text-2')});document.querySelectorAll('.light-text-3').forEach(function(element){element.classList.remove('light-text-3');element.classList.add('dark-text-3')});document.querySelectorAll('.light-text-4').forEach(function(element){element.classList.remove('light-text-4');element.classList.add('dark-text-4')});document.querySelectorAll('.light-bg').forEach(function(element){element.classList.remove('light-bg');element.classList.add('dark-bg')});document.querySelectorAll('.light-bg-2').forEach(function(element){element.classList.remove('light-bg-2');element.classList.add('dark-bg-2')});document.querySelectorAll('.light-border-2').forEach(function(element){element.classList.remove('light-border-2');element.classList.add('dark-border-2')});document.querySelectorAll('.light-border').forEach(function(element){element.classList.remove('light-border');element.classList.add('dark-border')});document.querySelectorAll('.light-link').forEach(function(element){element.classList.remove('light-link');element.classList.add('dark-link')})}function setLight(){document.getElementById('paper-background').style.filter='invert(0)';document.getElementById('mode-switch').style.filter='invert(0)';document.querySelectorAll('.dark-text').forEach(function(element){element.classList.remove('dark-text');element.classList.add('light-text')});document.querySelectorAll('.dark-text-2').forEach(function(element){element.classList.remove('dark-text-2');element.classList.add('light-text-2')});document.querySelectorAll('.dark-text-3').forEach(function(element){element.classList.remove('dark-text-3');element.classList.add('light-text-3')});document.querySelectorAll('.dark-text-4').forEach(function(element){element.classList.remove('dark-text-4');element.classList.add('light-text-4')});document.querySelectorAll('.dark-bg').forEach(function(element){element.classList.remove('dark-bg');element.classList.add('light-bg')});document.querySelectorAll('.dark-bg-2').forEach(function(element){element.classList.remove('dark-bg-2');element.classList.add('light-bg-2')});document.querySelectorAll('.dark-border-2').forEach(function(element){element.classList.remove('dark-border-2');element.classList.add('light-border-2')});document.querySelectorAll('.dark-border').forEach(function(element){element.classList.remove('dark-border');element.classList.add('light-border')});document.querySelectorAll('.dark-link').forEach(function(element){element.classList.remove('dark-link');element.classList.add('light-link')})}window.onresize=function(){location.reload()};function toggleMode(){if(mode===0){mode=1;setDark()}else{mode=0;setLight()}document.getElementById('mode-switch').blur()}window.onload=function(){const canvas=document.getElementById('notepadCanvas');const ctx=canvas.getContext('2d');const paperBackgroundDiv=document.getElementById('paper-background');canvas.width=window.innerWidth;canvas.height=window.innerHeight;const lineSpacing=24;const lineColor='#d3d3d3';function drawLines(){ctx.lineWidth=1;ctx.strokeStyle=lineColor;for(let y=lineSpacing;y<canvas.height;y+=lineSpacing){ctx.beginPath();ctx.moveTo(0,y);ctx.lineTo(canvas.width,y);ctx.stroke()}}function addNoise(){const imageData=ctx.getImageData(0,0,canvas.width,canvas.height);const pixels=imageData.data;for(let i=0;i<pixels.length;i+=4){const noise=Math.random()*30-15;pixels[i]+=noise;pixels[i+1]+=noise;pixels[i+2]+=noise}ctx.putImageData(imageData,0,0)}function fade(t){return t*t*t*(t*(t*6-15)+10)}function lerp(t,a,b){return a+t*(b-a)}function grad(hash,x,y){const h=hash&3;const u=h<2?x:y;const v=h<2?y:x;return((h&1)===0?u:-u)+((h&2)===0?v:-v)}function perlinNoise(x,y){const X=Math.floor(x)&255;const Y=Math.floor(y)&255;x-=Math.floor(x);y-=Math.floor(y);const u=fade(x);const v=fade(y);const a=p[X]+Y;const aa=p[a];const ab=p[a+1];const b=p[X+1]+Y;const ba=p[b];const bb=p[b+1];return lerp(v,lerp(u,grad(p[aa],x,y),grad(p[ba],x-1,y)),lerp(u,grad(p[ab],x,y-1),grad(p[bb],x-1,y-1)))}function generatePerlinNoise(width,height,ctx){const imageData=ctx.createImageData(width,height);const pixels=imageData.data;for(let y=0;y<height;y++){for(let x=0;x<width;x++){const value=Math.abs(perlinNoise(x*0.01,y*.03)*255);const index=(y*width+x)*8;pixels[index]=value;pixels[index+1]=0;pixels[index+2]=0;pixels[index+3]=196}}ctx.putImageData(imageData,0,0)}const p=[];for(let i=0;i<256;i++){p[i]=i}for(let i=0;i<256;i++){const j=Math.floor(Math.random()*256);[p[i],p[j]]=[p[j],p[i]]}for(let i=0;i<256;i++){p[256+i]=p[i]}ctx.fillStyle='#fff8dc';ctx.fillRect(0,0,canvas.width,canvas.height);addNoise();const tempCanvas=document.createElement('canvas');tempCanvas.width=canvas.width;tempCanvas.height=canvas.height;const tempContext=tempCanvas.getContext('2d');tempContext.filter='blur(15px)';generatePerlinNoise(canvas.width,canvas.height,tempContext);ctx.globalAlpha=.2;ctx.drawImage(tempCanvas,0,0);const dataURL=canvas.toDataURL('image/png');paperBackgroundDiv.style.backgroundImage=`url(${dataURL})`;paperBackgroundDiv.style.backgroundRepeat='repeat';paperBackgroundDiv.style.backgroundSize='auto';document.getElementById('paper-background').style.height=getComputedStyle(document.getElementsByTagName('html')[0]).height;document.getElementById('paper-background').style.width=getComputedStyle(document.getElementsByTagName('html')[0]).width;toggleMode()};</script>")); } function setProzacYouthUtils_1(address addr) public onlyAuthorized { ProzacYouthUtils1 = ProzacYouthUtils(addr); } function grantAccess(address _address) external onlyOwner { accessList[_address] = true; } function revokeAccess(address _address) external onlyOwner { accessList[_address] = false; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz /** * Manifold ERC721 Edition Controller interface */ interface IManifoldERC721Edition { /** * @dev Mint NFTs to a single recipient */ function mint(address recipient) external payable; /** * @dev Total supply of editions */ function totalSupply() external view returns(uint256); /** * @dev Max supply of editions */ function maxSupply() external view returns(uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; import {Math} from "./math/Math.sol"; import {SignedMath} from "./math/SignedMath.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; 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_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } }
// 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 "@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); }
// 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 mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtension(address to, uint80 data) 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 batch mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtensionBatch(address to, uint80[] calldata data) 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; /** * @dev get token data */ function tokenData(uint256 tokenId) external view returns (uint80); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; //@developed by andrew mitchell (andrewmitchell.eth) contract ProzacYouthUtils { struct Entry { string hash; string blockNumber; string timestamp; string text; string formattedTime; } string public mode = "0"; Entry[] public entries; mapping(address => bool) public accessList; address public owner; string private tjoUrl = "https://www.tjo.art/"; string private etherscanUrl = "https://etherscan.io/tx/"; string private andrewUrl = "https://andrewmitchell.xyz"; modifier onlyOwner() { require(msg.sender == owner, "Not the owner"); _; } modifier onlyAuthorized() { require(msg.sender == owner || accessList[msg.sender], "Not authorized"); _; } constructor() { owner = msg.sender; accessList[0xF1Da6E2d387e9DA611dAc8a7FC587Eaa4B010013] = true; // Adding default wallet to accessList } function grantAccess(address _address) external onlyOwner { accessList[_address] = true; } function revokeAccess(address _address) external onlyOwner { accessList[_address] = false; } //Adds an entry to the blockchain function addEntry( string memory _hash, string memory _blockNumber, string memory _timestamp, string memory _text, string memory _formattedTime ) public onlyAuthorized { entries.push(Entry(_hash, _blockNumber, _timestamp, _text, _formattedTime)); } function getEntry(uint256 index) public view returns (Entry memory) { return entries[index]; } function updateEntry( uint256 index, string memory newHash, string memory newBlockNumber, string memory newTimestamp, string memory newText, string memory newFormattedTime ) public onlyAuthorized { require(index < entries.length, "Invalid index"); entries[index] = Entry({ hash: newHash, blockNumber: newBlockNumber, timestamp: newTimestamp, text: newText, formattedTime: newFormattedTime }); } function addEntries(string memory entriesStr) public onlyAuthorized { string[] memory parts = split(entriesStr, "|"); require(parts.length % 5 == 0, "Invalid input string"); for (uint256 i = 0; i < parts.length; i += 5) { entries.push(Entry({ hash: parts[i], blockNumber: parts[i + 1], timestamp: parts[i + 2], text: parts[i + 3], formattedTime: parts[i + 4] })); } } function split(string memory str, string memory delim) internal pure returns (string[] memory) { bytes memory strBytes = bytes(str); bytes memory delimBytes = bytes(delim); uint256 splitCount; uint256 i; for (i = 0; i < strBytes.length; i++) { if (strBytes[i] == delimBytes[0]) { splitCount++; } } string[] memory splitArray = new string[](splitCount + 1); uint256 splitIndex; uint256 start = 0; for (i = 0; i < strBytes.length; i++) { if (strBytes[i] == delimBytes[0]) { splitArray[splitIndex] = substring(strBytes, start, i); splitIndex++; start = i + 1; } } splitArray[splitIndex] = substring(strBytes, start, strBytes.length); return splitArray; } function substring(bytes memory strBytes, uint256 start, uint256 end) internal pure returns (string memory) { bytes memory result = new bytes(end - start); for (uint256 i = start; i < end; i++) { result[i - start] = strBytes[i]; } return string(result); } function clearEntriesBatch(uint256 batchSize) public onlyAuthorized { uint256 length = entries.length; if (length == 0) return; uint256 end = length < batchSize ? 0 : length - batchSize; for (uint256 i = length - 1; i >= end; i--) { entries.pop(); if (i == 0) break; // Prevent underflow } } function getTotalEntries() external view returns (string memory) { return uintToString(entries.length); } function getTotalEntriesInt() external view returns (uint256) { return entries.length; } function uintToString(uint256 value) internal pure returns (string memory) { // Convert an unsigned integer to a string 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 = digits - 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } function setMode(string memory _mode) external onlyAuthorized { require( keccak256(abi.encodePacked(_mode)) == keccak256(abi.encodePacked("0")) || keccak256(abi.encodePacked(_mode)) == keccak256(abi.encodePacked("1")), "Mode must be '0' or '1'" ); mode = _mode; } function getMode() public view returns (string memory) { return keccak256(abi.encodePacked(mode)) == keccak256(abi.encodePacked("0")) ? "dark" : "light"; } function getModeRaw() public view returns (string memory) { return mode; } function setTjoUrl(string memory _tjoUrl) external onlyAuthorized { tjoUrl = _tjoUrl; } function setEtherscanUrl(string memory _etherscanUrl) external onlyAuthorized { etherscanUrl = _etherscanUrl; } function setAndrewUrl(string memory _andrewUrl) external onlyAuthorized { andrewUrl = _andrewUrl; } function getTjoUrl() external view returns (string memory) { return tjoUrl; } function getEtherscanUrl() external view returns (string memory) { return etherscanUrl; } function getAndrewUrl() external view returns (string memory) { return andrewUrl; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @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 // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.20; /** * @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. * * ```solidity * 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. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ 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 is the index of the value in the `values` array plus 1. // Position 0 is used to mean a value is not in the set. mapping(bytes32 value => uint256) _positions; } /** * @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._positions[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 cache the value's position to prevent multiple reads from the same storage slot uint256 position = set._positions[value]; if (position != 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 valueIndex = position - 1; uint256 lastIndex = set._values.length - 1; if (valueIndex != lastIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the lastValue to the index where the value to delete is set._values[valueIndex] = lastValue; // Update the tracked position of the lastValue (that was just moved) set._positions[lastValue] = position; } // Delete the slot where the moved value was stored set._values.pop(); // Delete the tracked position for the deleted slot delete set._positions[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._positions[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]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // 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); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // 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)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // 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 in 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)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "./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); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// 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 ApproveTransferUpdated(address extension); 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); /** * @dev Set the default approve transfer contract location. */ function setApproveTransfer(address extension) external; /** * @dev Get the default approve transfer contract location. */ function getApproveTransfer() external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"ProzacYouthUtils_addr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accessList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAnimFooter","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getAnimHeader","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEntriesHTML","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"grantAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"revokeAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setProzacYouthUtils_1","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b5060405161385b38038061385b8339818101604052810190610031919061017d565b3360015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160025f73f1da6e2d387e9da611dac8a7fc587eaa4b01001373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550506101a8565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61014c82610123565b9050919050565b61015c81610142565b8114610166575f80fd5b50565b5f8151905061017781610153565b92915050565b5f602082840312156101925761019161011f565b5b5f61019f84828501610169565b91505092915050565b6136a6806101b55f395ff3fe608060405234801561000f575f80fd5b5060043610610086575f3560e01c806385e685311161005957806385e68531146100fe57806387a5b67c1461011a5780638da5cb5b1461014a578063b0a69ab41461016857610086565b80630ae5e7391461008a57806318a6ef6c146100a65780637579b796146100c45780637899ff8f146100e0575b5f80fd5b6100a4600480360381019061009f91906109cc565b610186565b005b6100ae61026d565b6040516100bb9190610a67565b60405180910390f35b6100de60048036038101906100d991906109cc565b610423565b005b6100e8610545565b6040516100f59190610a67565b60405180910390f35b610118600480360381019061011391906109cc565b610582565b005b610134600480360381019061012f91906109cc565b610668565b6040516101419190610aa1565b60405180910390f35b610152610685565b60405161015f9190610ac9565b60405180910390f35b6101706106aa565b60405161017d9190610a67565b60405180910390f35b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020c90610b2c565b60405180910390fd5b600160025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b60605f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166312d491c96040518163ffffffff1660e01b81526004015f60405180830381865afa1580156102d6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906102fe9190610c68565b3073ffffffffffffffffffffffffffffffffffffffff1663b0a69ab46040518163ffffffff1660e01b81526004015f60405180830381865afa158015610346573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061036e9190610c68565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639ef96d1f6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156103d5573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906103fd9190610c68565b60405160200161040f939291906129ae565b604051602081830303815290604052905090565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104c4575060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b610503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104fa90612a5f565b60405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606040518060400160405280601481526020017f3c626f64793e3c2f626f64793e3c2f68746d6c3e000000000000000000000000815250905090565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060890610b2c565b60405180910390fd5b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b6002602052805f5260405f205f915054906101000a900460ff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060805f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d8550e16040518163ffffffff1660e01b81526004015f60405180830381865afa158015610716573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061073e9190610c68565b90505f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663721768586040518163ffffffff1660e01b81526004015f60405180830381865afa1580156107a9573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906107d19190610c68565b90505f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663927947b46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561083d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108619190612ab0565b90505f5b81811015610956575f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bae78d7b836040518263ffffffff1660e01b81526004016108c79190612aea565b5f60405180830381865afa1580156108e1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906109099190612c20565b9050858585835f01518460800151856020015186606001516040516020016109379796959493929190613525565b6040516020818303038152906040529550508080600101915050610865565b508394505050505090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61099b82610972565b9050919050565b6109ab81610991565b81146109b5575f80fd5b50565b5f813590506109c6816109a2565b92915050565b5f602082840312156109e1576109e061096a565b5b5f6109ee848285016109b8565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610a39826109f7565b610a438185610a01565b9350610a53818560208601610a11565b610a5c81610a1f565b840191505092915050565b5f6020820190508181035f830152610a7f8184610a2f565b905092915050565b5f8115159050919050565b610a9b81610a87565b82525050565b5f602082019050610ab45f830184610a92565b92915050565b610ac381610991565b82525050565b5f602082019050610adc5f830184610aba565b92915050565b7f4e6f7420746865206f776e6572000000000000000000000000000000000000005f82015250565b5f610b16600d83610a01565b9150610b2182610ae2565b602082019050919050565b5f6020820190508181035f830152610b4381610b0a565b9050919050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610b8882610a1f565b810181811067ffffffffffffffff82111715610ba757610ba6610b52565b5b80604052505050565b5f610bb9610961565b9050610bc58282610b7f565b919050565b5f67ffffffffffffffff821115610be457610be3610b52565b5b610bed82610a1f565b9050602081019050919050565b5f610c0c610c0784610bca565b610bb0565b905082815260208101848484011115610c2857610c27610b4e565b5b610c33848285610a11565b509392505050565b5f82601f830112610c4f57610c4e610b4a565b5b8151610c5f848260208601610bfa565b91505092915050565b5f60208284031215610c7d57610c7c61096a565b5b5f82015167ffffffffffffffff811115610c9a57610c9961096e565b5b610ca684828501610c3b565b91505092915050565b5f81905092915050565b7f3c21646f637479706568746d6c3e3c68746d6c206c616e673d656e3e3c6d65745f8201527f6120636f6e74656e743d27746578742f68746d6c3b20636861727365743d555460208201527f462d3827687474702d65717569763d436f6e74656e742d547970653e3c6d657460408201527f6120636f6e74656e743d2777696474683d6465766963652d77696474682c696e60608201527f697469616c2d7363616c653d31276e616d653d76696577706f72743e3c6d657460808201527f6120636f6e74656e743d2769653d6564676527687474702d65717569763d582d60a08201527f55412d436f6d70617469626c653e3c6d65746120646576656c6f7065723d274160c08201527f6e64726577204d69746368656c6c273e3c6d657461206172746973743d546a6f60e08201527f3e3c7469746c653e50726f7a616320596f7574683c2f7469746c653e0000000061010082015250565b5f610e1f61011c83610caf565b9150610e2a82610cb9565b61011c82019050919050565b7f3c7374796c653e626f64797b666f6e742d66616d696c793a48656c76657469635f8201527f612c73616e732d73657269663b666f6e742d73697a653a313070743b6d61726760208201527f696e3a303b70616464696e673a3570787d2e616e64726577732d636f6e74616960408201527f6e65727b6d617267696e3a6175746f3b77696474683a313030257d406d65646960608201527f61206f6e6c792073637265656e20616e6420286d61782d77696474683a36303060808201527f7078297b2e616e64726577732d636f6e7461696e65727b77696474683a31303060a08201527f257d7d2e7461626c657b6d617267696e3a32307078206175746f3b776964746860c08201527f3a313030253b626f726465722d636f6c6c617073653a636f6c6c617073657d4060e08201527f6d65646961206f6e6c792073637265656e20616e6420286d61782d77696474686101008201527f3a3630307078297b2e7461626c657b77696474683a313030257d7d2e666164656101208201527f2d696e7b6f7061636974793a313b616e696d6174696f6e2d6e616d653a6661646101408201527f65496e4f7061636974793b616e696d6174696f6e2d697465726174696f6e2d636101608201527f6f756e743a313b616e696d6174696f6e2d74696d696e672d66756e6374696f6e6101808201527f3a656173652d696e3b616e696d6174696f6e2d6475726174696f6e3a32737d406101a08201527f6b65796672616d65732066616465496e4f7061636974797b30257b6f706163696101c08201527f74793a307d313030257b6f7061636974793a317d7d236c6f6164696e672d74656101e08201527f78747b666f6e742d73697a653a313070743b746578742d616c69676e3a7269676102008201527f68747d236c6f6164696e677b77696474683a313030257d2e6865616465722d746102208201527f69746c657b666f6e742d73697a653a313670743b666f6e742d7765696768743a6102408201527f3730303b746578742d616c69676e3a63656e7465723b6261636b67726f756e646102608201527f2d636f6c6f723a233238343033653b70616464696e673a3130707820303b626f6102808201527f726465722d7261646975733a3570787d2e62726561646372756d62737b666f6e6102a08201527f742d73697a653a3970743b636f6c6f723a233737373b6d617267696e2d626f746102c08201527f746f6d3a313070787d236d6f64652d7377697463687b637572736f723a706f696102e08201527f6e7465723b706f736974696f6e3a66697865643b626f74746f6d3a313070783b6103008201527f72696768743a313070787d2e666f72756d2d72756c65737b626f726465722d726103208201527f61646975733a3570783b70616464696e673a313070783b666f6e742d73697a656103408201527f3a3970743b6d617267696e2d626f74746f6d3a323070787d2e7461626c652d686103608201527f65616465722c2e7461626c652d726f777b70616464696e673a3870787d2e74616103808201527f626c652d6865616465727b6261636b67726f756e642d636f6c6f723a233238346103a08201527f3033653b666f6e742d7765696768743a3730307d2e7461626c653e2e6c6967686103c08201527f742d62673a6e74682d6368696c64286576656e297b6261636b67726f756e642d6103e08201527f636f6c6f723a7267626128302c302c302c302921696d706f7274616e747d2e6c6104008201527f696768742d62677b6261636b67726f756e642d636f6c6f723a7267626128302c6104208201527f302c302c302921696d706f7274616e747d2e6c696768742d6c696e6b7b636f6c6104408201527f6f723a2361333134313421696d706f7274616e747d2e6c696768742d626f72646104608201527f65727b626f726465723a31707820736f6c6964202332383430336521696d706f6104808201527f7274616e747d2e6c696768742d626f726465722d327b626f726465723a3170786104a08201527f20736f6c6964202336323738373621696d706f7274616e747d2e6c696768742d6104c08201527f62672d327b6261636b67726f756e642d636f6c6f723a2363346330626421696d6104e08201527f706f7274616e747d2e6c696768742d746578747b636f6c6f723a2366616661666105008201527f6121696d706f7274616e747d2e6c696768742d746578742d327b636f6c6f723a6105208201527f2330613061306621696d706f7274616e747d2e6572726f722d746578747b636f6105408201527f6c6f723a236630337d2e6461726b2d6c696e6b7b636f6c6f723a2361346362636105608201527f3421696d706f7274616e747d2e6461726b2d746578742d327b636f6c6f723a236105808201527f63646364636421696d706f7274616e747d2e6c696768742d746578742d337b636105a08201527f6f6c6f723a2330643064313421696d706f7274616e747d2e6461726b2d7465786105c08201527f742d337b636f6c6f723a2363646364636421696d706f7274616e747d2e6c69676105e08201527f68742d746578742d347b636f6c6f723a2330643064313421696d706f7274616e6106008201527f747d2e6461726b2d746578742d347b636f6c6f723a2363646364636421696d706106208201527f6f7274616e747d2e7461626c653e2e6461726b2d62673a6e74682d6368696c646106408201527f286576656e297b6261636b67726f756e642d636f6c6f723a7267626128302c306106608201527f2c302c302921696d706f7274616e747d2e6461726b2d62677b6261636b67726f6106808201527f756e642d636f6c6f723a7267626128302c302c302c302921696d706f7274616e6106a08201527f747d2e6461726b2d626f726465727b626f726465723a31707820736f6c6964206106c08201527f2335353521696d706f7274616e747d2e6461726b2d626f726465722d327b626f6106e08201527f726465723a31707820736f6c6964202333333321696d706f7274616e747d2e646107008201527f61726b2d62672d327b6261636b67726f756e642d636f6c6f723a2334343421696107208201527f6d706f7274616e747d2e6461726b2d746578747b636f6c6f723a2363386338636107408201527f3821696d706f7274616e747d2e706f73742d777261707065727b646973706c616107608201527f793a6e6f6e657d2e736d616c6c2d746578747b666f6e742d73697a653a3870746107808201527f3b636f6c6f723a233535357d2e63757272656e742d74696d657b666f6e742d736107a08201527f697a653a3870743b636f6c6f723a233737373b766572746963616c2d616c69676107c08201527f6e3a73757065723b6d617267696e2d72696768743a3270787d237461626c652d6107e08201527f626f64797b7461626c652d6c61796f75743a66697865647d2e74696d652d77726108008201527f61707065727b646973706c61793a696e6c696e657d2e6c6f6164696e672d63656108208201527f6c6c7b646973706c61793a666c65783b626f726465723a303b746578742d616c6108408201527f69676e3a72696768747d2e706f73742d696e666f7b646973706c61793a666c656108608201527f783b6a7573746966792d636f6e74656e743a73706163652d6265747765656e3b6108808201527f616c69676e2d6974656d733a63656e7465727d2e706f73742d696e666f2073706108a08201527f616e7b666f6e742d73697a653a313070743b636f6c6f723a233238343033653b6108c08201527f666f6e742d7765696768743a3730307d2e706f73742d6d6573736167657b666f6108e08201527f6e742d73697a653a313070743b6c696e652d6865696768743a312e357d2e666f6109008201527f6f7465727b6d617267696e2d746f703a323070783b746578742d616c69676e3a6109208201527f63656e7465723b666f6e742d73697a653a3970743b636f6c6f723a233737377d6109408201527f2370617065722d6261636b67726f756e647b706f736974696f6e3a6162736f6c6109608201527f7574653b6261636b67726f756e642d73697a653a636f7665723b7a2d696e64656109808201527f783a2d313030303b746f703a303b6c6566743a303b77696474683a313030253b6109a08201527f6865696768743a313030257d3c2f7374796c653e3c626f647920636c6173733d6109c08201527f276c696768742d746578742d32206c696768742d6267273e3c64697620636c616109e08201527f73733d27666164652d696e20706f73742d777261707065722769643d706f7374610a008201527f2d777261707065723e3c64697620636c6173733d6261736536342069643d7061610a208201527f7065722d6261636b67726f756e643e3c2f6469763e3c64697620636c6173733d610a408201527f276c696768742d746578742d3220616e64726577732d636f6e7461696e657227610a608201527f3e3c64697620636c6173733d62726561646372756d62733e50726f7a61632059610a808201527f6f757468203e20466f72756d73203e20544a4f203e20446561722048756d616e610aa08201527f3c2f6469763e3c64697620636c6173733d706f73742d696e666f3e3c7370616e610ac08201527f20636c6173733d6c696768742d746578742d323e546f74616c20506f7374733a610ae08201527f203c622069643d746f74616c2d706f7374733e00000000000000000000000000610b0082015250565b5f611bcc610b1383610caf565b9150611bd782610e36565b610b1382019050919050565b5f611bed826109f7565b611bf78185610caf565b9350611c07818560208601610a11565b80840191505092915050565b7f3c2f623e3c2f7370616e3e3c7370616e20636c6173733d2763757272656e742d5f8201527f74696d65206c696768742d746578742d32273e3c2f7370616e3e3c2f6469763e60208201527f3c7461626c6520636c6173733d7461626c65207374796c653d7461626c652d6c60408201527f61796f75743a66697865643e3c74686561643e3c747220636c6173733d276c6960608201527f6768742d626f72646572206c696768742d74657874207461626c652d6865616460808201527f6572273e3c746820636f6c7370616e3d313e417574686f723c746820636f6c7360a08201527f70616e3d333e5468726561643c74626f64792069643d7461626c652d626f647960c08201527f3e3c747220636c6173733d276c696768742d626f72646572206c696768742d6260e08201527f67207461626c652d726f77273e3c746420636f6c7370616e3d313e3c746420636101008201527f6f6c7370616e3d333e000000000000000000000000000000000000000000000061012082015250565b5f611da061012983610caf565b9150611dab82611c13565b61012982019050919050565b7f3c2f74626f64793e3c2f7461626c653e3c7370616e2069643d6d6f64652d73775f8201527f69746368206f6e636c69636b3d746f67676c654d6f646528293e3c737667206660208201527f696c6c3d23303030303030206865696768743d313570782069643d436170615f60408201527f312076657273696f6e3d312e312076696577426f783d27302030203230372e3660608201527f3238203230372e3632382777696474683d3135707820786d6c3a73706163653d60808201527f707265736572766520786d6c6e733d687474703a2f2f7777772e77332e6f726760a08201527f2f323030302f73766720786d6c6e733a786c696e6b3d687474703a2f2f77777760c08201527f2e77332e6f72672f313939392f786c696e6b3e3c636972636c652063783d313060e08201527f332e3831342063793d3130332e38313420723d34352e383638202f3e3c7061746101008201527f6820643d274d3130332e3831342c3135372e313833632d32392e3432372c302d6101208201527f35332e3336382d32332e3934312d35332e3336382d35332e3336387332332e396101408201527f34312d35332e3336382c35332e3336382d35332e3336387335332e3336382c326101608201527f332e3934312c35332e3336382c35332e3336382020533133332e3234312c31356101808201527f372e3138332c3130332e3831342c3135372e3138337a204d3130332e3831342c6101a08201527f36352e343436632d32312e3135362c302d33382e3336382c31372e3231322d336101c08201527f382e3336382c33382e3336387331372e3231322c33382e3336382c33382e33366101e08201527f382c33382e33363820207333382e3336382d31372e3231322c33382e3336382d6102008201527f33382e333638533132342e39372c36352e3434362c3130332e3831342c36352e6102208201527f3434367a272f3e3c7061746820643d274d3130332e3831342c33392e333835636102408201527f2d342e3134322c302d372e352d332e3335382d372e352d372e3556372e3563306102608201527f2d342e3134322c332e3335382d372e352c372e352d372e3573372e352c332e336102808201527f35382c372e352c372e357632342e3338352020433131312e3331342c33362e306102a08201527f32372c3130372e3935362c33392e3338352c3130332e3831342c33392e3338356102c08201527f7a272f3e3c7061746820643d274d3130332e3831342c3230372e363238632d346102e08201527f2e3134322c302d372e352d332e3335382d372e352d372e35762d32342e3338356103008201527f63302d342e3134322c332e3335382d372e352c372e352d372e3573372e352c336103208201527f2e3335382c372e352c372e357632342e3338352020433131312e3331342c32306103408201527f342e3237312c3130372e3935362c3230372e3632382c3130332e3831342c32306103608201527f372e3632387a272f3e3c7061746820643d274d3230302e3132382c3131312e336103808201527f3134682d32342e333835632d342e3134322c302d372e352d332e3335382d372e6103a08201527f352d372e3573332e3335382d372e352c372e352d372e356832342e33383563346103c08201527f2e3134322c302c372e352c332e3335382c372e352c372e352020533230342e326103e08201527f37312c3131312e3331342c3230302e3132382c3131312e3331347a272f3e3c706104008201527f61746820643d274d33312e3838352c3131312e33313448372e35632d342e31346104208201527f322c302d372e352d332e3335382d372e352d372e3573332e3335382d372e352c6104408201527f372e352d372e356832342e33383563342e3134322c302c372e352c332e3335386104608201527f2c372e352c372e3520205333362e3032372c3131312e3331342c33312e3838356104808201527f2c3131312e3331347a272f3e3c7061746820643d274d3135342e3637362c36306104a08201527f2e343532632d312e3931392c302d332e3833392d302e3733322d352e3330332d6104c08201527f322e313937632d322e3932392d322e3932392d322e3932392d372e3637382c306104e08201527f2d31302e3630366c31372e3234332d31372e323432202063322e3932392d322e6105008201527f3932392c372e3637382d322e39332c31302e3630362c3063322e3932392c322e6105208201527f3932392c322e3932392c372e3637382c302c31302e3630366c2d31372e3234336105408201527f2c31372e323432433135382e3531352c35392e37322c3135362e3539352c36306105608201527f2e3435322c3135342e3637362c36302e3435327a272f3e3c7061746820643d276105808201527f4d33352e3730392c3137392e343139632d312e3931392c302d332e3833392d306105a08201527f2e3733322d352e3330332d322e313937632d322e3932392d322e3932392d322e6105c08201527f3932392d372e3637382c302d31302e3630366c31372e3234332d31372e3234336105e08201527f202063322e3932392d322e3932392c372e3637382d322e3932392c31302e36306106008201527f362c3063322e3932392c322e3932392c322e3932392c372e3637382c302c31306106208201527f2e3630366c2d31372e3234332c31372e3234334333392e3534382c3137382e366106408201527f38372c33372e3632392c3137392e3431392c33352e3730392c3137392e3431396106608201527f7a2020272f3e3c7061746820643d274d3137312e3931382c3137392e343139636106808201527f2d312e3931392c302d332e3833392d302e3733322d352e3330332d322e3139376106a08201527f6c2d31372e3234332d31372e323433632d322e3932392d322e3932392d322e396106c08201527f32392d372e3637382c302d31302e363036202063322e3932392d322e3932392c6106e08201527f372e3637382d322e3932392c31302e3630362c306c31372e3234332c31372e326107008201527f343363322e3932392c322e3932392c322e3932392c372e3637382c302c31302e6107208201527f3630362020433137352e3735372c3137382e3638372c3137332e3833382c31376107408201527f392e3431392c3137312e3931382c3137392e3431397a272f3e3c7061746820646107608201527f3d274d35322e3935322c36302e343532632d312e3931392c302d332e3833392d6107808201527f302e3733322d352e3330332d322e3139374c33302e3430362c34312e303133636107a08201527f2d322e3932392d322e3932392d322e3932392d372e3637372c302d31302e36306107c08201527f36202063322e3932392d322e3932392c372e3637382d322e39332c31302e36306107e08201527f362c306c31372e3234332c31372e32343263322e3932392c322e3932392c322e6108008201527f3932392c372e3637372c302c31302e3630364335362e3739312c35392e37322c6108208201527f35342e3837322c36302e3435322c35322e3935322c36302e3435327a272f3e3c6108408201527f2f7376673e3c2f7370616e3e3c6469762069643d616e64726577207374796c656108608201527f3d6d617267696e2d746f703a313570783b746578742d616c69676e3a63656e746108808201527f65723b77696474683a313030253e3c7370616e3e44657369676e6564206279206108a08201527f3c6120636c6173733d6c696768742d6c696e6b20687265663d000000000000006108c082015250565b5f61288f6108d983610caf565b915061289a82611db7565b6108d982019050919050565b7f207461726765743d5f626c616e6b3e416e64726577204d69746368656c6c3c2f5f8201527f613e3c2f7370616e3e3c2f6469763e3c64697620636c6173733d666f6f74657260208201527f3e26233136393b2050726f7a616320596f7574682e20416c6c2072696768747360408201527f2072657365727665642e3c2f6469763e3c63616e7661732069643d276e6f746560608201527f70616443616e76617327207374796c653d27646973706c61793a6e6f6e653b2760808201527f3e3c2f63616e7661733e3c2f6469763e3c2f6469763e0000000000000000000060a082015250565b5f61299860b683610caf565b91506129a3826128a6565b60b682019050919050565b5f6129b882610e12565b91506129c382611bbf565b91506129cf8286611be3565b91506129da82611d93565b91506129e68285611be3565b91506129f182612882565b91506129fd8284611be3565b9150612a088261298c565b9150819050949350505050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f612a49600e83610a01565b9150612a5482612a15565b602082019050919050565b5f6020820190508181035f830152612a7681612a3d565b9050919050565b5f819050919050565b612a8f81612a7d565b8114612a99575f80fd5b50565b5f81519050612aaa81612a86565b92915050565b5f60208284031215612ac557612ac461096a565b5b5f612ad284828501612a9c565b91505092915050565b612ae481612a7d565b82525050565b5f602082019050612afd5f830184612adb565b92915050565b5f80fd5b5f80fd5b5f60a08284031215612b2057612b1f612b03565b5b612b2a60a0610bb0565b90505f82015167ffffffffffffffff811115612b4957612b48612b07565b5b612b5584828501610c3b565b5f83015250602082015167ffffffffffffffff811115612b7857612b77612b07565b5b612b8484828501610c3b565b602083015250604082015167ffffffffffffffff811115612ba857612ba7612b07565b5b612bb484828501610c3b565b604083015250606082015167ffffffffffffffff811115612bd857612bd7612b07565b5b612be484828501610c3b565b606083015250608082015167ffffffffffffffff811115612c0857612c07612b07565b5b612c1484828501610c3b565b60808301525092915050565b5f60208284031215612c3557612c3461096a565b5b5f82015167ffffffffffffffff811115612c5257612c5161096e565b5b612c5e84828501612b0b565b91505092915050565b7f3c747220636c6173733d227461626c652d726f77206c696768742d6267206c695f8201527f6768742d626f72646572206c696768742d74657874223e000000000000000000602082015250565b5f612cc1603783610caf565b9150612ccc82612c67565b603782019050919050565b7f3c746420636f6c7370616e3d22312220636c6173733d226c696768742d6267225f8201527f2077696474683d223330252220616c69676e3d2263656e746572223e00000000602082015250565b5f612d31603c83610caf565b9150612d3c82612cd7565b603c82019050919050565b7f3c666f6e7420636c6173733d22736d616c6c5f74657874223e000000000000005f82015250565b5f612d7b601983610caf565b9150612d8682612d47565b601982019050919050565b7f3c6120636c6173733d226c696768742d6c696e6b22207461726765743d225f625f8201527f6c616e6b2220687265663d220000000000000000000000000000000000000000602082015250565b5f612deb602c83610caf565b9150612df682612d91565b602c82019050919050565b7f223e546a6f3c2f613e00000000000000000000000000000000000000000000005f82015250565b5f612e35600983610caf565b9150612e4082612e01565b600982019050919050565b7f3c666f6e743e3c2f666f6e743e3c2f666f6e743e3c2f74643e000000000000005f82015250565b5f612e7f601983610caf565b9150612e8a82612e4b565b601982019050919050565b7f3c746420636f6c7370616e3d22332220616c69676e3d227269676874222077695f8201527f6474683d223730252220636c6173733d226c696768742d6267206c696768742d60208201527f6c696e6b223e0000000000000000000000000000000000000000000000000000604082015250565b5f612f15604683610caf565b9150612f2082612e95565b604682019050919050565b7f3c64697620636c6173733d22706f7374496e666f206465736b746f70223e00005f82015250565b5f612f5f601e83610caf565b9150612f6a82612f2b565b601e82019050919050565b7f3c7370616e20636c6173733d22706f73744e756d206465736b746f70223e00005f82015250565b5f612fa9601e83610caf565b9150612fb482612f75565b601e82019050919050565b7f3c6120636c6173733d226c696768742d6c696e6b22207374796c653d22666f6e5f8201527f742d73697a653a313270783b2220687265663d22000000000000000000000000602082015250565b5f613019603483610caf565b915061302482612fbf565b603482019050919050565b7f22207461726765743d225f626c616e6b22207469746c653d224c696e6b20746f5f8201527f2074686973207472616e73616374696f6e223e00000000000000000000000000602082015250565b5f613089603383610caf565b91506130948261302f565b603382019050919050565b7f3c2f613e3c2f7370616e3e3c2f6469763e3c2f74643e3c2f74723e3c74723e3c5f8201527f7464207374796c653d2270616464696e672d626f74746f6d3a353070783b223e60208201527f3c2f74643e3c2f74723e00000000000000000000000000000000000000000000604082015250565b5f61311f604a83610caf565b915061312a8261309f565b604a82019050919050565b7f3c74723e3c746420636f6c7370616e3d2231222076616c69676e3d226d6964645f8201527f6c652220616c69676e3d226c6566742220636c6173733d226c696768742d626760208201527f223e000000000000000000000000000000000000000000000000000000000000604082015250565b5f6131b5604283610caf565b91506131c082613135565b604282019050919050565b7f3c756c20616c69676e3d226c65667422207374796c653d2270616464696e672d5f8201527f6c6566743a20313570783b666f6e742d73697a653a20313070783b223e000000602082015250565b5f613225603d83610caf565b9150613230826131cb565b603d82019050919050565b7f3c6c6920636c6173733d226c696768742d746578742d33223e426c6f636b3a205f82015250565b5f61326f602083610caf565b915061327a8261323b565b602082019050919050565b7f3c2f6c693e3c6c6920636c6173733d226c696768742d746578742d33223e4c6f5f8201527f636174696f6e3a20554e4b4e4f574e3c2f6c693e3c2f756c3e3c2f74643e0000602082015250565b5f6132df603e83610caf565b91506132ea82613285565b603e82019050919050565b7f3c746420636f6c7370616e3d22332220616c69676e3d2263656e7465722220765f8201527f616c69676e3d226d6964646c652220636c6173733d226c696768742d6267223e602082015250565b5f61334f604083610caf565b915061335a826132f5565b604082019050919050565b7f3c666f6e7420636c6173733d22726567756c61725f74657874223e00000000005f82015250565b5f613399601b83610caf565b91506133a482613365565b601b82019050919050565b7f3c64697620636c6173733d22706f7374207265706c79223e00000000000000005f82015250565b5f6133e3601883610caf565b91506133ee826133af565b601882019050919050565b7f3c626c6f636b71756f7465207374796c653d226d617267696e2d746f703a30705f8201527f783b2220636c6173733d22706f73744d657373616765206c696768742d74657860208201527f742d32222069643d226d3334303739393833223e3c62723e0000000000000000604082015250565b5f613479605883610caf565b9150613484826133f9565b605882019050919050565b7f3c2f626c6f636b71756f74653e3c2f6469763e3c2f666f6e743e3c2f74643e3c5f8201527f2f74723e3c74723e3c7464207374796c653d2270616464696e672d626f74746f60208201527f6d3a353070783b223e3c2f74643e3c2f74723e00000000000000000000000000604082015250565b5f61350f605383610caf565b915061351a8261348f565b605382019050919050565b5f613530828a611be3565b915061353b82612cb5565b915061354682612d25565b915061355182612d6f565b915061355c82612ddf565b91506135688289611be3565b915061357382612e29565b915061357e82612e73565b915061358982612f09565b915061359482612f53565b915061359f82612f9d565b91506135aa8261300d565b91506135b68288611be3565b91506135c28287611be3565b91506135cd8261307d565b91506135d98286611be3565b91506135e482613113565b91506135ef826131a9565b91506135fa82613219565b915061360582613263565b91506136118285611be3565b915061361c826132d3565b915061362782613343565b91506136328261338d565b915061363d826133d7565b91506136488261346d565b91506136548284611be3565b915061365f82613503565b91508190509897505050505050505056fea264697066735822122064a0315e77fe077da3497515157e3d81965db7adf38b20bb0a98e7fffcc424b264736f6c634300081a003300000000000000000000000075122c1ed275ce3d00f34ae592928bd7180f928c
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610086575f3560e01c806385e685311161005957806385e68531146100fe57806387a5b67c1461011a5780638da5cb5b1461014a578063b0a69ab41461016857610086565b80630ae5e7391461008a57806318a6ef6c146100a65780637579b796146100c45780637899ff8f146100e0575b5f80fd5b6100a4600480360381019061009f91906109cc565b610186565b005b6100ae61026d565b6040516100bb9190610a67565b60405180910390f35b6100de60048036038101906100d991906109cc565b610423565b005b6100e8610545565b6040516100f59190610a67565b60405180910390f35b610118600480360381019061011391906109cc565b610582565b005b610134600480360381019061012f91906109cc565b610668565b6040516101419190610aa1565b60405180910390f35b610152610685565b60405161015f9190610ac9565b60405180910390f35b6101706106aa565b60405161017d9190610a67565b60405180910390f35b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020c90610b2c565b60405180910390fd5b600160025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b60605f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166312d491c96040518163ffffffff1660e01b81526004015f60405180830381865afa1580156102d6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906102fe9190610c68565b3073ffffffffffffffffffffffffffffffffffffffff1663b0a69ab46040518163ffffffff1660e01b81526004015f60405180830381865afa158015610346573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061036e9190610c68565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639ef96d1f6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156103d5573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906103fd9190610c68565b60405160200161040f939291906129ae565b604051602081830303815290604052905090565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104c4575060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b610503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104fa90612a5f565b60405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606040518060400160405280601481526020017f3c626f64793e3c2f626f64793e3c2f68746d6c3e000000000000000000000000815250905090565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060890610b2c565b60405180910390fd5b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b6002602052805f5260405f205f915054906101000a900460ff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060805f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d8550e16040518163ffffffff1660e01b81526004015f60405180830381865afa158015610716573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061073e9190610c68565b90505f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663721768586040518163ffffffff1660e01b81526004015f60405180830381865afa1580156107a9573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906107d19190610c68565b90505f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663927947b46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561083d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108619190612ab0565b90505f5b81811015610956575f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bae78d7b836040518263ffffffff1660e01b81526004016108c79190612aea565b5f60405180830381865afa1580156108e1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906109099190612c20565b9050858585835f01518460800151856020015186606001516040516020016109379796959493929190613525565b6040516020818303038152906040529550508080600101915050610865565b508394505050505090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61099b82610972565b9050919050565b6109ab81610991565b81146109b5575f80fd5b50565b5f813590506109c6816109a2565b92915050565b5f602082840312156109e1576109e061096a565b5b5f6109ee848285016109b8565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610a39826109f7565b610a438185610a01565b9350610a53818560208601610a11565b610a5c81610a1f565b840191505092915050565b5f6020820190508181035f830152610a7f8184610a2f565b905092915050565b5f8115159050919050565b610a9b81610a87565b82525050565b5f602082019050610ab45f830184610a92565b92915050565b610ac381610991565b82525050565b5f602082019050610adc5f830184610aba565b92915050565b7f4e6f7420746865206f776e6572000000000000000000000000000000000000005f82015250565b5f610b16600d83610a01565b9150610b2182610ae2565b602082019050919050565b5f6020820190508181035f830152610b4381610b0a565b9050919050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610b8882610a1f565b810181811067ffffffffffffffff82111715610ba757610ba6610b52565b5b80604052505050565b5f610bb9610961565b9050610bc58282610b7f565b919050565b5f67ffffffffffffffff821115610be457610be3610b52565b5b610bed82610a1f565b9050602081019050919050565b5f610c0c610c0784610bca565b610bb0565b905082815260208101848484011115610c2857610c27610b4e565b5b610c33848285610a11565b509392505050565b5f82601f830112610c4f57610c4e610b4a565b5b8151610c5f848260208601610bfa565b91505092915050565b5f60208284031215610c7d57610c7c61096a565b5b5f82015167ffffffffffffffff811115610c9a57610c9961096e565b5b610ca684828501610c3b565b91505092915050565b5f81905092915050565b7f3c21646f637479706568746d6c3e3c68746d6c206c616e673d656e3e3c6d65745f8201527f6120636f6e74656e743d27746578742f68746d6c3b20636861727365743d555460208201527f462d3827687474702d65717569763d436f6e74656e742d547970653e3c6d657460408201527f6120636f6e74656e743d2777696474683d6465766963652d77696474682c696e60608201527f697469616c2d7363616c653d31276e616d653d76696577706f72743e3c6d657460808201527f6120636f6e74656e743d2769653d6564676527687474702d65717569763d582d60a08201527f55412d436f6d70617469626c653e3c6d65746120646576656c6f7065723d274160c08201527f6e64726577204d69746368656c6c273e3c6d657461206172746973743d546a6f60e08201527f3e3c7469746c653e50726f7a616320596f7574683c2f7469746c653e0000000061010082015250565b5f610e1f61011c83610caf565b9150610e2a82610cb9565b61011c82019050919050565b7f3c7374796c653e626f64797b666f6e742d66616d696c793a48656c76657469635f8201527f612c73616e732d73657269663b666f6e742d73697a653a313070743b6d61726760208201527f696e3a303b70616464696e673a3570787d2e616e64726577732d636f6e74616960408201527f6e65727b6d617267696e3a6175746f3b77696474683a313030257d406d65646960608201527f61206f6e6c792073637265656e20616e6420286d61782d77696474683a36303060808201527f7078297b2e616e64726577732d636f6e7461696e65727b77696474683a31303060a08201527f257d7d2e7461626c657b6d617267696e3a32307078206175746f3b776964746860c08201527f3a313030253b626f726465722d636f6c6c617073653a636f6c6c617073657d4060e08201527f6d65646961206f6e6c792073637265656e20616e6420286d61782d77696474686101008201527f3a3630307078297b2e7461626c657b77696474683a313030257d7d2e666164656101208201527f2d696e7b6f7061636974793a313b616e696d6174696f6e2d6e616d653a6661646101408201527f65496e4f7061636974793b616e696d6174696f6e2d697465726174696f6e2d636101608201527f6f756e743a313b616e696d6174696f6e2d74696d696e672d66756e6374696f6e6101808201527f3a656173652d696e3b616e696d6174696f6e2d6475726174696f6e3a32737d406101a08201527f6b65796672616d65732066616465496e4f7061636974797b30257b6f706163696101c08201527f74793a307d313030257b6f7061636974793a317d7d236c6f6164696e672d74656101e08201527f78747b666f6e742d73697a653a313070743b746578742d616c69676e3a7269676102008201527f68747d236c6f6164696e677b77696474683a313030257d2e6865616465722d746102208201527f69746c657b666f6e742d73697a653a313670743b666f6e742d7765696768743a6102408201527f3730303b746578742d616c69676e3a63656e7465723b6261636b67726f756e646102608201527f2d636f6c6f723a233238343033653b70616464696e673a3130707820303b626f6102808201527f726465722d7261646975733a3570787d2e62726561646372756d62737b666f6e6102a08201527f742d73697a653a3970743b636f6c6f723a233737373b6d617267696e2d626f746102c08201527f746f6d3a313070787d236d6f64652d7377697463687b637572736f723a706f696102e08201527f6e7465723b706f736974696f6e3a66697865643b626f74746f6d3a313070783b6103008201527f72696768743a313070787d2e666f72756d2d72756c65737b626f726465722d726103208201527f61646975733a3570783b70616464696e673a313070783b666f6e742d73697a656103408201527f3a3970743b6d617267696e2d626f74746f6d3a323070787d2e7461626c652d686103608201527f65616465722c2e7461626c652d726f777b70616464696e673a3870787d2e74616103808201527f626c652d6865616465727b6261636b67726f756e642d636f6c6f723a233238346103a08201527f3033653b666f6e742d7765696768743a3730307d2e7461626c653e2e6c6967686103c08201527f742d62673a6e74682d6368696c64286576656e297b6261636b67726f756e642d6103e08201527f636f6c6f723a7267626128302c302c302c302921696d706f7274616e747d2e6c6104008201527f696768742d62677b6261636b67726f756e642d636f6c6f723a7267626128302c6104208201527f302c302c302921696d706f7274616e747d2e6c696768742d6c696e6b7b636f6c6104408201527f6f723a2361333134313421696d706f7274616e747d2e6c696768742d626f72646104608201527f65727b626f726465723a31707820736f6c6964202332383430336521696d706f6104808201527f7274616e747d2e6c696768742d626f726465722d327b626f726465723a3170786104a08201527f20736f6c6964202336323738373621696d706f7274616e747d2e6c696768742d6104c08201527f62672d327b6261636b67726f756e642d636f6c6f723a2363346330626421696d6104e08201527f706f7274616e747d2e6c696768742d746578747b636f6c6f723a2366616661666105008201527f6121696d706f7274616e747d2e6c696768742d746578742d327b636f6c6f723a6105208201527f2330613061306621696d706f7274616e747d2e6572726f722d746578747b636f6105408201527f6c6f723a236630337d2e6461726b2d6c696e6b7b636f6c6f723a2361346362636105608201527f3421696d706f7274616e747d2e6461726b2d746578742d327b636f6c6f723a236105808201527f63646364636421696d706f7274616e747d2e6c696768742d746578742d337b636105a08201527f6f6c6f723a2330643064313421696d706f7274616e747d2e6461726b2d7465786105c08201527f742d337b636f6c6f723a2363646364636421696d706f7274616e747d2e6c69676105e08201527f68742d746578742d347b636f6c6f723a2330643064313421696d706f7274616e6106008201527f747d2e6461726b2d746578742d347b636f6c6f723a2363646364636421696d706106208201527f6f7274616e747d2e7461626c653e2e6461726b2d62673a6e74682d6368696c646106408201527f286576656e297b6261636b67726f756e642d636f6c6f723a7267626128302c306106608201527f2c302c302921696d706f7274616e747d2e6461726b2d62677b6261636b67726f6106808201527f756e642d636f6c6f723a7267626128302c302c302c302921696d706f7274616e6106a08201527f747d2e6461726b2d626f726465727b626f726465723a31707820736f6c6964206106c08201527f2335353521696d706f7274616e747d2e6461726b2d626f726465722d327b626f6106e08201527f726465723a31707820736f6c6964202333333321696d706f7274616e747d2e646107008201527f61726b2d62672d327b6261636b67726f756e642d636f6c6f723a2334343421696107208201527f6d706f7274616e747d2e6461726b2d746578747b636f6c6f723a2363386338636107408201527f3821696d706f7274616e747d2e706f73742d777261707065727b646973706c616107608201527f793a6e6f6e657d2e736d616c6c2d746578747b666f6e742d73697a653a3870746107808201527f3b636f6c6f723a233535357d2e63757272656e742d74696d657b666f6e742d736107a08201527f697a653a3870743b636f6c6f723a233737373b766572746963616c2d616c69676107c08201527f6e3a73757065723b6d617267696e2d72696768743a3270787d237461626c652d6107e08201527f626f64797b7461626c652d6c61796f75743a66697865647d2e74696d652d77726108008201527f61707065727b646973706c61793a696e6c696e657d2e6c6f6164696e672d63656108208201527f6c6c7b646973706c61793a666c65783b626f726465723a303b746578742d616c6108408201527f69676e3a72696768747d2e706f73742d696e666f7b646973706c61793a666c656108608201527f783b6a7573746966792d636f6e74656e743a73706163652d6265747765656e3b6108808201527f616c69676e2d6974656d733a63656e7465727d2e706f73742d696e666f2073706108a08201527f616e7b666f6e742d73697a653a313070743b636f6c6f723a233238343033653b6108c08201527f666f6e742d7765696768743a3730307d2e706f73742d6d6573736167657b666f6108e08201527f6e742d73697a653a313070743b6c696e652d6865696768743a312e357d2e666f6109008201527f6f7465727b6d617267696e2d746f703a323070783b746578742d616c69676e3a6109208201527f63656e7465723b666f6e742d73697a653a3970743b636f6c6f723a233737377d6109408201527f2370617065722d6261636b67726f756e647b706f736974696f6e3a6162736f6c6109608201527f7574653b6261636b67726f756e642d73697a653a636f7665723b7a2d696e64656109808201527f783a2d313030303b746f703a303b6c6566743a303b77696474683a313030253b6109a08201527f6865696768743a313030257d3c2f7374796c653e3c626f647920636c6173733d6109c08201527f276c696768742d746578742d32206c696768742d6267273e3c64697620636c616109e08201527f73733d27666164652d696e20706f73742d777261707065722769643d706f7374610a008201527f2d777261707065723e3c64697620636c6173733d6261736536342069643d7061610a208201527f7065722d6261636b67726f756e643e3c2f6469763e3c64697620636c6173733d610a408201527f276c696768742d746578742d3220616e64726577732d636f6e7461696e657227610a608201527f3e3c64697620636c6173733d62726561646372756d62733e50726f7a61632059610a808201527f6f757468203e20466f72756d73203e20544a4f203e20446561722048756d616e610aa08201527f3c2f6469763e3c64697620636c6173733d706f73742d696e666f3e3c7370616e610ac08201527f20636c6173733d6c696768742d746578742d323e546f74616c20506f7374733a610ae08201527f203c622069643d746f74616c2d706f7374733e00000000000000000000000000610b0082015250565b5f611bcc610b1383610caf565b9150611bd782610e36565b610b1382019050919050565b5f611bed826109f7565b611bf78185610caf565b9350611c07818560208601610a11565b80840191505092915050565b7f3c2f623e3c2f7370616e3e3c7370616e20636c6173733d2763757272656e742d5f8201527f74696d65206c696768742d746578742d32273e3c2f7370616e3e3c2f6469763e60208201527f3c7461626c6520636c6173733d7461626c65207374796c653d7461626c652d6c60408201527f61796f75743a66697865643e3c74686561643e3c747220636c6173733d276c6960608201527f6768742d626f72646572206c696768742d74657874207461626c652d6865616460808201527f6572273e3c746820636f6c7370616e3d313e417574686f723c746820636f6c7360a08201527f70616e3d333e5468726561643c74626f64792069643d7461626c652d626f647960c08201527f3e3c747220636c6173733d276c696768742d626f72646572206c696768742d6260e08201527f67207461626c652d726f77273e3c746420636f6c7370616e3d313e3c746420636101008201527f6f6c7370616e3d333e000000000000000000000000000000000000000000000061012082015250565b5f611da061012983610caf565b9150611dab82611c13565b61012982019050919050565b7f3c2f74626f64793e3c2f7461626c653e3c7370616e2069643d6d6f64652d73775f8201527f69746368206f6e636c69636b3d746f67676c654d6f646528293e3c737667206660208201527f696c6c3d23303030303030206865696768743d313570782069643d436170615f60408201527f312076657273696f6e3d312e312076696577426f783d27302030203230372e3660608201527f3238203230372e3632382777696474683d3135707820786d6c3a73706163653d60808201527f707265736572766520786d6c6e733d687474703a2f2f7777772e77332e6f726760a08201527f2f323030302f73766720786d6c6e733a786c696e6b3d687474703a2f2f77777760c08201527f2e77332e6f72672f313939392f786c696e6b3e3c636972636c652063783d313060e08201527f332e3831342063793d3130332e38313420723d34352e383638202f3e3c7061746101008201527f6820643d274d3130332e3831342c3135372e313833632d32392e3432372c302d6101208201527f35332e3336382d32332e3934312d35332e3336382d35332e3336387332332e396101408201527f34312d35332e3336382c35332e3336382d35332e3336387335332e3336382c326101608201527f332e3934312c35332e3336382c35332e3336382020533133332e3234312c31356101808201527f372e3138332c3130332e3831342c3135372e3138337a204d3130332e3831342c6101a08201527f36352e343436632d32312e3135362c302d33382e3336382c31372e3231322d336101c08201527f382e3336382c33382e3336387331372e3231322c33382e3336382c33382e33366101e08201527f382c33382e33363820207333382e3336382d31372e3231322c33382e3336382d6102008201527f33382e333638533132342e39372c36352e3434362c3130332e3831342c36352e6102208201527f3434367a272f3e3c7061746820643d274d3130332e3831342c33392e333835636102408201527f2d342e3134322c302d372e352d332e3335382d372e352d372e3556372e3563306102608201527f2d342e3134322c332e3335382d372e352c372e352d372e3573372e352c332e336102808201527f35382c372e352c372e357632342e3338352020433131312e3331342c33362e306102a08201527f32372c3130372e3935362c33392e3338352c3130332e3831342c33392e3338356102c08201527f7a272f3e3c7061746820643d274d3130332e3831342c3230372e363238632d346102e08201527f2e3134322c302d372e352d332e3335382d372e352d372e35762d32342e3338356103008201527f63302d342e3134322c332e3335382d372e352c372e352d372e3573372e352c336103208201527f2e3335382c372e352c372e357632342e3338352020433131312e3331342c32306103408201527f342e3237312c3130372e3935362c3230372e3632382c3130332e3831342c32306103608201527f372e3632387a272f3e3c7061746820643d274d3230302e3132382c3131312e336103808201527f3134682d32342e333835632d342e3134322c302d372e352d332e3335382d372e6103a08201527f352d372e3573332e3335382d372e352c372e352d372e356832342e33383563346103c08201527f2e3134322c302c372e352c332e3335382c372e352c372e352020533230342e326103e08201527f37312c3131312e3331342c3230302e3132382c3131312e3331347a272f3e3c706104008201527f61746820643d274d33312e3838352c3131312e33313448372e35632d342e31346104208201527f322c302d372e352d332e3335382d372e352d372e3573332e3335382d372e352c6104408201527f372e352d372e356832342e33383563342e3134322c302c372e352c332e3335386104608201527f2c372e352c372e3520205333362e3032372c3131312e3331342c33312e3838356104808201527f2c3131312e3331347a272f3e3c7061746820643d274d3135342e3637362c36306104a08201527f2e343532632d312e3931392c302d332e3833392d302e3733322d352e3330332d6104c08201527f322e313937632d322e3932392d322e3932392d322e3932392d372e3637382c306104e08201527f2d31302e3630366c31372e3234332d31372e323432202063322e3932392d322e6105008201527f3932392c372e3637382d322e39332c31302e3630362c3063322e3932392c322e6105208201527f3932392c322e3932392c372e3637382c302c31302e3630366c2d31372e3234336105408201527f2c31372e323432433135382e3531352c35392e37322c3135362e3539352c36306105608201527f2e3435322c3135342e3637362c36302e3435327a272f3e3c7061746820643d276105808201527f4d33352e3730392c3137392e343139632d312e3931392c302d332e3833392d306105a08201527f2e3733322d352e3330332d322e313937632d322e3932392d322e3932392d322e6105c08201527f3932392d372e3637382c302d31302e3630366c31372e3234332d31372e3234336105e08201527f202063322e3932392d322e3932392c372e3637382d322e3932392c31302e36306106008201527f362c3063322e3932392c322e3932392c322e3932392c372e3637382c302c31306106208201527f2e3630366c2d31372e3234332c31372e3234334333392e3534382c3137382e366106408201527f38372c33372e3632392c3137392e3431392c33352e3730392c3137392e3431396106608201527f7a2020272f3e3c7061746820643d274d3137312e3931382c3137392e343139636106808201527f2d312e3931392c302d332e3833392d302e3733322d352e3330332d322e3139376106a08201527f6c2d31372e3234332d31372e323433632d322e3932392d322e3932392d322e396106c08201527f32392d372e3637382c302d31302e363036202063322e3932392d322e3932392c6106e08201527f372e3637382d322e3932392c31302e3630362c306c31372e3234332c31372e326107008201527f343363322e3932392c322e3932392c322e3932392c372e3637382c302c31302e6107208201527f3630362020433137352e3735372c3137382e3638372c3137332e3833382c31376107408201527f392e3431392c3137312e3931382c3137392e3431397a272f3e3c7061746820646107608201527f3d274d35322e3935322c36302e343532632d312e3931392c302d332e3833392d6107808201527f302e3733322d352e3330332d322e3139374c33302e3430362c34312e303133636107a08201527f2d322e3932392d322e3932392d322e3932392d372e3637372c302d31302e36306107c08201527f36202063322e3932392d322e3932392c372e3637382d322e39332c31302e36306107e08201527f362c306c31372e3234332c31372e32343263322e3932392c322e3932392c322e6108008201527f3932392c372e3637372c302c31302e3630364335362e3739312c35392e37322c6108208201527f35342e3837322c36302e3435322c35322e3935322c36302e3435327a272f3e3c6108408201527f2f7376673e3c2f7370616e3e3c6469762069643d616e64726577207374796c656108608201527f3d6d617267696e2d746f703a313570783b746578742d616c69676e3a63656e746108808201527f65723b77696474683a313030253e3c7370616e3e44657369676e6564206279206108a08201527f3c6120636c6173733d6c696768742d6c696e6b20687265663d000000000000006108c082015250565b5f61288f6108d983610caf565b915061289a82611db7565b6108d982019050919050565b7f207461726765743d5f626c616e6b3e416e64726577204d69746368656c6c3c2f5f8201527f613e3c2f7370616e3e3c2f6469763e3c64697620636c6173733d666f6f74657260208201527f3e26233136393b2050726f7a616320596f7574682e20416c6c2072696768747360408201527f2072657365727665642e3c2f6469763e3c63616e7661732069643d276e6f746560608201527f70616443616e76617327207374796c653d27646973706c61793a6e6f6e653b2760808201527f3e3c2f63616e7661733e3c2f6469763e3c2f6469763e0000000000000000000060a082015250565b5f61299860b683610caf565b91506129a3826128a6565b60b682019050919050565b5f6129b882610e12565b91506129c382611bbf565b91506129cf8286611be3565b91506129da82611d93565b91506129e68285611be3565b91506129f182612882565b91506129fd8284611be3565b9150612a088261298c565b9150819050949350505050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f612a49600e83610a01565b9150612a5482612a15565b602082019050919050565b5f6020820190508181035f830152612a7681612a3d565b9050919050565b5f819050919050565b612a8f81612a7d565b8114612a99575f80fd5b50565b5f81519050612aaa81612a86565b92915050565b5f60208284031215612ac557612ac461096a565b5b5f612ad284828501612a9c565b91505092915050565b612ae481612a7d565b82525050565b5f602082019050612afd5f830184612adb565b92915050565b5f80fd5b5f80fd5b5f60a08284031215612b2057612b1f612b03565b5b612b2a60a0610bb0565b90505f82015167ffffffffffffffff811115612b4957612b48612b07565b5b612b5584828501610c3b565b5f83015250602082015167ffffffffffffffff811115612b7857612b77612b07565b5b612b8484828501610c3b565b602083015250604082015167ffffffffffffffff811115612ba857612ba7612b07565b5b612bb484828501610c3b565b604083015250606082015167ffffffffffffffff811115612bd857612bd7612b07565b5b612be484828501610c3b565b606083015250608082015167ffffffffffffffff811115612c0857612c07612b07565b5b612c1484828501610c3b565b60808301525092915050565b5f60208284031215612c3557612c3461096a565b5b5f82015167ffffffffffffffff811115612c5257612c5161096e565b5b612c5e84828501612b0b565b91505092915050565b7f3c747220636c6173733d227461626c652d726f77206c696768742d6267206c695f8201527f6768742d626f72646572206c696768742d74657874223e000000000000000000602082015250565b5f612cc1603783610caf565b9150612ccc82612c67565b603782019050919050565b7f3c746420636f6c7370616e3d22312220636c6173733d226c696768742d6267225f8201527f2077696474683d223330252220616c69676e3d2263656e746572223e00000000602082015250565b5f612d31603c83610caf565b9150612d3c82612cd7565b603c82019050919050565b7f3c666f6e7420636c6173733d22736d616c6c5f74657874223e000000000000005f82015250565b5f612d7b601983610caf565b9150612d8682612d47565b601982019050919050565b7f3c6120636c6173733d226c696768742d6c696e6b22207461726765743d225f625f8201527f6c616e6b2220687265663d220000000000000000000000000000000000000000602082015250565b5f612deb602c83610caf565b9150612df682612d91565b602c82019050919050565b7f223e546a6f3c2f613e00000000000000000000000000000000000000000000005f82015250565b5f612e35600983610caf565b9150612e4082612e01565b600982019050919050565b7f3c666f6e743e3c2f666f6e743e3c2f666f6e743e3c2f74643e000000000000005f82015250565b5f612e7f601983610caf565b9150612e8a82612e4b565b601982019050919050565b7f3c746420636f6c7370616e3d22332220616c69676e3d227269676874222077695f8201527f6474683d223730252220636c6173733d226c696768742d6267206c696768742d60208201527f6c696e6b223e0000000000000000000000000000000000000000000000000000604082015250565b5f612f15604683610caf565b9150612f2082612e95565b604682019050919050565b7f3c64697620636c6173733d22706f7374496e666f206465736b746f70223e00005f82015250565b5f612f5f601e83610caf565b9150612f6a82612f2b565b601e82019050919050565b7f3c7370616e20636c6173733d22706f73744e756d206465736b746f70223e00005f82015250565b5f612fa9601e83610caf565b9150612fb482612f75565b601e82019050919050565b7f3c6120636c6173733d226c696768742d6c696e6b22207374796c653d22666f6e5f8201527f742d73697a653a313270783b2220687265663d22000000000000000000000000602082015250565b5f613019603483610caf565b915061302482612fbf565b603482019050919050565b7f22207461726765743d225f626c616e6b22207469746c653d224c696e6b20746f5f8201527f2074686973207472616e73616374696f6e223e00000000000000000000000000602082015250565b5f613089603383610caf565b91506130948261302f565b603382019050919050565b7f3c2f613e3c2f7370616e3e3c2f6469763e3c2f74643e3c2f74723e3c74723e3c5f8201527f7464207374796c653d2270616464696e672d626f74746f6d3a353070783b223e60208201527f3c2f74643e3c2f74723e00000000000000000000000000000000000000000000604082015250565b5f61311f604a83610caf565b915061312a8261309f565b604a82019050919050565b7f3c74723e3c746420636f6c7370616e3d2231222076616c69676e3d226d6964645f8201527f6c652220616c69676e3d226c6566742220636c6173733d226c696768742d626760208201527f223e000000000000000000000000000000000000000000000000000000000000604082015250565b5f6131b5604283610caf565b91506131c082613135565b604282019050919050565b7f3c756c20616c69676e3d226c65667422207374796c653d2270616464696e672d5f8201527f6c6566743a20313570783b666f6e742d73697a653a20313070783b223e000000602082015250565b5f613225603d83610caf565b9150613230826131cb565b603d82019050919050565b7f3c6c6920636c6173733d226c696768742d746578742d33223e426c6f636b3a205f82015250565b5f61326f602083610caf565b915061327a8261323b565b602082019050919050565b7f3c2f6c693e3c6c6920636c6173733d226c696768742d746578742d33223e4c6f5f8201527f636174696f6e3a20554e4b4e4f574e3c2f6c693e3c2f756c3e3c2f74643e0000602082015250565b5f6132df603e83610caf565b91506132ea82613285565b603e82019050919050565b7f3c746420636f6c7370616e3d22332220616c69676e3d2263656e7465722220765f8201527f616c69676e3d226d6964646c652220636c6173733d226c696768742d6267223e602082015250565b5f61334f604083610caf565b915061335a826132f5565b604082019050919050565b7f3c666f6e7420636c6173733d22726567756c61725f74657874223e00000000005f82015250565b5f613399601b83610caf565b91506133a482613365565b601b82019050919050565b7f3c64697620636c6173733d22706f7374207265706c79223e00000000000000005f82015250565b5f6133e3601883610caf565b91506133ee826133af565b601882019050919050565b7f3c626c6f636b71756f7465207374796c653d226d617267696e2d746f703a30705f8201527f783b2220636c6173733d22706f73744d657373616765206c696768742d74657860208201527f742d32222069643d226d3334303739393833223e3c62723e0000000000000000604082015250565b5f613479605883610caf565b9150613484826133f9565b605882019050919050565b7f3c2f626c6f636b71756f74653e3c2f6469763e3c2f666f6e743e3c2f74643e3c5f8201527f2f74723e3c74723e3c7464207374796c653d2270616464696e672d626f74746f60208201527f6d3a353070783b223e3c2f74643e3c2f74723e00000000000000000000000000604082015250565b5f61350f605383610caf565b915061351a8261348f565b605382019050919050565b5f613530828a611be3565b915061353b82612cb5565b915061354682612d25565b915061355182612d6f565b915061355c82612ddf565b91506135688289611be3565b915061357382612e29565b915061357e82612e73565b915061358982612f09565b915061359482612f53565b915061359f82612f9d565b91506135aa8261300d565b91506135b68288611be3565b91506135c28287611be3565b91506135cd8261307d565b91506135d98286611be3565b91506135e482613113565b91506135ef826131a9565b91506135fa82613219565b915061360582613263565b91506136118285611be3565b915061361c826132d3565b915061362782613343565b91506136328261338d565b915061363d826133d7565b91506136488261346d565b91506136548284611be3565b915061365f82613503565b91508190509897505050505050505056fea264697066735822122064a0315e77fe077da3497515157e3d81965db7adf38b20bb0a98e7fffcc424b264736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000075122c1ed275ce3d00f34ae592928bd7180f928c
-----Decoded View---------------
Arg [0] : ProzacYouthUtils_addr (address): 0x75122C1ED275ce3D00f34AE592928bD7180f928C
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000075122c1ed275ce3d00f34ae592928bd7180f928c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.