Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ProzacYouthEngine_2
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 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.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 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.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":"getScript","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
608060405234801561000f575f80fd5b50604051612b4f380380612b4f8339818101604052810190610031919061017d565b3360015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160025f73f1da6e2d387e9da611dac8a7fc587eaa4b01001373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550506101a8565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61014c82610123565b9050919050565b61015c81610142565b8114610166575f80fd5b50565b5f8151905061017781610153565b92915050565b5f602082840312156101925761019161011f565b5b5f61019f84828501610169565b91505092915050565b61299a806101b55f395ff3fe608060405234801561000f575f80fd5b5060043610610060575f3560e01c80630ae5e73914610064578063620b7303146100805780637579b7961461009e57806385e68531146100ba57806387a5b67c146100d65780638da5cb5b14610106575b5f80fd5b61007e60048036038101906100799190610575565b610124565b005b61008861020b565b6040516100959190610610565b60405180910390f35b6100b860048036038101906100b39190610575565b6102c0565b005b6100d460048036038101906100cf9190610575565b6103e2565b005b6100f060048036038101906100eb9190610575565b6104c8565b6040516100fd919061064a565b60405180910390f35b61010e6104e5565b60405161011b9190610672565b60405180910390f35b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101aa906106d5565b60405180910390fd5b600160025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b60605f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55324686040518163ffffffff1660e01b81526004015f60405180830381865afa158015610274573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061029c9190610811565b6040516020016102ac91906128d0565b604051602081830303815290604052905090565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610361575060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b6103a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039790612946565b60405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610468906106d5565b60405180910390fd5b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b6002602052805f5260405f205f915054906101000a900460ff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6105448261051b565b9050919050565b6105548161053a565b811461055e575f80fd5b50565b5f8135905061056f8161054b565b92915050565b5f6020828403121561058a57610589610513565b5b5f61059784828501610561565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6105e2826105a0565b6105ec81856105aa565b93506105fc8185602086016105ba565b610605816105c8565b840191505092915050565b5f6020820190508181035f83015261062881846105d8565b905092915050565b5f8115159050919050565b61064481610630565b82525050565b5f60208201905061065d5f83018461063b565b92915050565b61066c8161053a565b82525050565b5f6020820190506106855f830184610663565b92915050565b7f4e6f7420746865206f776e6572000000000000000000000000000000000000005f82015250565b5f6106bf600d836105aa565b91506106ca8261068b565b602082019050919050565b5f6020820190508181035f8301526106ec816106b3565b9050919050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610731826105c8565b810181811067ffffffffffffffff821117156107505761074f6106fb565b5b80604052505050565b5f61076261050a565b905061076e8282610728565b919050565b5f67ffffffffffffffff82111561078d5761078c6106fb565b5b610796826105c8565b9050602081019050919050565b5f6107b56107b084610773565b610759565b9050828152602081018484840111156107d1576107d06106f7565b5b6107dc8482856105ba565b509392505050565b5f82601f8301126107f8576107f76106f3565b5b81516108088482602086016107a3565b91505092915050565b5f6020828403121561082657610825610513565b5b5f82015167ffffffffffffffff81111561084357610842610517565b5b61084f848285016107e4565b91505092915050565b5f81905092915050565b7f3c73637269707420747970653d27746578742f6a617661736372697074273e6c5f8201527f6574206d6f64653d000000000000000000000000000000000000000000000000602082015250565b5f6108bc602883610858565b91506108c782610862565b602882019050919050565b5f6108dc826105a0565b6108e68185610858565b93506108f68185602086016105ba565b80840191505092915050565b7f3b66756e6374696f6e20757064617465436c6f636b28297b636f6e7374206e6f5f8201527f773d6e6577204461746528293b636f6e737420686f7572733d537472696e672860208201527f6e6f772e676574486f7572732829292e706164537461727428322c273027293b60408201527f636f6e7374206d696e757465733d537472696e67286e6f772e6765744d696e7560608201527f7465732829292e706164537461727428322c273027293b636f6e73742073656360808201527f6f6e64733d537472696e67286e6f772e6765745365636f6e64732829292e706160a08201527f64537461727428322c273027293b636f6e7374206d6f6e74684e616d65733d5b60c08201527f274a616e75617279272c274665627275617279272c274d61726368272c27417060e08201527f72696c272c274d6179272c274a756e65272c274a756c79272c274175677573746101008201527f272c2753657074656d626572272c274f63746f626572272c274e6f76656d62656101208201527f72272c27446563656d626572275d3b636f6e7374206d6f6e74683d6d6f6e74686101408201527f4e616d65735b6e6f772e6765744d6f6e746828295d3b636f6e7374206461793d6101608201527f6e6f772e6765744461746528293b636f6e737420796561723d6e6f772e6765746101808201527f46756c6c5965617228293b636f6e7374207375666669783d28646179293d3e7b6101a08201527f6966286461793e3326266461793c32312972657475726e277468273b737769746101c08201527f636828646179253130297b6361736520313a72657475726e277374273b6361736101e08201527f6520323a72657475726e276e64273b6361736520333a72657475726e277264276102008201527f3b64656661756c743a72657475726e277468277d7d3b636f6e73742066756c6c6102208201527f446174653d60247b6d6f6e74687d20247b6461797d247b7375666669782864616102408201527f79297d2c20247b796561727d20247b686f7572737d3a247b6d696e757465737d6102608201527f3a247b7365636f6e64737d603b646f63756d656e742e717565727953656c65636102808201527f746f7228272e63757272656e742d74696d6527292e74657874436f6e74656e746102a08201527f3d66756c6c446174657d736574496e74657276616c28757064617465436c6f636102c08201527f6b2c31303030293b757064617465436c6f636b28293b646f63756d656e742e616102e08201527f64644576656e744c697374656e65722827444f4d436f6e74656e744c6f6164656103008201527f64272c66756e6374696f6e28297b646f63756d656e742e676574456c656d656e6103208201527f74427949642827706f73742d7772617070657227292e7374796c652e646973706103408201527f6c61793d27626c6f636b277d293b66756e6374696f6e207365744461726b28296103608201527f7b646f63756d656e742e676574456c656d656e7442794964282770617065722d6103808201527f6261636b67726f756e6427292e7374796c652e66696c7465723d27696e7665726103a08201527f74283129273b646f63756d656e742e676574456c656d656e744279496428276d6103c08201527f6f64652d73776974636827292e7374796c652e66696c7465723d27696e7665726103e08201527f74282e373529273b646f63756d656e742e717565727953656c6563746f72416c6104008201527f6c28272e6c696768742d7465787427292e666f72456163682866756e6374696f6104208201527f6e28656c656d656e74297b656c656d656e742e636c6173734c6973742e72656d6104408201527f6f766528276c696768742d7465787427293b656c656d656e742e636c6173734c6104608201527f6973742e61646428276461726b2d7465787427297d293b646f63756d656e742e6104808201527f717565727953656c6563746f72416c6c28272e6c696768742d746578742d32276104a08201527f292e666f72456163682866756e6374696f6e28656c656d656e74297b656c656d6104c08201527f656e742e636c6173734c6973742e72656d6f766528276c696768742d746578746104e08201527f2d3227293b656c656d656e742e636c6173734c6973742e61646428276461726b6105008201527f2d746578742d3227297d293b646f63756d656e742e717565727953656c6563746105208201527f6f72416c6c28272e6c696768742d746578742d3327292e666f724561636828666105408201527f756e6374696f6e28656c656d656e74297b656c656d656e742e636c6173734c696105608201527f73742e72656d6f766528276c696768742d746578742d3327293b656c656d656e6105808201527f742e636c6173734c6973742e61646428276461726b2d746578742d3327297d296105a08201527f3b646f63756d656e742e717565727953656c6563746f72416c6c28272e6c69676105c08201527f68742d746578742d3427292e666f72456163682866756e6374696f6e28656c656105e08201527f6d656e74297b656c656d656e742e636c6173734c6973742e72656d6f766528276106008201527f6c696768742d746578742d3427293b656c656d656e742e636c6173734c6973746106208201527f2e61646428276461726b2d746578742d3427297d293b646f63756d656e742e716106408201527f7565727953656c6563746f72416c6c28272e6c696768742d626727292e666f726106608201527f456163682866756e6374696f6e28656c656d656e74297b656c656d656e742e636106808201527f6c6173734c6973742e72656d6f766528276c696768742d626727293b656c656d6106a08201527f656e742e636c6173734c6973742e61646428276461726b2d626727297d293b646106c08201527f6f63756d656e742e717565727953656c6563746f72416c6c28272e6c696768746106e08201527f2d62672d3227292e666f72456163682866756e6374696f6e28656c656d656e746107008201527f297b656c656d656e742e636c6173734c6973742e72656d6f766528276c6967686107208201527f742d62672d3227293b656c656d656e742e636c6173734c6973742e61646428276107408201527f6461726b2d62672d3227297d293b646f63756d656e742e717565727953656c656107608201527f63746f72416c6c28272e6c696768742d626f726465722d3227292e666f7245616107808201527f63682866756e6374696f6e28656c656d656e74297b656c656d656e742e636c616107a08201527f73734c6973742e72656d6f766528276c696768742d626f726465722d3227293b6107c08201527f656c656d656e742e636c6173734c6973742e61646428276461726b2d626f72646107e08201527f65722d3227297d293b646f63756d656e742e717565727953656c6563746f72416108008201527f6c6c28272e6c696768742d626f7264657227292e666f72456163682866756e636108208201527f74696f6e28656c656d656e74297b656c656d656e742e636c6173734c6973742e6108408201527f72656d6f766528276c696768742d626f7264657227293b656c656d656e742e636108608201527f6c6173734c6973742e61646428276461726b2d626f7264657227297d293b646f6108808201527f63756d656e742e717565727953656c6563746f72416c6c28272e6c696768742d6108a08201527f6c696e6b27292e666f72456163682866756e6374696f6e28656c656d656e74296108c08201527f7b656c656d656e742e636c6173734c6973742e72656d6f766528276c696768746108e08201527f2d6c696e6b27293b656c656d656e742e636c6173734c6973742e6164642827646109008201527f61726b2d6c696e6b27297d297d66756e6374696f6e207365744c6967687428296109208201527f7b646f63756d656e742e676574456c656d656e7442794964282770617065722d6109408201527f6261636b67726f756e6427292e7374796c652e66696c7465723d27696e7665726109608201527f74283029273b646f63756d656e742e676574456c656d656e744279496428276d6109808201527f6f64652d73776974636827292e7374796c652e66696c7465723d27696e7665726109a08201527f74283029273b646f63756d656e742e717565727953656c6563746f72416c6c286109c08201527f272e6461726b2d7465787427292e666f72456163682866756e6374696f6e28656109e08201527f6c656d656e74297b656c656d656e742e636c6173734c6973742e72656d6f7665610a008201527f28276461726b2d7465787427293b656c656d656e742e636c6173734c6973742e610a208201527f61646428276c696768742d7465787427297d293b646f63756d656e742e717565610a408201527f727953656c6563746f72416c6c28272e6461726b2d746578742d3227292e666f610a608201527f72456163682866756e6374696f6e28656c656d656e74297b656c656d656e742e610a808201527f636c6173734c6973742e72656d6f766528276461726b2d746578742d3227293b610aa08201527f656c656d656e742e636c6173734c6973742e61646428276c696768742d746578610ac08201527f742d3227297d293b646f63756d656e742e717565727953656c6563746f72416c610ae08201527f6c28272e6461726b2d746578742d3327292e666f72456163682866756e637469610b008201527f6f6e28656c656d656e74297b656c656d656e742e636c6173734c6973742e7265610b208201527f6d6f766528276461726b2d746578742d3327293b656c656d656e742e636c6173610b408201527f734c6973742e61646428276c696768742d746578742d3327297d293b646f6375610b608201527f6d656e742e717565727953656c6563746f72416c6c28272e6461726b2d746578610b808201527f742d3427292e666f72456163682866756e6374696f6e28656c656d656e74297b610ba08201527f656c656d656e742e636c6173734c6973742e72656d6f766528276461726b2d74610bc08201527f6578742d3427293b656c656d656e742e636c6173734c6973742e61646428276c610be08201527f696768742d746578742d3427297d293b646f63756d656e742e71756572795365610c008201527f6c6563746f72416c6c28272e6461726b2d626727292e666f7245616368286675610c208201527f6e6374696f6e28656c656d656e74297b656c656d656e742e636c6173734c6973610c408201527f742e72656d6f766528276461726b2d626727293b656c656d656e742e636c6173610c608201527f734c6973742e61646428276c696768742d626727297d293b646f63756d656e74610c808201527f2e717565727953656c6563746f72416c6c28272e6461726b2d62672d3227292e610ca08201527f666f72456163682866756e6374696f6e28656c656d656e74297b656c656d656e610cc08201527f742e636c6173734c6973742e72656d6f766528276461726b2d62672d3227293b610ce08201527f656c656d656e742e636c6173734c6973742e61646428276c696768742d62672d610d008201527f3227297d293b646f63756d656e742e717565727953656c6563746f72416c6c28610d208201527f272e6461726b2d626f726465722d3227292e666f72456163682866756e637469610d408201527f6f6e28656c656d656e74297b656c656d656e742e636c6173734c6973742e7265610d608201527f6d6f766528276461726b2d626f726465722d3227293b656c656d656e742e636c610d808201527f6173734c6973742e61646428276c696768742d626f726465722d3227297d293b610da08201527f646f63756d656e742e717565727953656c6563746f72416c6c28272e6461726b610dc08201527f2d626f7264657227292e666f72456163682866756e6374696f6e28656c656d65610de08201527f6e74297b656c656d656e742e636c6173734c6973742e72656d6f766528276461610e008201527f726b2d626f7264657227293b656c656d656e742e636c6173734c6973742e6164610e208201527f6428276c696768742d626f7264657227297d293b646f63756d656e742e717565610e408201527f727953656c6563746f72416c6c28272e6461726b2d6c696e6b27292e666f7245610e608201527f6163682866756e6374696f6e28656c656d656e74297b656c656d656e742e636c610e808201527f6173734c6973742e72656d6f766528276461726b2d6c696e6b27293b656c656d610ea08201527f656e742e636c6173734c6973742e61646428276c696768742d6c696e6b27297d610ec08201527f297d77696e646f772e6f6e726573697a653d66756e6374696f6e28297b6c6f63610ee08201527f6174696f6e2e72656c6f616428297d3b66756e6374696f6e20746f67676c654d610f008201527f6f646528297b6966286d6f64653d3d3d30297b6d6f64653d313b736574446172610f208201527f6b28297d656c73657b6d6f64653d303b7365744c6967687428297d646f63756d610f408201527f656e742e676574456c656d656e744279496428276d6f64652d73776974636827610f608201527f292e626c757228297d77696e646f772e6f6e6c6f61643d66756e6374696f6e28610f808201527f297b636f6e73742063616e7661733d646f63756d656e742e676574456c656d65610fa08201527f6e744279496428276e6f746570616443616e76617327293b636f6e7374206374610fc08201527f783d63616e7661732e676574436f6e746578742827326427293b636f6e737420610fe08201527f70617065724261636b67726f756e644469763d646f63756d656e742e676574456110008201527f6c656d656e7442794964282770617065722d6261636b67726f756e6427293b636110208201527f616e7661732e77696474683d77696e646f772e696e6e657257696474683b63616110408201527f6e7661732e6865696768743d77696e646f772e696e6e65724865696768743b636110608201527f6f6e7374206c696e6553706163696e673d32343b636f6e7374206c696e65436f6110808201527f6c6f723d2723643364336433273b66756e6374696f6e20647261774c696e65736110a08201527f28297b6374782e6c696e6557696474683d313b6374782e7374726f6b655374796110c08201527f6c653d6c696e65436f6c6f723b666f72286c657420793d6c696e6553706163696110e08201527f6e673b793c63616e7661732e6865696768743b792b3d6c696e6553706163696e6111008201527f67297b6374782e626567696e5061746828293b6374782e6d6f7665546f28302c6111208201527f79293b6374782e6c696e65546f2863616e7661732e77696474682c79293b63746111408201527f782e7374726f6b6528297d7d66756e6374696f6e206164644e6f69736528297b6111608201527f636f6e737420696d616765446174613d6374782e676574496d616765446174616111808201527f28302c302c63616e7661732e77696474682c63616e7661732e686569676874296111a08201527f3b636f6e737420706978656c733d696d616765446174612e646174613b666f726111c08201527f286c657420693d303b693c706978656c732e6c656e6774683b692b3d34297b636111e08201527f6f6e7374206e6f6973653d4d6174682e72616e646f6d28292a33302d31353b706112008201527f6978656c735b695d2b3d6e6f6973653b706978656c735b692b315d2b3d6e6f696112208201527f73653b706978656c735b692b325d2b3d6e6f6973657d6374782e707574496d616112408201527f67654461746128696d616765446174612c302c30297d66756e6374696f6e20666112608201527f6164652874297b72657475726e20742a742a742a28742a28742a362d3135292b6112808201527f3130297d66756e6374696f6e206c65727028742c612c62297b72657475726e206112a08201527f612b742a28622d61297d66756e6374696f6e206772616428686173682c782c796112c08201527f297b636f6e737420683d6861736826333b636f6e737420753d683c323f783a796112e08201527f3b636f6e737420763d683c323f793a783b72657475726e2828682631293d3d3d6113008201527f303f753a2d75292b2828682632293d3d3d303f763a2d76297d66756e6374696f6113208201527f6e207065726c696e4e6f69736528782c79297b636f6e737420583d4d6174682e6113408201527f666c6f6f72287829263235353b636f6e737420593d4d6174682e666c6f6f72286113608201527f7929263235353b782d3d4d6174682e666c6f6f722878293b792d3d4d6174682e6113808201527f666c6f6f722879293b636f6e737420753d666164652878293b636f6e737420766113a08201527f3d666164652879293b636f6e737420613d705b585d2b593b636f6e73742061616113c08201527f3d705b615d3b636f6e73742061623d705b612b315d3b636f6e737420623d705b6113e08201527f582b315d2b593b636f6e73742062613d705b625d3b636f6e73742062623d705b6114008201527f622b315d3b72657475726e206c65727028762c6c65727028752c6772616428706114208201527f5b61615d2c782c79292c6772616428705b62615d2c782d312c7929292c6c65726114408201527f7028752c6772616428705b61625d2c782c792d31292c6772616428705b62625d6114608201527f2c782d312c792d312929297d66756e6374696f6e2067656e65726174655065726114808201527f6c696e4e6f6973652877696474682c6865696768742c637478297b636f6e73746114a08201527f20696d616765446174613d6374782e637265617465496d6167654461746128776114c08201527f696474682c686569676874293b636f6e737420706978656c733d696d616765446114e08201527f6174612e646174613b666f72286c657420793d303b793c6865696768743b792b6115008201527f2b297b666f72286c657420783d303b783c77696474683b782b2b297b636f6e736115208201527f742076616c75653d4d6174682e616273287065726c696e4e6f69736528782a306115408201527f2e30312c792a2e3033292a323535293b636f6e737420696e6465783d28792a776115608201527f696474682b78292a383b706978656c735b696e6465785d3d76616c75653b70696115808201527f78656c735b696e6465782b315d3d303b706978656c735b696e6465782b325d3d6115a08201527f303b706978656c735b696e6465782b335d3d3139367d7d6374782e707574496d6115c08201527f6167654461746128696d616765446174612c302c30297d636f6e737420703d5b6115e08201527f5d3b666f72286c657420693d303b693c3235363b692b2b297b705b695d3d697d6116008201527f666f72286c657420693d303b693c3235363b692b2b297b636f6e7374206a3d4d6116208201527f6174682e666c6f6f72284d6174682e72616e646f6d28292a323536293b5b705b6116408201527f695d2c705b6a5d5d3d5b705b6a5d2c705b695d5d7d666f72286c657420693d306116608201527f3b693c3235363b692b2b297b705b3235362b695d3d705b695d7d6374782e66696116808201527f6c6c5374796c653d2723666666386463273b6374782e66696c6c5265637428306116a08201527f2c302c63616e7661732e77696474682c63616e7661732e686569676874293b616116c08201527f64644e6f69736528293b636f6e73742074656d7043616e7661733d646f63756d6116e08201527f656e742e637265617465456c656d656e74282763616e76617327293b74656d706117008201527f43616e7661732e77696474683d63616e7661732e77696474683b74656d7043616117208201527f6e7661732e6865696768743d63616e7661732e6865696768743b636f6e7374206117408201527f74656d70436f6e746578743d74656d7043616e7661732e676574436f6e7465786117608201527f742827326427293b74656d70436f6e746578742e66696c7465723d27626c75726117808201527f283135707829273b67656e65726174655065726c696e4e6f6973652863616e766117a08201527f61732e77696474682c63616e7661732e6865696768742c74656d70436f6e74656117c08201527f7874293b6374782e676c6f62616c416c7068613d2e323b6374782e64726177496117e08201527f6d6167652874656d7043616e7661732c302c30293b636f6e73742064617461556118008201527f524c3d63616e7661732e746f4461746155524c2827696d6167652f706e6727296118208201527f3b70617065724261636b67726f756e644469762e7374796c652e6261636b67726118408201527f6f756e64496d6167653d6075726c28247b6461746155524c7d29603b706170656118608201527f724261636b67726f756e644469762e7374796c652e6261636b67726f756e64526118808201527f65706561743d27726570656174273b70617065724261636b67726f756e6444696118a08201527f762e7374796c652e6261636b67726f756e6453697a653d276175746f273b646f6118c08201527f63756d656e742e676574456c656d656e7442794964282770617065722d6261636118e08201527f6b67726f756e6427292e7374796c652e6865696768743d676574436f6d7075746119008201527f65645374796c6528646f63756d656e742e676574456c656d656e7473427954616119208201527f674e616d65282768746d6c27295b305d292e6865696768743b646f63756d656e6119408201527f742e676574456c656d656e7442794964282770617065722d6261636b67726f756119608201527f6e6427292e7374796c652e77696474683d676574436f6d70757465645374796c6119808201527f6528646f63756d656e742e676574456c656d656e747342795461674e616d65286119a08201527f2768746d6c27295b305d292e77696474683b746f67676c654d6f646528297d3b6119c08201527f3c2f7363726970743e00000000000000000000000000000000000000000000006119e082015250565b5f6128b96119e983610858565b91506128c482610902565b6119e982019050919050565b5f6128da826108b0565b91506128e682846108d2565b91506128f1826128ac565b915081905092915050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f612930600e836105aa565b915061293b826128fc565b602082019050919050565b5f6020820190508181035f83015261295d81612924565b905091905056fea26469706673582212202f1874b9b718f5bd8bc459f43fa79cd49cde8cadfcad2eb6c299ce30c5f0cfa664736f6c634300081a003300000000000000000000000075122c1ed275ce3d00f34ae592928bd7180f928c
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610060575f3560e01c80630ae5e73914610064578063620b7303146100805780637579b7961461009e57806385e68531146100ba57806387a5b67c146100d65780638da5cb5b14610106575b5f80fd5b61007e60048036038101906100799190610575565b610124565b005b61008861020b565b6040516100959190610610565b60405180910390f35b6100b860048036038101906100b39190610575565b6102c0565b005b6100d460048036038101906100cf9190610575565b6103e2565b005b6100f060048036038101906100eb9190610575565b6104c8565b6040516100fd919061064a565b60405180910390f35b61010e6104e5565b60405161011b9190610672565b60405180910390f35b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101aa906106d5565b60405180910390fd5b600160025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b60605f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55324686040518163ffffffff1660e01b81526004015f60405180830381865afa158015610274573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061029c9190610811565b6040516020016102ac91906128d0565b604051602081830303815290604052905090565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610361575060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b6103a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039790612946565b60405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610468906106d5565b60405180910390fd5b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b6002602052805f5260405f205f915054906101000a900460ff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6105448261051b565b9050919050565b6105548161053a565b811461055e575f80fd5b50565b5f8135905061056f8161054b565b92915050565b5f6020828403121561058a57610589610513565b5b5f61059784828501610561565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6105e2826105a0565b6105ec81856105aa565b93506105fc8185602086016105ba565b610605816105c8565b840191505092915050565b5f6020820190508181035f83015261062881846105d8565b905092915050565b5f8115159050919050565b61064481610630565b82525050565b5f60208201905061065d5f83018461063b565b92915050565b61066c8161053a565b82525050565b5f6020820190506106855f830184610663565b92915050565b7f4e6f7420746865206f776e6572000000000000000000000000000000000000005f82015250565b5f6106bf600d836105aa565b91506106ca8261068b565b602082019050919050565b5f6020820190508181035f8301526106ec816106b3565b9050919050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610731826105c8565b810181811067ffffffffffffffff821117156107505761074f6106fb565b5b80604052505050565b5f61076261050a565b905061076e8282610728565b919050565b5f67ffffffffffffffff82111561078d5761078c6106fb565b5b610796826105c8565b9050602081019050919050565b5f6107b56107b084610773565b610759565b9050828152602081018484840111156107d1576107d06106f7565b5b6107dc8482856105ba565b509392505050565b5f82601f8301126107f8576107f76106f3565b5b81516108088482602086016107a3565b91505092915050565b5f6020828403121561082657610825610513565b5b5f82015167ffffffffffffffff81111561084357610842610517565b5b61084f848285016107e4565b91505092915050565b5f81905092915050565b7f3c73637269707420747970653d27746578742f6a617661736372697074273e6c5f8201527f6574206d6f64653d000000000000000000000000000000000000000000000000602082015250565b5f6108bc602883610858565b91506108c782610862565b602882019050919050565b5f6108dc826105a0565b6108e68185610858565b93506108f68185602086016105ba565b80840191505092915050565b7f3b66756e6374696f6e20757064617465436c6f636b28297b636f6e7374206e6f5f8201527f773d6e6577204461746528293b636f6e737420686f7572733d537472696e672860208201527f6e6f772e676574486f7572732829292e706164537461727428322c273027293b60408201527f636f6e7374206d696e757465733d537472696e67286e6f772e6765744d696e7560608201527f7465732829292e706164537461727428322c273027293b636f6e73742073656360808201527f6f6e64733d537472696e67286e6f772e6765745365636f6e64732829292e706160a08201527f64537461727428322c273027293b636f6e7374206d6f6e74684e616d65733d5b60c08201527f274a616e75617279272c274665627275617279272c274d61726368272c27417060e08201527f72696c272c274d6179272c274a756e65272c274a756c79272c274175677573746101008201527f272c2753657074656d626572272c274f63746f626572272c274e6f76656d62656101208201527f72272c27446563656d626572275d3b636f6e7374206d6f6e74683d6d6f6e74686101408201527f4e616d65735b6e6f772e6765744d6f6e746828295d3b636f6e7374206461793d6101608201527f6e6f772e6765744461746528293b636f6e737420796561723d6e6f772e6765746101808201527f46756c6c5965617228293b636f6e7374207375666669783d28646179293d3e7b6101a08201527f6966286461793e3326266461793c32312972657475726e277468273b737769746101c08201527f636828646179253130297b6361736520313a72657475726e277374273b6361736101e08201527f6520323a72657475726e276e64273b6361736520333a72657475726e277264276102008201527f3b64656661756c743a72657475726e277468277d7d3b636f6e73742066756c6c6102208201527f446174653d60247b6d6f6e74687d20247b6461797d247b7375666669782864616102408201527f79297d2c20247b796561727d20247b686f7572737d3a247b6d696e757465737d6102608201527f3a247b7365636f6e64737d603b646f63756d656e742e717565727953656c65636102808201527f746f7228272e63757272656e742d74696d6527292e74657874436f6e74656e746102a08201527f3d66756c6c446174657d736574496e74657276616c28757064617465436c6f636102c08201527f6b2c31303030293b757064617465436c6f636b28293b646f63756d656e742e616102e08201527f64644576656e744c697374656e65722827444f4d436f6e74656e744c6f6164656103008201527f64272c66756e6374696f6e28297b646f63756d656e742e676574456c656d656e6103208201527f74427949642827706f73742d7772617070657227292e7374796c652e646973706103408201527f6c61793d27626c6f636b277d293b66756e6374696f6e207365744461726b28296103608201527f7b646f63756d656e742e676574456c656d656e7442794964282770617065722d6103808201527f6261636b67726f756e6427292e7374796c652e66696c7465723d27696e7665726103a08201527f74283129273b646f63756d656e742e676574456c656d656e744279496428276d6103c08201527f6f64652d73776974636827292e7374796c652e66696c7465723d27696e7665726103e08201527f74282e373529273b646f63756d656e742e717565727953656c6563746f72416c6104008201527f6c28272e6c696768742d7465787427292e666f72456163682866756e6374696f6104208201527f6e28656c656d656e74297b656c656d656e742e636c6173734c6973742e72656d6104408201527f6f766528276c696768742d7465787427293b656c656d656e742e636c6173734c6104608201527f6973742e61646428276461726b2d7465787427297d293b646f63756d656e742e6104808201527f717565727953656c6563746f72416c6c28272e6c696768742d746578742d32276104a08201527f292e666f72456163682866756e6374696f6e28656c656d656e74297b656c656d6104c08201527f656e742e636c6173734c6973742e72656d6f766528276c696768742d746578746104e08201527f2d3227293b656c656d656e742e636c6173734c6973742e61646428276461726b6105008201527f2d746578742d3227297d293b646f63756d656e742e717565727953656c6563746105208201527f6f72416c6c28272e6c696768742d746578742d3327292e666f724561636828666105408201527f756e6374696f6e28656c656d656e74297b656c656d656e742e636c6173734c696105608201527f73742e72656d6f766528276c696768742d746578742d3327293b656c656d656e6105808201527f742e636c6173734c6973742e61646428276461726b2d746578742d3327297d296105a08201527f3b646f63756d656e742e717565727953656c6563746f72416c6c28272e6c69676105c08201527f68742d746578742d3427292e666f72456163682866756e6374696f6e28656c656105e08201527f6d656e74297b656c656d656e742e636c6173734c6973742e72656d6f766528276106008201527f6c696768742d746578742d3427293b656c656d656e742e636c6173734c6973746106208201527f2e61646428276461726b2d746578742d3427297d293b646f63756d656e742e716106408201527f7565727953656c6563746f72416c6c28272e6c696768742d626727292e666f726106608201527f456163682866756e6374696f6e28656c656d656e74297b656c656d656e742e636106808201527f6c6173734c6973742e72656d6f766528276c696768742d626727293b656c656d6106a08201527f656e742e636c6173734c6973742e61646428276461726b2d626727297d293b646106c08201527f6f63756d656e742e717565727953656c6563746f72416c6c28272e6c696768746106e08201527f2d62672d3227292e666f72456163682866756e6374696f6e28656c656d656e746107008201527f297b656c656d656e742e636c6173734c6973742e72656d6f766528276c6967686107208201527f742d62672d3227293b656c656d656e742e636c6173734c6973742e61646428276107408201527f6461726b2d62672d3227297d293b646f63756d656e742e717565727953656c656107608201527f63746f72416c6c28272e6c696768742d626f726465722d3227292e666f7245616107808201527f63682866756e6374696f6e28656c656d656e74297b656c656d656e742e636c616107a08201527f73734c6973742e72656d6f766528276c696768742d626f726465722d3227293b6107c08201527f656c656d656e742e636c6173734c6973742e61646428276461726b2d626f72646107e08201527f65722d3227297d293b646f63756d656e742e717565727953656c6563746f72416108008201527f6c6c28272e6c696768742d626f7264657227292e666f72456163682866756e636108208201527f74696f6e28656c656d656e74297b656c656d656e742e636c6173734c6973742e6108408201527f72656d6f766528276c696768742d626f7264657227293b656c656d656e742e636108608201527f6c6173734c6973742e61646428276461726b2d626f7264657227297d293b646f6108808201527f63756d656e742e717565727953656c6563746f72416c6c28272e6c696768742d6108a08201527f6c696e6b27292e666f72456163682866756e6374696f6e28656c656d656e74296108c08201527f7b656c656d656e742e636c6173734c6973742e72656d6f766528276c696768746108e08201527f2d6c696e6b27293b656c656d656e742e636c6173734c6973742e6164642827646109008201527f61726b2d6c696e6b27297d297d66756e6374696f6e207365744c6967687428296109208201527f7b646f63756d656e742e676574456c656d656e7442794964282770617065722d6109408201527f6261636b67726f756e6427292e7374796c652e66696c7465723d27696e7665726109608201527f74283029273b646f63756d656e742e676574456c656d656e744279496428276d6109808201527f6f64652d73776974636827292e7374796c652e66696c7465723d27696e7665726109a08201527f74283029273b646f63756d656e742e717565727953656c6563746f72416c6c286109c08201527f272e6461726b2d7465787427292e666f72456163682866756e6374696f6e28656109e08201527f6c656d656e74297b656c656d656e742e636c6173734c6973742e72656d6f7665610a008201527f28276461726b2d7465787427293b656c656d656e742e636c6173734c6973742e610a208201527f61646428276c696768742d7465787427297d293b646f63756d656e742e717565610a408201527f727953656c6563746f72416c6c28272e6461726b2d746578742d3227292e666f610a608201527f72456163682866756e6374696f6e28656c656d656e74297b656c656d656e742e610a808201527f636c6173734c6973742e72656d6f766528276461726b2d746578742d3227293b610aa08201527f656c656d656e742e636c6173734c6973742e61646428276c696768742d746578610ac08201527f742d3227297d293b646f63756d656e742e717565727953656c6563746f72416c610ae08201527f6c28272e6461726b2d746578742d3327292e666f72456163682866756e637469610b008201527f6f6e28656c656d656e74297b656c656d656e742e636c6173734c6973742e7265610b208201527f6d6f766528276461726b2d746578742d3327293b656c656d656e742e636c6173610b408201527f734c6973742e61646428276c696768742d746578742d3327297d293b646f6375610b608201527f6d656e742e717565727953656c6563746f72416c6c28272e6461726b2d746578610b808201527f742d3427292e666f72456163682866756e6374696f6e28656c656d656e74297b610ba08201527f656c656d656e742e636c6173734c6973742e72656d6f766528276461726b2d74610bc08201527f6578742d3427293b656c656d656e742e636c6173734c6973742e61646428276c610be08201527f696768742d746578742d3427297d293b646f63756d656e742e71756572795365610c008201527f6c6563746f72416c6c28272e6461726b2d626727292e666f7245616368286675610c208201527f6e6374696f6e28656c656d656e74297b656c656d656e742e636c6173734c6973610c408201527f742e72656d6f766528276461726b2d626727293b656c656d656e742e636c6173610c608201527f734c6973742e61646428276c696768742d626727297d293b646f63756d656e74610c808201527f2e717565727953656c6563746f72416c6c28272e6461726b2d62672d3227292e610ca08201527f666f72456163682866756e6374696f6e28656c656d656e74297b656c656d656e610cc08201527f742e636c6173734c6973742e72656d6f766528276461726b2d62672d3227293b610ce08201527f656c656d656e742e636c6173734c6973742e61646428276c696768742d62672d610d008201527f3227297d293b646f63756d656e742e717565727953656c6563746f72416c6c28610d208201527f272e6461726b2d626f726465722d3227292e666f72456163682866756e637469610d408201527f6f6e28656c656d656e74297b656c656d656e742e636c6173734c6973742e7265610d608201527f6d6f766528276461726b2d626f726465722d3227293b656c656d656e742e636c610d808201527f6173734c6973742e61646428276c696768742d626f726465722d3227297d293b610da08201527f646f63756d656e742e717565727953656c6563746f72416c6c28272e6461726b610dc08201527f2d626f7264657227292e666f72456163682866756e6374696f6e28656c656d65610de08201527f6e74297b656c656d656e742e636c6173734c6973742e72656d6f766528276461610e008201527f726b2d626f7264657227293b656c656d656e742e636c6173734c6973742e6164610e208201527f6428276c696768742d626f7264657227297d293b646f63756d656e742e717565610e408201527f727953656c6563746f72416c6c28272e6461726b2d6c696e6b27292e666f7245610e608201527f6163682866756e6374696f6e28656c656d656e74297b656c656d656e742e636c610e808201527f6173734c6973742e72656d6f766528276461726b2d6c696e6b27293b656c656d610ea08201527f656e742e636c6173734c6973742e61646428276c696768742d6c696e6b27297d610ec08201527f297d77696e646f772e6f6e726573697a653d66756e6374696f6e28297b6c6f63610ee08201527f6174696f6e2e72656c6f616428297d3b66756e6374696f6e20746f67676c654d610f008201527f6f646528297b6966286d6f64653d3d3d30297b6d6f64653d313b736574446172610f208201527f6b28297d656c73657b6d6f64653d303b7365744c6967687428297d646f63756d610f408201527f656e742e676574456c656d656e744279496428276d6f64652d73776974636827610f608201527f292e626c757228297d77696e646f772e6f6e6c6f61643d66756e6374696f6e28610f808201527f297b636f6e73742063616e7661733d646f63756d656e742e676574456c656d65610fa08201527f6e744279496428276e6f746570616443616e76617327293b636f6e7374206374610fc08201527f783d63616e7661732e676574436f6e746578742827326427293b636f6e737420610fe08201527f70617065724261636b67726f756e644469763d646f63756d656e742e676574456110008201527f6c656d656e7442794964282770617065722d6261636b67726f756e6427293b636110208201527f616e7661732e77696474683d77696e646f772e696e6e657257696474683b63616110408201527f6e7661732e6865696768743d77696e646f772e696e6e65724865696768743b636110608201527f6f6e7374206c696e6553706163696e673d32343b636f6e7374206c696e65436f6110808201527f6c6f723d2723643364336433273b66756e6374696f6e20647261774c696e65736110a08201527f28297b6374782e6c696e6557696474683d313b6374782e7374726f6b655374796110c08201527f6c653d6c696e65436f6c6f723b666f72286c657420793d6c696e6553706163696110e08201527f6e673b793c63616e7661732e6865696768743b792b3d6c696e6553706163696e6111008201527f67297b6374782e626567696e5061746828293b6374782e6d6f7665546f28302c6111208201527f79293b6374782e6c696e65546f2863616e7661732e77696474682c79293b63746111408201527f782e7374726f6b6528297d7d66756e6374696f6e206164644e6f69736528297b6111608201527f636f6e737420696d616765446174613d6374782e676574496d616765446174616111808201527f28302c302c63616e7661732e77696474682c63616e7661732e686569676874296111a08201527f3b636f6e737420706978656c733d696d616765446174612e646174613b666f726111c08201527f286c657420693d303b693c706978656c732e6c656e6774683b692b3d34297b636111e08201527f6f6e7374206e6f6973653d4d6174682e72616e646f6d28292a33302d31353b706112008201527f6978656c735b695d2b3d6e6f6973653b706978656c735b692b315d2b3d6e6f696112208201527f73653b706978656c735b692b325d2b3d6e6f6973657d6374782e707574496d616112408201527f67654461746128696d616765446174612c302c30297d66756e6374696f6e20666112608201527f6164652874297b72657475726e20742a742a742a28742a28742a362d3135292b6112808201527f3130297d66756e6374696f6e206c65727028742c612c62297b72657475726e206112a08201527f612b742a28622d61297d66756e6374696f6e206772616428686173682c782c796112c08201527f297b636f6e737420683d6861736826333b636f6e737420753d683c323f783a796112e08201527f3b636f6e737420763d683c323f793a783b72657475726e2828682631293d3d3d6113008201527f303f753a2d75292b2828682632293d3d3d303f763a2d76297d66756e6374696f6113208201527f6e207065726c696e4e6f69736528782c79297b636f6e737420583d4d6174682e6113408201527f666c6f6f72287829263235353b636f6e737420593d4d6174682e666c6f6f72286113608201527f7929263235353b782d3d4d6174682e666c6f6f722878293b792d3d4d6174682e6113808201527f666c6f6f722879293b636f6e737420753d666164652878293b636f6e737420766113a08201527f3d666164652879293b636f6e737420613d705b585d2b593b636f6e73742061616113c08201527f3d705b615d3b636f6e73742061623d705b612b315d3b636f6e737420623d705b6113e08201527f582b315d2b593b636f6e73742062613d705b625d3b636f6e73742062623d705b6114008201527f622b315d3b72657475726e206c65727028762c6c65727028752c6772616428706114208201527f5b61615d2c782c79292c6772616428705b62615d2c782d312c7929292c6c65726114408201527f7028752c6772616428705b61625d2c782c792d31292c6772616428705b62625d6114608201527f2c782d312c792d312929297d66756e6374696f6e2067656e65726174655065726114808201527f6c696e4e6f6973652877696474682c6865696768742c637478297b636f6e73746114a08201527f20696d616765446174613d6374782e637265617465496d6167654461746128776114c08201527f696474682c686569676874293b636f6e737420706978656c733d696d616765446114e08201527f6174612e646174613b666f72286c657420793d303b793c6865696768743b792b6115008201527f2b297b666f72286c657420783d303b783c77696474683b782b2b297b636f6e736115208201527f742076616c75653d4d6174682e616273287065726c696e4e6f69736528782a306115408201527f2e30312c792a2e3033292a323535293b636f6e737420696e6465783d28792a776115608201527f696474682b78292a383b706978656c735b696e6465785d3d76616c75653b70696115808201527f78656c735b696e6465782b315d3d303b706978656c735b696e6465782b325d3d6115a08201527f303b706978656c735b696e6465782b335d3d3139367d7d6374782e707574496d6115c08201527f6167654461746128696d616765446174612c302c30297d636f6e737420703d5b6115e08201527f5d3b666f72286c657420693d303b693c3235363b692b2b297b705b695d3d697d6116008201527f666f72286c657420693d303b693c3235363b692b2b297b636f6e7374206a3d4d6116208201527f6174682e666c6f6f72284d6174682e72616e646f6d28292a323536293b5b705b6116408201527f695d2c705b6a5d5d3d5b705b6a5d2c705b695d5d7d666f72286c657420693d306116608201527f3b693c3235363b692b2b297b705b3235362b695d3d705b695d7d6374782e66696116808201527f6c6c5374796c653d2723666666386463273b6374782e66696c6c5265637428306116a08201527f2c302c63616e7661732e77696474682c63616e7661732e686569676874293b616116c08201527f64644e6f69736528293b636f6e73742074656d7043616e7661733d646f63756d6116e08201527f656e742e637265617465456c656d656e74282763616e76617327293b74656d706117008201527f43616e7661732e77696474683d63616e7661732e77696474683b74656d7043616117208201527f6e7661732e6865696768743d63616e7661732e6865696768743b636f6e7374206117408201527f74656d70436f6e746578743d74656d7043616e7661732e676574436f6e7465786117608201527f742827326427293b74656d70436f6e746578742e66696c7465723d27626c75726117808201527f283135707829273b67656e65726174655065726c696e4e6f6973652863616e766117a08201527f61732e77696474682c63616e7661732e6865696768742c74656d70436f6e74656117c08201527f7874293b6374782e676c6f62616c416c7068613d2e323b6374782e64726177496117e08201527f6d6167652874656d7043616e7661732c302c30293b636f6e73742064617461556118008201527f524c3d63616e7661732e746f4461746155524c2827696d6167652f706e6727296118208201527f3b70617065724261636b67726f756e644469762e7374796c652e6261636b67726118408201527f6f756e64496d6167653d6075726c28247b6461746155524c7d29603b706170656118608201527f724261636b67726f756e644469762e7374796c652e6261636b67726f756e64526118808201527f65706561743d27726570656174273b70617065724261636b67726f756e6444696118a08201527f762e7374796c652e6261636b67726f756e6453697a653d276175746f273b646f6118c08201527f63756d656e742e676574456c656d656e7442794964282770617065722d6261636118e08201527f6b67726f756e6427292e7374796c652e6865696768743d676574436f6d7075746119008201527f65645374796c6528646f63756d656e742e676574456c656d656e7473427954616119208201527f674e616d65282768746d6c27295b305d292e6865696768743b646f63756d656e6119408201527f742e676574456c656d656e7442794964282770617065722d6261636b67726f756119608201527f6e6427292e7374796c652e77696474683d676574436f6d70757465645374796c6119808201527f6528646f63756d656e742e676574456c656d656e747342795461674e616d65286119a08201527f2768746d6c27295b305d292e77696474683b746f67676c654d6f646528297d3b6119c08201527f3c2f7363726970743e00000000000000000000000000000000000000000000006119e082015250565b5f6128b96119e983610858565b91506128c482610902565b6119e982019050919050565b5f6128da826108b0565b91506128e682846108d2565b91506128f1826128ac565b915081905092915050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f612930600e836105aa565b915061293b826128fc565b602082019050919050565b5f6020820190508181035f83015261295d81612924565b905091905056fea26469706673582212202f1874b9b718f5bd8bc459f43fa79cd49cde8cadfcad2eb6c299ce30c5f0cfa664736f6c634300081a0033
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.