This contract's source code is verified! Compiler
0.8.10+commit.fc410830
File 1 of 17: AddressUtils.sol
pragma solidity ^0.8.0;
library AddressUtils {
function toString (address account ) internal pure returns (string memory ) {
bytes32 value = bytes32 (uint256 (uint160 (account)));
bytes memory alphabet = '0123456789abcdef' ;
bytes memory chars = new bytes (42 );
chars[0 ] = '0' ;
chars[1 ] = 'x' ;
for (uint256 i = 0 ; i < 20 ; i+ + ) {
chars[2 + i * 2 ] = alphabet[uint8 (value[i + 12 ] > > 4 )];
chars[3 + i * 2 ] = alphabet[uint8 (value[i + 12 ] & 0x0f )];
}
return string (chars);
}
function isContract (address account ) internal view returns (bool ) {
uint256 size;
assembly {
size := extcodesize (account)
}
return size > 0 ;
}
function sendValue (address payable account, uint256 amount ) internal {
(bool success, ) = account.call { value : amount }('' );
require (success, 'AddressUtils: failed to send value' );
}
function functionCall (address target, bytes memory data )
internal
returns (bytes memory )
{
return
functionCall(target, data, 'AddressUtils: failed low-level call' );
}
function functionCall (
address target,
bytes memory data,
string memory error
) internal returns (bytes memory ) {
return _functionCallWithValue(target, data, 0 , error ) ;
}
function functionCallWithValue (
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory ) {
return
functionCallWithValue(
target,
data,
value,
'AddressUtils: failed low-level call with value'
);
}
function functionCallWithValue (
address target,
bytes memory data,
uint256 value,
string memory error
) internal returns (bytes memory ) {
require (
address (this ).balance > = value,
'AddressUtils: insufficient balance for call'
);
return _functionCallWithValue(target, data, value, error ) ;
}
function _functionCallWithValue (
address target,
bytes memory data,
uint256 value,
string memory error
) private returns (bytes memory ) {
require (
isContract(target),
'AddressUtils: function call to non-contract'
);
(bool success, bytes memory returnData) = target.call { value : value }(
data
);
if (success) {
return returnData;
} else if (returnData.length > 0 ) {
assembly {
let returnData_size := mload (returnData)
revert (add (32 , returnData), returnData_size)
}
} else {
revert (error ) ;
}
}
}
File 2 of 17: ChonkyNFTStorage.sol
pragma solidity ^0.8.0;
import {EnumerableSet } from "@solidstate/contracts/utils/EnumerableSet.sol" ;
library ChonkyNFTStorage {
bytes32 internal constant STORAGE_SLOT =
keccak256 ("chonky.contracts.storage.ChonkyNFT" );
struct Layout {
address implementation;
uint256 currentId;
uint256 [] genomes;
uint256 offset;
address chonkyAttributes;
address chonkyMetadata;
address chonkySet;
uint256 startTimestamp;
}
function layout ( ) internal pure returns (Layout storage l ) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}
File 3 of 17: ChonkyProxy.sol
pragma solidity ^0.8.0;
import {ERC721MetadataStorage } from "@solidstate/contracts/token/ERC721/metadata/ERC721MetadataStorage.sol" ;
import {IERC721 } from "@solidstate/contracts/token/ERC721/IERC721.sol" ;
import {Proxy } from "@solidstate/contracts/proxy/Proxy.sol" ;
import {SafeOwnable , OwnableStorage } from "@solidstate/contracts/access/SafeOwnable.sol" ;
import {IERC165 } from "@solidstate/contracts/introspection/IERC165.sol" ;
import {ERC165Storage } from "@solidstate/contracts/introspection/ERC165Storage.sol" ;
import {ChonkyNFTStorage } from "../ChonkyNFTStorage.sol" ;
contract ChonkyProxy is Proxy , SafeOwnable {
using ChonkyNFTStorage for ChonkyNFTStorage .Layout ;
using OwnableStorage for OwnableStorage .Layout ;
using ERC165Storage for ERC165Storage .Layout ;
event Upgraded (
address indexed oldImplementation,
address indexed newImplementation
) ;
constructor (
address implementation,
address chonkyAttributes,
address chonkyMetadata,
address chonkySet
) {
OwnableStorage.layout().setOwner(msg .sender );
ChonkyNFTStorage.layout().implementation = implementation;
{
ERC721MetadataStorage.Layout storage l = ERC721MetadataStorage
.layout();
l.name = "Chonkys" ;
l.symbol = "CK" ;
}
{
ChonkyNFTStorage.Layout storage l = ChonkyNFTStorage.layout();
l.chonkyAttributes = chonkyAttributes;
l.chonkyMetadata = chonkyMetadata;
l.chonkySet = chonkySet;
}
{
ERC165Storage.Layout storage l = ERC165Storage.layout();
l.setSupportedInterface(type (IERC165).interfaceId , true );
l.setSupportedInterface(type (IERC721).interfaceId , true );
}
}
receive ( ) external payable {}
function _getImplementation ( ) internal view override returns (address ) {
return ChonkyNFTStorage.layout().implementation;
}
function getImplementation ( ) external view returns (address ) {
return _getImplementation();
}
function setImplementation (address implementation ) external onlyOwner {
address oldImplementation = ChonkyNFTStorage.layout().implementation;
ChonkyNFTStorage.layout().implementation = implementation;
emit Upgraded(oldImplementation, implementation);
}
}
File 4 of 17: ERC165Storage.sol
pragma solidity ^0.8.0;
library ERC165Storage {
struct Layout {
mapping (bytes4 = > bool ) supportedInterfaces;
}
bytes32 internal constant STORAGE_SLOT =
keccak256 ('solidstate.contracts.storage.ERC165' );
function layout ( ) internal pure returns (Layout storage l ) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
function isSupportedInterface (Layout storage l, bytes4 interfaceId )
internal
view
returns (bool )
{
return l.supportedInterfaces[interfaceId];
}
function setSupportedInterface (
Layout storage l,
bytes4 interfaceId,
bool status
) internal {
require (interfaceId ! = 0xffffffff , 'ERC165: invalid interface id' );
l.supportedInterfaces[interfaceId] = status;
}
}
File 5 of 17: ERC721MetadataStorage.sol
pragma solidity ^0.8.0;
library ERC721MetadataStorage {
bytes32 internal constant STORAGE_SLOT =
keccak256 ('solidstate.contracts.storage.ERC721Metadata' );
struct Layout {
string name;
string symbol;
string baseURI;
mapping (uint256 = > string ) tokenURIs;
}
function layout ( ) internal pure returns (Layout storage l ) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}
File 6 of 17: EnumerableSet.sol
pragma solidity ^0.8.0;
library EnumerableSet {
struct Set {
bytes32 [] _values;
mapping (bytes32 = > uint256 ) _indexes;
}
struct Bytes32Set {
Set _inner;
}
struct AddressSet {
Set _inner;
}
struct UintSet {
Set _inner;
}
function at (Bytes32Set storage set, uint256 index )
internal
view
returns (bytes32 )
{
return _at(set._inner, index);
}
function at (AddressSet storage set, uint256 index )
internal
view
returns (address )
{
return address (uint160 (uint256 (_at(set._inner, index))));
}
function at (UintSet storage set, uint256 index )
internal
view
returns (uint256 )
{
return uint256 (_at(set._inner, index));
}
function contains (Bytes32Set storage set, bytes32 value )
internal
view
returns (bool )
{
return _contains(set._inner, value);
}
function contains (AddressSet storage set, address value )
internal
view
returns (bool )
{
return _contains(set._inner, bytes32 (uint256 (uint160 (value))));
}
function contains (UintSet storage set, uint256 value )
internal
view
returns (bool )
{
return _contains(set._inner, bytes32 (value));
}
function indexOf (Bytes32Set storage set, bytes32 value )
internal
view
returns (uint256 )
{
return _indexOf(set._inner, value);
}
function indexOf (AddressSet storage set, address value )
internal
view
returns (uint256 )
{
return _indexOf(set._inner, bytes32 (uint256 (uint160 (value))));
}
function indexOf (UintSet storage set, uint256 value )
internal
view
returns (uint256 )
{
return _indexOf(set._inner, bytes32 (value));
}
function length (Bytes32Set storage set ) internal view returns (uint256 ) {
return _length(set._inner);
}
function length (AddressSet storage set ) internal view returns (uint256 ) {
return _length(set._inner);
}
function length (UintSet storage set ) internal view returns (uint256 ) {
return _length(set._inner);
}
function add (Bytes32Set storage set, bytes32 value )
internal
returns (bool )
{
return _add(set._inner, value);
}
function add (AddressSet storage set, address value )
internal
returns (bool )
{
return _add(set._inner, bytes32 (uint256 (uint160 (value))));
}
function add (UintSet storage set, uint256 value ) internal returns (bool ) {
return _add(set._inner, bytes32 (value));
}
function remove (Bytes32Set storage set, bytes32 value )
internal
returns (bool )
{
return _remove(set._inner, value);
}
function remove (AddressSet storage set, address value )
internal
returns (bool )
{
return _remove(set._inner, bytes32 (uint256 (uint160 (value))));
}
function remove (UintSet storage set, uint256 value )
internal
returns (bool )
{
return _remove(set._inner, bytes32 (value));
}
function _at (Set storage set, uint256 index )
private
view
returns (bytes32 )
{
require (
set._values.length > index,
'EnumerableSet: index out of bounds'
);
return set._values[index];
}
function _contains (Set storage set, bytes32 value )
private
view
returns (bool )
{
return set._indexes[value] ! = 0 ;
}
function _indexOf (Set storage set, bytes32 value )
private
view
returns (uint256 )
{
unchecked {
return set._indexes[value] - 1 ;
}
}
function _length (Set storage set ) private view returns (uint256 ) {
return set._values.length ;
}
function _add (Set storage set, bytes32 value ) private returns (bool ) {
if (! _contains(set, value)) {
set._values.push (value);
set._indexes[value] = set._values.length ;
return true ;
} else {
return false ;
}
}
function _remove (Set storage set, bytes32 value ) private returns (bool ) {
uint256 valueIndex = set._indexes[value];
if (valueIndex ! = 0 ) {
uint256 index = valueIndex - 1 ;
bytes32 last = set._values[set._values.length - 1 ];
set._values[index] = last;
set._indexes[last] = index + 1 ;
set._values.pop ();
delete set._indexes[value];
return true ;
} else {
return false ;
}
}
}
File 7 of 17: IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface (bytes4 interfaceId ) external view returns (bool ) ;
}
File 8 of 17: IERC173.sol
pragma solidity ^0.8.0;
interface IERC173 {
event OwnershipTransferred (
address indexed previousOwner,
address indexed newOwner
) ;
function owner ( ) external view returns (address ) ;
function transferOwnership (address account ) external ;
}
File 9 of 17: IERC721.sol
pragma solidity ^0.8.0;
import { IERC165 } from '../../introspection/IERC165.sol' ;
import { IERC721Internal } from './IERC721Internal.sol' ;
interface IERC721 is IERC721Internal , IERC165 {
function balanceOf (address account ) external view returns (uint256 balance ) ;
function ownerOf (uint256 tokenId ) external view returns (address owner ) ;
function safeTransferFrom (
address from ,
address to,
uint256 tokenId
) external payable ;
function safeTransferFrom (
address from ,
address to,
uint256 tokenId,
bytes calldata data
) external payable ;
function transferFrom (
address from ,
address to,
uint256 tokenId
) external payable ;
function approve (address operator, uint256 tokenId ) external payable ;
function getApproved (uint256 tokenId )
external
view
returns (address operator ) ;
function setApprovalForAll (address operator, bool status ) external ;
function isApprovedForAll (address account, address operator )
external
view
returns (bool status ) ;
}
File 10 of 17: IERC721Internal.sol
pragma solidity ^0.8.0;
interface IERC721Internal {
event Transfer (
address indexed from ,
address indexed to,
uint256 indexed tokenId
) ;
event Approval (
address indexed owner,
address indexed operator,
uint256 indexed tokenId
) ;
event ApprovalForAll (
address indexed owner,
address indexed operator,
bool approved
) ;
}
File 11 of 17: Ownable.sol
pragma solidity ^0.8.0;
import { IERC173 } from './IERC173.sol' ;
import { OwnableInternal } from './OwnableInternal.sol' ;
import { OwnableStorage } from './OwnableStorage.sol' ;
abstract contract Ownable is IERC173 , OwnableInternal {
using OwnableStorage for OwnableStorage .Layout ;
function owner ( ) public view virtual override returns (address ) {
return OwnableStorage.layout().owner;
}
function transferOwnership (address account )
public
virtual
override
onlyOwner
{
OwnableStorage.layout().setOwner(account);
emit OwnershipTransferred(msg .sender , account);
}
}
File 12 of 17: OwnableInternal.sol
pragma solidity ^0.8.0;
import { OwnableStorage } from './OwnableStorage.sol' ;
abstract contract OwnableInternal {
using OwnableStorage for OwnableStorage .Layout ;
modifier onlyOwner ( ) {
require (
msg .sender = = OwnableStorage.layout().owner,
'Ownable: sender must be owner'
);
_ ;
}
}
File 13 of 17: OwnableStorage.sol
pragma solidity ^0.8.0;
library OwnableStorage {
struct Layout {
address owner;
}
bytes32 internal constant STORAGE_SLOT =
keccak256 ('solidstate.contracts.storage.Ownable' );
function layout ( ) internal pure returns (Layout storage l ) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
function setOwner (Layout storage l, address owner ) internal {
l.owner = owner;
}
}
File 14 of 17: Proxy.sol
pragma solidity ^0.8.0;
import { AddressUtils } from '../utils/AddressUtils.sol' ;
abstract contract Proxy {
using AddressUtils for address ;
fallback ( ) external payable virtual {
address implementation = _getImplementation();
require (
implementation.isContract(),
'Proxy: implementation must be contract'
);
assembly {
calldatacopy (0 , 0 , calldatasize ())
let result := delegatecall (
gas (),
implementation,
0 ,
calldatasize (),
0 ,
0
)
returndatacopy (0 , 0 , returndatasize ())
switch result
case 0 {
revert (0 , returndatasize ())
}
default {
return (0 , returndatasize ())
}
}
}
function _getImplementation ( ) internal virtual returns (address ) ;
}
File 15 of 17: SafeOwnable.sol
pragma solidity ^0.8.0;
import { Ownable , OwnableStorage } from './Ownable.sol' ;
import { SafeOwnableInternal } from './SafeOwnableInternal.sol' ;
import { SafeOwnableStorage } from './SafeOwnableStorage.sol' ;
abstract contract SafeOwnable is Ownable , SafeOwnableInternal {
using OwnableStorage for OwnableStorage .Layout ;
using SafeOwnableStorage for SafeOwnableStorage .Layout ;
function nomineeOwner ( ) public view virtual returns (address ) {
return SafeOwnableStorage.layout().nomineeOwner;
}
function transferOwnership (address account )
public
virtual
override
onlyOwner
{
SafeOwnableStorage.layout().setNomineeOwner(account);
}
function acceptOwnership ( ) public virtual onlyNomineeOwner {
OwnableStorage.Layout storage l = OwnableStorage.layout();
emit OwnershipTransferred(l.owner, msg .sender );
l.setOwner(msg .sender );
SafeOwnableStorage.layout().setNomineeOwner(address (0 ));
}
}
File 16 of 17: SafeOwnableInternal.sol
pragma solidity ^0.8.0;
import { SafeOwnableStorage } from './SafeOwnableStorage.sol' ;
abstract contract SafeOwnableInternal {
using SafeOwnableStorage for SafeOwnableStorage .Layout ;
modifier onlyNomineeOwner ( ) {
require (
msg .sender = = SafeOwnableStorage.layout().nomineeOwner,
'SafeOwnable: sender must be nominee owner'
);
_ ;
}
}
File 17 of 17: SafeOwnableStorage.sol
pragma solidity ^0.8.0;
library SafeOwnableStorage {
struct Layout {
address nomineeOwner;
}
bytes32 internal constant STORAGE_SLOT =
keccak256 ('solidstate.contracts.storage.SafeOwnable' );
function layout ( ) internal pure returns (Layout storage l ) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
function setNomineeOwner (Layout storage l, address nomineeOwner ) internal {
l.nomineeOwner = nomineeOwner;
}
}
{
"compilationTarget" : {
"contracts/core/ChonkyProxy.sol" : "ChonkyProxy"
} ,
"evmVersion" : "london" ,
"libraries" : { } ,
"metadata" : {
"bytecodeHash" : "ipfs"
} ,
"optimizer" : {
"enabled" : true ,
"runs" : 200
} ,
"remappings" : [ ]
} [{"inputs":[{"internalType":"address","name":"implementation","type":"address"},{"internalType":"address","name":"chonkyAttributes","type":"address"},{"internalType":"address","name":"chonkyMetadata","type":"address"},{"internalType":"address","name":"chonkySet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldImplementation","type":"address"},{"indexed":true,"internalType":"address","name":"newImplementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nomineeOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"setImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]