编译器
0.8.17+commit.8df45f5f
文件 1 的 18:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
文件 2 的 18:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 3 的 18:DefaultOperatorFilterer.sol
pragma solidity ^0.8.13;
import {OperatorFilterer} from "./OperatorFilterer.sol";
abstract contract DefaultOperatorFilterer is OperatorFilterer {
address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);
constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
文件 4 的 18:ERC165.sol
pragma solidity ^0.8.0;
import "./IERC165.sol";
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
文件 5 的 18:ERC721Y.sol
pragma solidity ^0.8.17;
import "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol";
import "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol";
import "lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "lib/openzeppelin-contracts/contracts/utils/Address.sol";
import "lib/openzeppelin-contracts/contracts/utils/Context.sol";
import "lib/openzeppelin-contracts/contracts/utils/Strings.sol";
import "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol";
contract ERC721Y is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
using Address for address;
using Strings for uint256;
uint256 private currentIndex = 1;
string private _name;
string private _symbol;
string internal _basedURI;
string internal _preRevealURI;
mapping(uint => uint) private _availableTokens;
uint256 private _numAvailableTokens;
uint256 immutable _maxSupply;
struct MintInfo {
address minter;
uint64 timeMinted;
}
struct TokenInfo {
address owner;
uint96 auxData;
}
mapping(uint256 => MintInfo) private _minters;
mapping(uint256 => TokenInfo) private _ownerships;
mapping(address => uint256) private _balances;
mapping(uint256 => MintInfo) private _mintOrdering;
mapping(uint256 => address) private _tokenApprovals;
mapping(address => mapping(address => bool)) private _operatorApprovals;
constructor(
string memory name_,
string memory symbol_,
uint256 maxTokens_
) {
_name = name_;
_symbol = symbol_;
_maxSupply = maxTokens_;
_numAvailableTokens = maxTokens_;
}
function totalSupply() public view override returns (uint256) {
return _maxSupply - _numAvailableTokens;
}
function tokenByIndex(uint256 index) public view override returns (uint256) {
require(index > 0, "i0");
uint256 pseudoIndex = index - 1;
uint256 supply = totalSupply();
require(pseudoIndex < supply, "g");
uint256 curIndex = 0;
for (uint256 i = 0; i < _maxSupply; i++) {
if (_ownerships[i].owner != address(0)) {
if (curIndex == pseudoIndex) {
return (i + 1);
}
curIndex++;
}
}
revert("u");
}
function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
require(index < balanceOf(owner), "b");
uint256 curIndex = 0;
for (uint256 i = 0; i < _maxSupply; i++) {
if (_ownerships[i].owner == owner) {
if (curIndex == index) {
return (i + 1);
}
curIndex++;
}
}
revert("u");
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
interfaceId == type(IERC721Enumerable).interfaceId ||
super.supportsInterface(interfaceId);
}
function balanceOf(address owner) public view override returns (uint256) {
require(owner != address(0), "0");
return uint256(_balances[owner]);
}
function ownerOf(uint256 tokenId) public view override returns (address) {
require(_exists(tokenId), "e");
return _ownerships[tokenId - 1].owner;
}
function gadOf(uint256 tokenId) internal view returns (uint256) {
require(_exists(tokenId), "e");
return uint256(_ownerships[tokenId - 1].auxData);
}
function setGAD(uint256 tokenId, uint256 newGAD) internal {
require(ownerOf(tokenId) == msg.sender, "e");
_ownerships[tokenId - 1].auxData = uint96(newGAD);
}
function minterOf(uint256 tokenId) public view returns (address) {
require(_exists(tokenId), "e");
return _minters[tokenId - 1].minter;
}
function mintedAt(uint256 tokenId) public view returns (uint64) {
require(_exists(tokenId), "e");
return _minters[tokenId - 1].timeMinted;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "z");
if (bytes(_basedURI).length > 0) {
return string(abi.encodePacked(_basedURI, "/", tokenId.toString(), ".json"));
}
else {
return _preRevealURI;
}
}
function basedURI() public view virtual returns (string memory) {
return _basedURI;
}
function _setBasedURI(string memory basedURI_) internal virtual {
_basedURI = basedURI_;
}
function preRevealURI() public view virtual returns (string memory) {
return _preRevealURI;
}
function _setPreRevealURI(string memory preRevealURI_) internal virtual {
_preRevealURI = preRevealURI_;
}
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721Y.ownerOf(tokenId);
require(to != owner, "o");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"a"
);
_approve(to, tokenId, owner);
}
function getApproved(uint256 tokenId) public view override returns (address) {
require(_exists(tokenId), "a");
return _tokenApprovals[tokenId - 1];
}
function setApprovalForAll(address operator, bool approved) public virtual override {
require(operator != _msgSender(), "a");
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
function setApprovalForSelf(address operator, bool approved) internal {
_operatorApprovals[address(this)][operator] = approved;
emit ApprovalForAll(address(this), operator, approved);
}
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
_transfer(from, to, tokenId);
}
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
_transfer(from, to, tokenId);
require(
_checkOnERC721Received(from, to, tokenId, _data),
"z"
);
}
function _exists(uint256 tokenId) internal view returns (bool) {
if (tokenId == 0) { return false; }
return (_ownerships[tokenId - 1].owner != address(0));
}
function _mintIdWithoutBalanceUpdate(address to, uint256 tokenId, uint256 gad) private {
_ownerships[tokenId].owner = to;
_ownerships[tokenId].auxData = uint96(gad);
_minters[tokenId].minter = to;
_minters[tokenId].timeMinted = uint64(block.timestamp);
emit Transfer(address(0), to, tokenId + 1);
}
function _mintRandom(address to, uint _quantity, uint256 gad) internal virtual returns (uint256[] memory) {
require(to != address(0), "0");
require(_quantity > 0, "1");
uint256[] memory toReturn = new uint256[](_quantity);
uint updatedNumAvailableTokens = _numAvailableTokens;
uint256 randomNum;
for (uint256 i = 0; i < _quantity; i++) {
uint256 modPos = i%16;
if (modPos == 0) {
randomNum = getRandomAvailableTokenId(to, updatedNumAvailableTokens);
}
uint256 randomIndex = (randomNum>>(modPos*16)) % updatedNumAvailableTokens;
uint256 tokenId = getAvailableTokenAtIndex(randomIndex, updatedNumAvailableTokens);
_mintIdWithoutBalanceUpdate(to, tokenId, gad);
toReturn[i] = (tokenId + 1);
updatedNumAvailableTokens--;
}
_numAvailableTokens = updatedNumAvailableTokens;
_balances[to] += _quantity;
_mintOrdering[currentIndex].minter = to;
_mintOrdering[currentIndex].timeMinted = uint64(block.timestamp);
currentIndex += _quantity;
return toReturn;
}
function getRandomAvailableTokenId(
address to,
uint updatedNumAvailableTokens
) internal view returns (uint256) {
uint256 randomNum = uint256(
keccak256(
abi.encode(
to,
tx.gasprice,
block.number,
block.timestamp,
block.difficulty,
blockhash(block.number - 1),
address(this),
updatedNumAvailableTokens
)
)
);
return randomNum;
}
function getAvailableTokenAtIndex(
uint256 indexToUse,
uint256 updatedNumAvailableTokens
) internal returns (uint256) {
uint256 valAtIndex = _availableTokens[indexToUse];
uint256 result;
if (valAtIndex == 0) {
result = indexToUse;
} else {
result = valAtIndex;
}
uint256 lastIndex = updatedNumAvailableTokens - 1;
if (indexToUse != lastIndex) {
uint256 lastValInArray = _availableTokens[lastIndex];
if (lastValInArray == 0) {
_availableTokens[indexToUse] = lastIndex;
} else {
_availableTokens[indexToUse] = lastValInArray;
delete _availableTokens[lastIndex];
}
}
return result;
}
function getMintOrderInfoByIndex(uint256 index) private view returns (MintInfo memory) {
if (index > totalSupply()) {
return _mintOrdering[0];
}
for (uint256 i = index; i > 0; i--) {
if (_mintOrdering[i].minter != address(0)) {
return _mintOrdering[i];
}
}
return _mintOrdering[0];
}
function getMinterByOrderIndex(uint256 index) public view returns (address) {
MintInfo memory info = getMintOrderInfoByIndex(index);
return info.minter;
}
function getMintTimeByOrderIndex(uint256 index) public view returns (uint64) {
MintInfo memory info = getMintOrderInfoByIndex(index);
return info.timeMinted;
}
function _transfer(
address from,
address to,
uint256 tokenId
) private {
address prevOwnership = ownerOf(tokenId);
bool isApprovedOrOwner = (_msgSender() == prevOwnership ||
getApproved(tokenId) == _msgSender() ||
isApprovedForAll(prevOwnership, _msgSender()));
require(isApprovedOrOwner, "a");
require(prevOwnership == from, "o");
require(to != address(0), "0");
_approve(address(0), tokenId, prevOwnership);
_balances[from] -= 1;
_balances[to] += 1;
_ownerships[tokenId - 1].owner = to;
emit Transfer(from, to, tokenId);
}
function _approve(
address to,
uint256 tokenId,
address owner
) private {
_tokenApprovals[tokenId - 1] = to;
emit Approval(owner, to, tokenId);
}
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("z");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
}
文件 6 的 18:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 7 的 18:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
文件 8 的 18:IERC721.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
function approve(address to, uint256 tokenId) external;
function setApprovalForAll(address operator, bool _approved) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
文件 9 的 18:IERC721Enumerable.sol
pragma solidity ^0.8.0;
import "../IERC721.sol";
interface IERC721Enumerable is IERC721 {
function totalSupply() external view returns (uint256);
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
function tokenByIndex(uint256 index) external view returns (uint256);
}
文件 10 的 18:IERC721Metadata.sol
pragma solidity ^0.8.0;
import "../IERC721.sol";
interface IERC721Metadata is IERC721 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function tokenURI(uint256 tokenId) external view returns (string memory);
}
文件 11 的 18:IERC721Receiver.sol
pragma solidity ^0.8.0;
interface IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
文件 12 的 18:IOperatorFilterRegistry.sol
pragma solidity ^0.8.13;
interface IOperatorFilterRegistry {
function isOperatorAllowed(address registrant, address operator) external view returns (bool);
function register(address registrant) external;
function registerAndSubscribe(address registrant, address subscription) external;
function registerAndCopyEntries(address registrant, address registrantToCopy) external;
function unregister(address addr) external;
function updateOperator(address registrant, address operator, bool filtered) external;
function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
function subscribe(address registrant, address registrantToSubscribe) external;
function unsubscribe(address registrant, bool copyExistingEntries) external;
function subscriptionOf(address addr) external returns (address registrant);
function subscribers(address registrant) external returns (address[] memory);
function subscriberAt(address registrant, uint256 index) external returns (address);
function copyEntriesOf(address registrant, address registrantToCopy) external;
function isOperatorFiltered(address registrant, address operator) external returns (bool);
function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
function filteredOperators(address addr) external returns (address[] memory);
function filteredCodeHashes(address addr) external returns (bytes32[] memory);
function filteredOperatorAt(address registrant, uint256 index) external returns (address);
function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
function isRegistered(address addr) external returns (bool);
function codeHashOf(address addr) external returns (bytes32);
}
文件 13 的 18:Math.sol
pragma solidity ^0.8.0;
library Math {
enum Rounding {
Down,
Up,
Zero
}
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
function average(uint256 a, uint256 b) internal pure returns (uint256) {
return (a & b) + (a ^ b) / 2;
}
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
return a == 0 ? 0 : (a - 1) / b + 1;
}
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
uint256 prod0;
uint256 prod1;
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
if (prod1 == 0) {
return prod0 / denominator;
}
require(denominator > prod1);
uint256 remainder;
assembly {
remainder := mulmod(x, y, denominator)
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
uint256 twos = denominator & (~denominator + 1);
assembly {
denominator := div(denominator, twos)
prod0 := div(prod0, twos)
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
uint256 inverse = (3 * denominator) ^ 2;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
result = prod0 * inverse;
return result;
}
}
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 result = 1 << (log2(a) >> 1);
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);
}
}
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 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;
}
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 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;
}
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
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;
}
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}
文件 14 的 18:MerkleProof.sol
pragma solidity ^0.8.0;
library MerkleProof {
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
function verifyCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
文件 15 的 18:OperatorFilterer.sol
pragma solidity ^0.8.13;
import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";
abstract contract OperatorFilterer {
error OperatorNotAllowed(address operator);
IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);
constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
if (subscribe) {
OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
} else {
if (subscriptionOrRegistrantToCopy != address(0)) {
OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
} else {
OPERATOR_FILTER_REGISTRY.register(address(this));
}
}
}
}
modifier onlyAllowedOperator(address from) virtual {
if (from != msg.sender) {
_checkFilterOperator(msg.sender);
}
_;
}
modifier onlyAllowedOperatorApproval(address operator) virtual {
_checkFilterOperator(operator);
_;
}
function _checkFilterOperator(address operator) internal view virtual {
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
revert OperatorNotAllowed(operator);
}
}
}
}
文件 16 的 18:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 17 的 18:Skelephunks.sol
pragma solidity ^0.8.17;
import "./ERC721Y.sol";
import "lib/openzeppelin-contracts/contracts/access/Ownable.sol";
import "lib/openzeppelin-contracts/contracts/utils/Strings.sol";
import "lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol";
import "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
import "lib/operator-filter-registry/src/DefaultOperatorFilterer.sol";
contract Skelephunks is ERC721Y, Ownable, DefaultOperatorFilterer {
using Address for address;
using Strings for uint256;
string public PROVENANCE;
bool provenanceSet;
mapping(address => uint256) public numMinted;
mapping(uint256 => string) private _gdToPath;
address[] public payees;
mapping(address => uint256) private paymentInfo;
uint256 totalReceived = 0;
mapping(address => uint256) amountsWithdrawn;
bool canEmergencyWithdrawTokens = true;
modifier onlyPayee() {
_isPayee();
_;
}
function _isPayee() internal view virtual {
require(paymentInfo[msg.sender] > 0, "not a payee");
}
function isPayee(address addr) public view returns (bool) {
return (paymentInfo[addr] > 0);
}
uint256 public mintPrice = 0.033 ether;
uint256 private maxPaidTokens = 10;
enum MintStatus {
PreMint,
Phunks,
AllowList,
Public,
PublicExtended,
ReserveOnly,
Finished
}
MintStatus public mintStatus = MintStatus.PreMint;
bool public paused = false;
uint256 public maxPossibleSupply = 9999;
uint256 public maxMintableSupply = 6666;
uint256 public numMintedRegular = 0;
uint256 public maxReserveSupply = 3333;
uint256 public numMintedReserve = 0;
uint256 private _maxMintsPerWallet;
string collectionDescription = "Skelephunks is a universal, adaptive PFP for the Ethereum community.";
string collectionImg = "";
string externalLink = "https://skelephunks.com";
bytes32 public phunksMerkleRoot = 0x2df951fbc5be4633d24a81d65bfa4cf92133f3ada0d2a884f39955bd22444b24;
uint256 public maxPhunkClaims = 105;
bytes32 public merkleRoot = 0xdb815420d65ef8b0dec059847253b71b167965c78bd17b5a961dc8688ded7cfd;
uint256 public maxAllowlistClaims = 1561;
mapping(address => uint256) private _claimsInfo;
mapping(address => uint256) private _claimTypes;
function phunkClaimsMade() public view returns (uint256) {
return _claimsInfo[address(0)]%(1<<128);
}
function allowlistClaimsMade() public view returns (uint256) {
return _claimsInfo[address(0)]>>128;
}
function phunkListClaimed(address addr) public view returns (bool) {
require(addr != address(0), "0");
return ((_claimsInfo[addr]%2) == 1);
}
function allowlistClaimed(address addr) public view returns (bool) {
require(addr != address(0), "0");
return ((_claimsInfo[addr]>>1) == 1);
}
mapping(address => bool) private _reserveAuths;
address public keysContract;
uint256 public keyRedemptionAmt = 3;
modifier onlyReserveAuth() {
require(getReserveAuthStatus(msg.sender), "ra");
_;
}
bool private royaltySwitch = true;
modifier onlyAllowedOperator(address from) virtual override {
if (royaltySwitch) {
if (from != msg.sender) {
_checkFilterOperator(msg.sender);
}
}
_;
}
modifier onlyAllowedOperatorApproval(address operator) virtual override {
if (royaltySwitch) {
_checkFilterOperator(operator);
}
_;
}
bool public preMintLocked = false;
constructor (
string memory name_,
string memory symbol_,
uint256 maxMintsPerWallet_,
address[] memory payees_,
uint256[] memory basisPoints_
) ERC721Y(name_, symbol_, maxPossibleSupply) {
_maxMintsPerWallet = maxMintsPerWallet_;
require(payees_.length == basisPoints_.length, "l");
payees = payees_;
for (uint256 i = 0; i < payees_.length; i++) {
paymentInfo[payees_[i]] = basisPoints_[i];
}
_gdToPath[0] = "phunk/male";
_gdToPath[1] = "phunk/female";
_gdToPath[2] = "punk/male";
_gdToPath[3] = "punk/female";
}
function flipPaused() public onlyOwner {
paused = !paused;
}
function setMintStatus(MintStatus newMintStatus) public onlyOwner {
require(newMintStatus != MintStatus.PreMint && mintStatus != MintStatus.Finished, "ms");
mintStatus = newMintStatus;
}
function preMint(
address[] calldata recipients,
uint256[] calldata numsToMint,
uint256[] calldata gds,
bool lock
) public onlyOwner {
require(!preMintLocked, "pml");
for (uint256 i = 0; i < numsToMint.length; i++) {
require(gds[i] < 4, "bad gad");
_mintMain(recipients[i], numsToMint[i], 0, gds[i], false);
}
preMintLocked = lock;
}
function min(uint256 x, uint256 y) private pure returns (uint256) {
if (x < y) {
return x;
}
return y;
}
function _mintClaimsMade(address minter) private view returns (uint256) {
return _claimTypes[minter]%(1<<128);
}
function _otherClaimsMade(address minter) private view returns (uint256) {
return _claimTypes[minter]>>128;
}
function totalClaimsMade(address minter) public view returns (uint256) {
return _mintClaimsMade(minter) + _otherClaimsMade(minter);
}
function phunkClaimsRemain() public view returns (bool) {
return (phunkClaimsMade() < maxPhunkClaims);
}
function eligibleForPhunk(
address minter,
bytes32[] calldata _proof
) public view returns (bool) {
return ((!(phunkListClaimed(minter))) && MerkleProof.verify(
_proof, phunksMerkleRoot, keccak256(abi.encodePacked(minter))
) && phunkClaimsRemain());
}
function allowlistClaimsRemain() public view returns (bool) {
return (allowlistClaimsMade() < maxAllowlistClaims);
}
function eligibleForAllowlist(
address minter,
bytes32[] calldata _proof
) public view returns (bool) {
return (MerkleProof.verify(
_proof, merkleRoot, keccak256(abi.encodePacked(minter))
) && allowlistClaimsRemain());
}
function maxMintsInternal(
address wallet,
bytes32[] calldata _phunkProof,
bytes32[] calldata _alProof
) private view returns (uint256) {
uint256 mms = maxMintableSupply;
uint256 nmr = numMintedRegular;
uint256 _mmpw = _maxMintsPerWallet;
bool efp = eligibleForPhunk(wallet, _phunkProof);
bool efal = eligibleForAllowlist(wallet, _alProof);
if (mintStatus == MintStatus.PreMint) {
return 0;
}
else if (mintStatus == MintStatus.Phunks) {
return (efp ? 1 : 0);
}
else if (mintStatus == MintStatus.AllowList) {
if (efal) {
return min(_mmpw - numMinted[wallet], mms - nmr);
}
else if (efp) { return 1; }
else { return 0; }
}
else if (mintStatus == MintStatus.Public) {
return min(_mmpw - numMinted[wallet], mms - nmr);
}
else if (mintStatus == MintStatus.PublicExtended) {
return (mms - nmr);
}
else if (mintStatus == MintStatus.ReserveOnly) {
return (efal ? 1 : 0) +
(efp ? 1 : 0);
}
return 0;
}
function maxMintsPerWallet(
address wallet,
bytes32[] calldata _phunkProof,
bytes32[] calldata _alProof
) public view returns (uint256) {
return min(100, maxMintsInternal(wallet, _phunkProof, _alProof));
}
function walletCanMint(
address wallet,
bytes32[] calldata _phunkProof,
bytes32[] calldata _alProof
) public view returns (bool) {
return (maxMintsPerWallet(wallet, _phunkProof, _alProof) > 0);
}
function _generalGetNumFree(
address wallet,
uint256 quantity,
bytes32[] calldata _phunkProof,
bytes32[] calldata _alProof
) private view returns (uint256) {
uint256 toReturn;
if (quantity == maxMintsPerWallet(wallet, _phunkProof, _alProof)) {
toReturn = 3 - _mintClaimsMade(wallet);
toReturn = min(toReturn, quantity);
}
else {
toReturn = (eligibleForPhunk(wallet, _phunkProof) ? 1 : 0) +
((eligibleForAllowlist(wallet, _alProof) && (!(allowlistClaimed(wallet)))) ? 1 : 0);
toReturn = min(toReturn, quantity);
}
return toReturn;
}
function getNumFree(
address wallet,
uint256 quantity,
bytes32[] calldata _phunkProof,
bytes32[] calldata _alProof
) public view returns (uint256) {
bool efp = eligibleForPhunk(wallet, _phunkProof);
uint256 ggnf = _generalGetNumFree(wallet, quantity, _phunkProof, _alProof);
if (mintStatus == MintStatus.PreMint) {
return 0;
}
else if (mintStatus == MintStatus.Phunks) {
return (efp ? 1 : 0);
}
else if (mintStatus == MintStatus.AllowList) {
if (eligibleForAllowlist(wallet, _alProof)) {
return ggnf;
}
else if (efp) { return 1; }
else { return 0; }
}
else if (mintStatus == MintStatus.Public || mintStatus == MintStatus.PublicExtended) {
return ggnf;
}
else if (mintStatus == MintStatus.ReserveOnly) {
return maxMintsInternal(wallet, _phunkProof, _alProof);
}
return 0;
}
function getMintCost(
address wallet,
uint256 quantity,
bytes32[] calldata _phunkProof,
bytes32[] calldata _alProof
) public view returns (uint256) {
uint256 numFree = getNumFree(wallet, quantity, _phunkProof, _alProof);
return mintPrice*(quantity - numFree);
}
function _mintMain(address _to, uint256 _quantity, uint256 _numFree, uint256 _gd, bool isReserve) private {
require(!paused, "p");
require(_gd < 4, "v");
_mintRandom(_to, _quantity, _gd);
numMinted[_to] += _quantity;
if (isReserve) {
numMintedReserve += _quantity;
}
else {
numMintedRegular += _quantity - _numFree;
numMintedReserve += _numFree;
}
if (numMintedRegular == maxMintableSupply) {
mintStatus = MintStatus.ReserveOnly;
}
if (mintStatus == MintStatus.ReserveOnly) {
if (numMintedReserve == maxReserveSupply) {
mintStatus = MintStatus.Finished;
}
}
}
function mint(
uint256 _quantity,
uint256 genderDirection,
bytes32[] calldata _phunkProof,
bytes32[] calldata _alProof
) public payable {
require(msg.sender == tx.origin, "no contracts fam");
uint256 numFree = getNumFree(msg.sender, _quantity, _phunkProof, _alProof);
require(msg.value == mintPrice*(_quantity - numFree), "poor");
require(_quantity <= maxMintsPerWallet(msg.sender, _phunkProof, _alProof), "mmpw");
require(numMintedRegular + (_quantity - numFree) <= maxMintableSupply, "mms");
require(numMintedReserve + numFree <= maxReserveSupply, "mrs");
uint256 numFreeCopy = numFree;
if (numFreeCopy > 0) {
if (eligibleForPhunk(msg.sender, _phunkProof)) {
_claimsInfo[msg.sender] += 1;
_claimTypes[msg.sender] += 1;
numFreeCopy -= 1;
_claimsInfo[address(0)] += 1;
}
}
if (numFreeCopy > 0) {
if (eligibleForAllowlist(msg.sender, _alProof) && (!allowlistClaimed(msg.sender))) {
_claimsInfo[msg.sender] += 2;
_claimTypes[msg.sender] += 1;
numFreeCopy -= 1;
_claimsInfo[address(0)] += 1<<128;
}
}
_claimTypes[msg.sender] += numFreeCopy;
totalReceived += msg.value;
_mintMain(msg.sender, _quantity, numFree, genderDirection, false);
}
function mintReserve(
address _to,
uint256 _quantity,
uint256 genderDirection
) public onlyReserveAuth {
_mintReserve(_to, _quantity, genderDirection);
}
function redeemKeyForSkelephunks(
uint256 keyId,
uint256 genderDirection
) public {
require(msg.sender == tx.origin, "no contracts fam");
_mintReserve(msg.sender, keyRedemptionAmt, genderDirection);
SkeleKeysProto(keysContract).redeemKey(keyId);
}
function _mintReserve(
address _to,
uint256 _quantity,
uint256 genderDirection
) private {
_mintMain(_to, _quantity, 0, genderDirection, true);
_claimTypes[_to] += (_quantity<<128);
}
function setMintPrice(uint256 _mintPrice) public onlyOwner {
mintPrice = _mintPrice;
}
function setMaxMintsPerWallet(uint256 __maxMintsPerWallet) public onlyOwner {
_maxMintsPerWallet = __maxMintsPerWallet;
}
function setMerkleRoots(
bytes32 _newPhunksMerkleRoot,
bytes32 _newAllowlistMerkleRoot
) public onlyOwner {
phunksMerkleRoot = _newPhunksMerkleRoot;
merkleRoot = _newAllowlistMerkleRoot;
}
function getGenderAndDirection(uint256 tokenId) public view returns (uint256) {
return gadOf(tokenId);
}
function setGenderAndDirection(uint256 tokenId, uint256 gender, uint256 direction) public {
require(gender < 2 && direction < 2, "v");
setGAD(tokenId, direction*2 + gender);
}
function setKeysContract(address keysAddr) public onlyOwner {
setReserveAuthStatus(keysContract, false);
keysContract = keysAddr;
setReserveAuthStatus(keysContract, true);
}
function setReserveAuthStatus(address addr, bool isAuthorized) public onlyOwner {
_reserveAuths[addr] = isAuthorized;
}
function getReserveAuthStatus(address addr) public view returns (bool) {
return _reserveAuths[addr];
}
function setKeyRedemptionAmt(uint256 _newAmt) public onlyOwner {
keyRedemptionAmt = _newAmt;
}
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "z");
if (bytes(_basedURI).length > 0) {
return string(
abi.encodePacked(
_basedURI, "/", _gdToPath[getGenderAndDirection(tokenId)], "/",
tokenId.toString()));
}
else {
return _preRevealURI;
}
}
function setPreRevealURI(string memory preRevealURI_) public onlyOwner {
_setPreRevealURI(preRevealURI_);
}
function setBasedURI(string memory basedURI_) public onlyOwner {
_setBasedURI(basedURI_);
}
function setProvenanceHash(string memory provenanceHash) public onlyOwner {
require(!provenanceSet);
PROVENANCE = provenanceHash;
provenanceSet = true;
}
function setApprovalForAll(
address operator,
bool approved
) public override onlyAllowedOperatorApproval(operator) {
super.setApprovalForAll(operator, approved);
}
function approve(
address operator,
uint256 tokenId
) public override onlyAllowedOperatorApproval(operator) {
super.approve(operator, tokenId);
}
function transferFrom(
address from,
address to,
uint256 tokenId
) public override onlyAllowedOperator(from) {
super.transferFrom(from, to, tokenId);
}
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public override onlyAllowedOperator(from) {
super.safeTransferFrom(from, to, tokenId);
}
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory data
) public override onlyAllowedOperator(from) {
super.safeTransferFrom(from, to, tokenId, data);
}
function setCollectionDescription(string memory _collectionDescription) public onlyOwner {
collectionDescription = _collectionDescription;
}
function setCollectionImg(string memory _collectionImg) public onlyOwner {
collectionImg = _collectionImg;
}
function setExternalLink(string memory _externalLink) public onlyOwner {
externalLink = _externalLink;
}
function contractURI() public view returns (string memory) {
return string(
abi.encodePacked(
"data:application/json;utf8,{\"name\":\"", name(),"\",",
"\"description\":\"", collectionDescription, "\",",
"\"image\":\"", collectionImg, "\",",
"\"external_link\":\"", externalLink, "\",",
"\"seller_fee_basis_points\":666,\"fee_recipient\":\"",
uint256(uint160(address(this))).toHexString(), "\"}"
)
);
}
function flipRoyaltySwitch() public onlyOwner {
royaltySwitch = !royaltySwitch;
}
receive() external payable {
totalReceived += msg.value;
}
function withdraw() public onlyPayee {
uint256 totalForPayee = (totalReceived/10000)*paymentInfo[msg.sender];
uint256 toWithdraw = totalForPayee - amountsWithdrawn[msg.sender];
amountsWithdrawn[msg.sender] = totalForPayee;
(bool success, ) = payable(msg.sender).call{value: toWithdraw}("");
require(success, "Payment failed!");
}
function emergencyWithdraw() external onlyOwner {
uint256 toWithdraw = address(this).balance;
(bool success, ) = payable(msg.sender).call{value: toWithdraw}("");
require(success, "Payment failed!");
}
function withdrawTokens(address tokenAddress) external onlyPayee {
for (uint256 i = 0; i < payees.length; i++) {
IERC20(tokenAddress).transfer(
payees[i],
(IERC20(tokenAddress).balanceOf(address(this))/10000)*paymentInfo[payees[i]]
);
}
}
function disableEWT() public onlyOwner {
canEmergencyWithdrawTokens = false;
}
function emergencyWithdrawTokens(address tokenAddress) external onlyOwner {
require(canEmergencyWithdrawTokens, "!ew");
IERC20(tokenAddress).transfer(msg.sender, IERC20(tokenAddress).balanceOf(address(this)));
}
}
abstract contract ERC721Proto {
function balanceOf(address owner) public view virtual returns (uint256);
}
abstract contract SkeleKeysProto {
function redeemKey(uint256 keyId) public virtual;
}
文件 18 的 18:Strings.sol
pragma solidity ^0.8.0;
import "./math/Math.sol";
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
{
"compilationTarget": {
"src/Skelephunks.sol": "Skelephunks"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":ds-test/=lib/operator-filter-registry/lib/forge-std/lib/ds-test/src/",
":erc4626-tests/=lib/operator-filter-registry/lib/openzeppelin-contracts/lib/erc4626-tests/",
":forge-std/=lib/operator-filter-registry/lib/forge-std/src/",
":openzeppelin-contracts-upgradeable/=lib/operator-filter-registry/lib/openzeppelin-contracts-upgradeable/contracts/",
":openzeppelin-contracts/=lib/operator-filter-registry/lib/openzeppelin-contracts/contracts/",
":operator-filter-registry/=lib/operator-filter-registry/src/"
]
}
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"maxMintsPerWallet_","type":"uint256"},{"internalType":"address[]","name":"payees_","type":"address[]"},{"internalType":"uint256[]","name":"basisPoints_","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"allowlistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistClaimsMade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistClaimsRemain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableEWT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"eligibleForAllowlist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"eligibleForPhunk","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"emergencyWithdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipRoyaltySwitch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getGenderAndDirection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_phunkProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_alProof","type":"bytes32[]"}],"name":"getMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getMintTimeByOrderIndex","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getMinterByOrderIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_phunkProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_alProof","type":"bytes32[]"}],"name":"getNumFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getReserveAuthStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isPayee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keyRedemptionAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keysContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAllowlistClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bytes32[]","name":"_phunkProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_alProof","type":"bytes32[]"}],"name":"maxMintsPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPhunkClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPossibleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReserveSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256","name":"genderDirection","type":"uint256"},{"internalType":"bytes32[]","name":"_phunkProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_alProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256","name":"genderDirection","type":"uint256"}],"name":"mintReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStatus","outputs":[{"internalType":"enum Skelephunks.MintStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintedAt","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"minterOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numMintedRegular","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numMintedReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payees","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phunkClaimsMade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phunkClaimsRemain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"phunkListClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phunksMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"numsToMint","type":"uint256[]"},{"internalType":"uint256[]","name":"gds","type":"uint256[]"},{"internalType":"bool","name":"lock","type":"bool"}],"name":"preMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"preMintLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preRevealURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"keyId","type":"uint256"},{"internalType":"uint256","name":"genderDirection","type":"uint256"}],"name":"redeemKeyForSkelephunks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"basedURI_","type":"string"}],"name":"setBasedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_collectionDescription","type":"string"}],"name":"setCollectionDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_collectionImg","type":"string"}],"name":"setCollectionImg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_externalLink","type":"string"}],"name":"setExternalLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"gender","type":"uint256"},{"internalType":"uint256","name":"direction","type":"uint256"}],"name":"setGenderAndDirection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmt","type":"uint256"}],"name":"setKeyRedemptionAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"keysAddr","type":"address"}],"name":"setKeysContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__maxMintsPerWallet","type":"uint256"}],"name":"setMaxMintsPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newPhunksMerkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"_newAllowlistMerkleRoot","type":"bytes32"}],"name":"setMerkleRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Skelephunks.MintStatus","name":"newMintStatus","type":"uint8"}],"name":"setMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"preRevealURI_","type":"string"}],"name":"setPreRevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isAuthorized","type":"bool"}],"name":"setReserveAuthStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"totalClaimsMade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bytes32[]","name":"_phunkProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_alProof","type":"bytes32[]"}],"name":"walletCanMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]