编译器
0.8.19+commit.7dd6d404
文件 1 的 21: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 的 21:Constants.sol
pragma solidity ^0.8.13;
address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;
文件 3 的 21: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;
}
}
文件 4 的 21:Counters.sol
pragma solidity ^0.8.0;
library Counters {
struct Counter {
uint256 _value;
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
文件 5 的 21:DefaultOperatorFilterer.sol
pragma solidity ^0.8.13;
import {OperatorFilterer} from "./OperatorFilterer.sol";
import {CANONICAL_CORI_SUBSCRIPTION} from "./lib/Constants.sol";
abstract contract DefaultOperatorFilterer is OperatorFilterer {
constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}
文件 6 的 21: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;
}
}
文件 7 的 21:ERC721.sol
pragma solidity ^0.8.0;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
string private _name;
string private _symbol;
mapping(uint256 => address) private _owners;
mapping(address => uint256) private _balances;
mapping(uint256 => address) private _tokenApprovals;
mapping(address => mapping(address => bool)) private _operatorApprovals;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _ownerOf(tokenId);
require(owner != address(0), "ERC721: invalid token ID");
return owner;
}
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) {
_requireMinted(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
function _baseURI() internal view virtual returns (string memory) {
return "";
}
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner or approved for all"
);
_approve(to, tokenId);
}
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), 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 {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_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 {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_safeTransfer(from, to, tokenId, data);
}
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
}
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _ownerOf(tokenId) != address(0);
}
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
function _safeMint(
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId, 1);
require(!_exists(tokenId), "ERC721: token already minted");
unchecked {
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId, 1);
}
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId, 1);
owner = ERC721.ownerOf(tokenId);
delete _tokenApprovals[tokenId];
unchecked {
_balances[owner] -= 1;
}
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId, 1);
}
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId, 1);
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
delete _tokenApprovals[tokenId];
unchecked {
_balances[from] -= 1;
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId, 1);
}
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
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.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
function _beforeTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual {}
function _afterTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual {}
function __unsafe_increaseBalance(address account, uint256 amount) internal {
_balances[account] += amount;
}
}
文件 8 的 21:ERC721Enumerable.sol
pragma solidity ^0.8.0;
import "../ERC721.sol";
import "./IERC721Enumerable.sol";
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
mapping(uint256 => uint256) private _ownedTokensIndex;
uint256[] private _allTokens;
mapping(uint256 => uint256) private _allTokensIndex;
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
function _beforeTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual override {
super._beforeTokenTransfer(from, to, firstTokenId, batchSize);
if (batchSize > 1) {
revert("ERC721Enumerable: consecutive transfers not supported");
}
uint256 tokenId = firstTokenId;
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId;
_ownedTokensIndex[lastTokenId] = tokenIndex;
}
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId;
_allTokensIndex[lastTokenId] = tokenIndex;
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
}
文件 9 的 21:EnumerableSet.sol
pragma solidity ^0.8.0;
library EnumerableSet {
struct Set {
bytes32[] _values;
mapping(bytes32 => uint256) _indexes;
}
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 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastValue = set._values[lastIndex];
set._values[toDeleteIndex] = lastValue;
set._indexes[lastValue] = valueIndex;
}
set._values.pop();
delete set._indexes[value];
return true;
} else {
return false;
}
}
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
struct Bytes32Set {
Set _inner;
}
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
assembly {
result := store
}
return result;
}
struct AddressSet {
Set _inner;
}
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
struct UintSet {
Set _inner;
}
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}
文件 10 的 21:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 11 的 21: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);
}
文件 12 的 21: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);
}
文件 13 的 21: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);
}
文件 14 的 21:IERC721Receiver.sol
pragma solidity ^0.8.0;
interface IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
文件 15 的 21: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);
}
文件 16 的 21: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);
}
}
}
文件 17 的 21:OperatorFilterer.sol
pragma solidity ^0.8.13;
import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";
import {CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS} from "./lib/Constants.sol";
abstract contract OperatorFilterer {
error OperatorNotAllowed(address operator);
IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);
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);
}
}
}
}
文件 18 的 21: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);
}
}
文件 19 的 21:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
}
function _nonReentrantAfter() private {
_status = _NOT_ENTERED;
}
}
文件 20 的 21: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);
}
}
文件 21 的 21:babydragon-erc721.sol
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "operator-filter-registry/src/DefaultOperatorFilterer.sol";
contract BabyDragon is ERC721Enumerable, Ownable, ReentrancyGuard, DefaultOperatorFilterer {
uint256 public MAX_SUPPLY = 1111;
string private baseURI;
uint256 public publicMintPrice = 60;
bool public publicMintEnabled = true;
uint256[] public alphaBabyList10p;
uint256[] public alphaBabyList25p;
mapping(address => uint256) public publicMinted;
constructor(string memory uri) ERC721("BabyDragon", "BabyDragon") {
baseURI = uri;
isEpic[620] = true;
isEpic[707] = true;
isEpic[741] = true;
isEpic[913] = true;
isEpic[1012] = true;
isEpic[1172] = true;
isEpic[1246] = true;
isEpic[1256] = true;
isEpic[1271] = true;
isEpic[1526] = true;
isEpic[1705] = true;
isEpic[3023] = true;
isEpic[3555] = true;
isEpic[4104] = true;
isEpic[4105] = true;
isEpic[4164] = true;
isEpic[4251] = true;
isEpic[4640] = true;
isEpic[4704] = true;
isEpic[4904] = true;
isEpic[5061] = true;
isEpic[5233] = true;
isEpic[5248] = true;
isEpic[5825] = true;
isEpic[6491] = true;
isNormal[21] = true;
isNormal[28] = true;
isNormal[51] = true;
isNormal[73] = true;
isNormal[88] = true;
isNormal[92] = true;
isNormal[98] = true;
isNormal[101] = true;
isNormal[113] = true;
isNormal[155] = true;
isNormal[166] = true;
isNormal[203] = true;
isNormal[221] = true;
isNormal[222] = true;
isNormal[274] = true;
isNormal[296] = true;
isNormal[335] = true;
isNormal[360] = true;
isNormal[401] = true;
isNormal[410] = true;
isNormal[459] = true;
isNormal[519] = true;
isNormal[547] = true;
isNormal[596] = true;
isNormal[603] = true;
isNormal[635] = true;
isNormal[679] = true;
isNormal[690] = true;
isNormal[747] = true;
isNormal[755] = true;
isNormal[757] = true;
isNormal[786] = true;
isNormal[789] = true;
isNormal[813] = true;
isNormal[826] = true;
isNormal[868] = true;
isNormal[883] = true;
isNormal[905] = true;
isNormal[908] = true;
isNormal[923] = true;
isNormal[963] = true;
isNormal[975] = true;
isNormal[1000] = true;
isNormal[1005] = true;
isNormal[1013] = true;
isNormal[1072] = true;
isNormal[1092] = true;
isNormal[1154] = true;
isNormal[1158] = true;
isNormal[1165] = true;
isNormal[1166] = true;
isNormal[1167] = true;
isNormal[1175] = true;
isNormal[1182] = true;
isNormal[1216] = true;
isNormal[1219] = true;
isNormal[1237] = true;
isNormal[1252] = true;
isNormal[1272] = true;
isNormal[1273] = true;
isNormal[1274] = true;
isNormal[1284] = true;
isNormal[1306] = true;
isNormal[1334] = true;
isNormal[1359] = true;
isNormal[1367] = true;
isNormal[1397] = true;
isNormal[1404] = true;
isNormal[1410] = true;
isNormal[1424] = true;
isNormal[1425] = true;
isNormal[1463] = true;
isNormal[1475] = true;
isNormal[1489] = true;
isNormal[1522] = true;
isNormal[1534] = true;
isNormal[1539] = true;
isNormal[1555] = true;
isNormal[1571] = true;
isNormal[1575] = true;
isNormal[1579] = true;
isNormal[1623] = true;
isNormal[1625] = true;
isNormal[1639] = true;
isNormal[1719] = true;
isNormal[1772] = true;
isNormal[1775] = true;
isNormal[1781] = true;
isNormal[1823] = true;
isNormal[1829] = true;
isNormal[1846] = true;
isNormal[1852] = true;
isNormal[1865] = true;
isNormal[1901] = true;
isNormal[1920] = true;
isNormal[1922] = true;
isNormal[1927] = true;
isNormal[1936] = true;
isNormal[1991] = true;
isNormal[1992] = true;
isNormal[2004] = true;
isNormal[2008] = true;
isNormal[2029] = true;
isNormal[2046] = true;
isNormal[2067] = true;
isNormal[2074] = true;
isNormal[2106] = true;
isNormal[2150] = true;
isNormal[2173] = true;
isNormal[2182] = true;
isNormal[2184] = true;
isNormal[2268] = true;
isNormal[2275] = true;
isNormal[2315] = true;
isNormal[2320] = true;
isNormal[2322] = true;
isNormal[2328] = true;
isNormal[2357] = true;
isNormal[2395] = true;
isNormal[2396] = true;
isNormal[2399] = true;
isNormal[2404] = true;
isNormal[2405] = true;
isNormal[2409] = true;
isNormal[2452] = true;
isNormal[2454] = true;
isNormal[2475] = true;
isNormal[2477] = true;
isNormal[2479] = true;
isNormal[2536] = true;
isNormal[2538] = true;
isNormal[2600] = true;
isNormal[2656] = true;
isNormal[2657] = true;
isNormal[2669] = true;
isNormal[2705] = true;
isNormal[2712] = true;
isNormal[2733] = true;
isNormal[2734] = true;
isNormal[2761] = true;
isNormal[2772] = true;
isNormal[2839] = true;
isNormal[2842] = true;
isNormal[2845] = true;
isNormal[2866] = true;
isNormal[2875] = true;
isNormal[2879] = true;
isNormal[2883] = true;
isNormal[2890] = true;
isNormal[2891] = true;
isNormal[2923] = true;
isNormal[2940] = true;
isNormal[2998] = true;
isNormal[2999] = true;
isNormal[3027] = true;
isNormal[3036] = true;
isNormal[3041] = true;
isNormal[3114] = true;
isNormal[3129] = true;
isNormal[3140] = true;
isNormal[3151] = true;
isNormal[3208] = true;
isNormal[3249] = true;
isNormal[3261] = true;
isNormal[3334] = true;
isNormal[3343] = true;
isNormal[3361] = true;
isNormal[3368] = true;
isNormal[3374] = true;
isNormal[3404] = true;
isNormal[3432] = true;
isNormal[3460] = true;
isNormal[3554] = true;
isNormal[3588] = true;
isNormal[3595] = true;
isNormal[3660] = true;
isNormal[3724] = true;
isNormal[3770] = true;
isNormal[3814] = true;
isNormal[3826] = true;
isNormal[3838] = true;
isNormal[3848] = true;
isNormal[3852] = true;
isNormal[3855] = true;
isNormal[3895] = true;
isNormal[3909] = true;
isNormal[3950] = true;
isNormal[3959] = true;
isNormal[3965] = true;
isNormal[4006] = true;
isNormal[4008] = true;
isNormal[4057] = true;
isNormal[4126] = true;
isNormal[4161] = true;
isNormal[4166] = true;
isNormal[4192] = true;
isNormal[4212] = true;
isNormal[4223] = true;
isNormal[4254] = true;
isNormal[4261] = true;
isNormal[4272] = true;
isNormal[4285] = true;
isNormal[4311] = true;
isNormal[4315] = true;
isNormal[4324] = true;
isNormal[4335] = true;
isNormal[4346] = true;
isNormal[4387] = true;
isNormal[4409] = true;
isNormal[4453] = true;
isNormal[4488] = true;
isNormal[4490] = true;
isNormal[4495] = true;
isNormal[4500] = true;
isNormal[4514] = true;
isNormal[4518] = true;
isNormal[4569] = true;
isNormal[4591] = true;
isNormal[4614] = true;
isNormal[4619] = true;
isNormal[4657] = true;
isNormal[4773] = true;
isNormal[4774] = true;
isNormal[4787] = true;
isNormal[4809] = true;
isNormal[4850] = true;
isNormal[4863] = true;
isNormal[4864] = true;
isNormal[4887] = true;
isNormal[4890] = true;
isNormal[4891] = true;
isNormal[4913] = true;
isNormal[4954] = true;
isNormal[4965] = true;
isNormal[4981] = true;
isNormal[5003] = true;
isNormal[5038] = true;
isNormal[5053] = true;
isNormal[5066] = true;
isNormal[5069] = true;
isNormal[5075] = true;
isNormal[5103] = true;
isNormal[5161] = true;
isNormal[5174] = true;
isNormal[5175] = true;
isNormal[5194] = true;
isNormal[5234] = true;
isNormal[5238] = true;
isNormal[5254] = true;
isNormal[5269] = true;
isNormal[5277] = true;
isNormal[5304] = true;
isNormal[5318] = true;
isNormal[5322] = true;
isNormal[5378] = true;
isNormal[5392] = true;
isNormal[5447] = true;
isNormal[5478] = true;
isNormal[5494] = true;
isNormal[5503] = true;
isNormal[5515] = true;
isNormal[5535] = true;
isNormal[5610] = true;
isNormal[5623] = true;
isNormal[5666] = true;
isNormal[5699] = true;
isNormal[5700] = true;
isNormal[5716] = true;
isNormal[5719] = true;
isNormal[5734] = true;
isNormal[5744] = true;
isNormal[5804] = true;
isNormal[5862] = true;
isNormal[5874] = true;
isNormal[5879] = true;
isNormal[5886] = true;
isNormal[5891] = true;
isNormal[5918] = true;
isNormal[5962] = true;
isNormal[5999] = true;
isNormal[6022] = true;
isNormal[6066] = true;
isNormal[6091] = true;
isNormal[6103] = true;
isNormal[6110] = true;
isNormal[6115] = true;
isNormal[6149] = true;
isNormal[6172] = true;
isNormal[6205] = true;
isNormal[6215] = true;
isNormal[6262] = true;
isNormal[6289] = true;
isNormal[6319] = true;
isNormal[6342] = true;
isNormal[6383] = true;
isNormal[6392] = true;
isNormal[6394] = true;
isNormal[6397] = true;
isNormal[6455] = true;
isNormal[6464] = true;
isNormal[6470] = true;
isNormal[6493] = true;
isNormal[6511] = true;
isNormal[6517] = true;
isNormal[6559] = true;
isNormal[6595] = true;
isNormal[6627] = true;
isNormal[6702] = true;
isNormal[6710] = true;
isNormal[6712] = true;
isNormal[6779] = true;
isNormal[6783] = true;
isNormal[6792] = true;
isNormal[6807] = true;
isNormal[6830] = true;
isNormal[6840] = true;
isNormal[6868] = true;
isNormal[6897] = true;
isNormal[6922] = true;
isNormal[1961] = true;
isNormal[2377] = true;
isNormal[291] = true;
isNormal[3536] = true;
isNormal[4063] = true;
isNormal[4181] = true;
isNormal[4288] = true;
isNormal[452] = true;
isNormal[4826] = true;
isNormal[4987] = true;
isNormal[5597] = true;
isNormal[6132] = true;
isNormal[6142] = true;
isNormal[6338] = true;
isNormal[950] = true;
}
function _baseURI() internal view override returns (string memory) {
return baseURI;
}
function setBaseURI(string memory newBaseURI) external onlyOwner {
baseURI = newBaseURI;
}
function setMaxSupply(uint256 newMaxSupply) public onlyOwner {
require(newMaxSupply != MAX_SUPPLY, "Same value as current max supply");
require(newMaxSupply >= totalSupply(), "Value lower than total supply");
MAX_SUPPLY = newMaxSupply;
}
function togglePublicMint() external onlyOwner {
publicMintEnabled = !publicMintEnabled;
}
function setPublicMintPrice(uint256 newPrice) external onlyOwner {
publicMintPrice = newPrice;
}
function getTokenIDs(address addr) external view returns (uint256[] memory) {
uint256 total = totalSupply();
uint256 count = balanceOf(addr);
uint256[] memory tokens = new uint256[](count);
uint256 tokenIndex = 0;
for (uint256 i; i < total; i++) {
if (addr == ownerOf(i)) {
tokens[tokenIndex] = i;
tokenIndex++;
}
}
return tokens;
}
function airDrop(address[] calldata recipient, uint256[] calldata quantity) external onlyOwner {
require(quantity.length == recipient.length, "Please provide equal quantities and recipients");
uint256 totalQuantity = 0;
uint256 supply = totalSupply();
for (uint256 i = 0; i < quantity.length; ++i) {
totalQuantity += quantity[i];
}
require(supply + totalQuantity <= MAX_SUPPLY, "Not enough supply");
delete totalQuantity;
for (uint256 i = 0; i < recipient.length; ++i) {
for (uint256 j = 0; j < quantity[i]; ++j) {
_safeMint(recipient[i], supply++);
}
}
}
function publicMint(uint256 amount) external nonReentrant {
uint256 totalMinted = totalSupply();
require(publicMintEnabled, "Public mint not enabled");
require(amount * publicMintPrice <= burnPoints[_msgSender()], "More Points please");
require(amount + totalMinted <= MAX_SUPPLY, "Please try minting with less, not enough supply!");
burnPoints[_msgSender()] = burnPoints[_msgSender()] - (amount * publicMintPrice);
bulkMint(_msgSender(), amount);
publicMinted[_msgSender()] += amount;
}
function bulkMint(address creator, uint batchSize) internal returns (bool) {
require(batchSize > 0, "MintZeroQuantity()");
uint256 totalMinted = totalSupply();
for (uint i = 0; i < batchSize; i++) {
uint256 tokenId = totalMinted + i;
if (alphaBaby25p[_msgSender()] > 0) {
alphaBaby25p[_msgSender()] = alphaBaby25p[_msgSender()] - 1;
alphaBabyList25p.push(tokenId);
} else if (alphaBaby10p[_msgSender()] > 0) {
alphaBaby10p[_msgSender()] = alphaBaby10p[_msgSender()] - 1;
alphaBabyList10p.push(tokenId);
}
_safeMint(creator, tokenId);
}
return true;
}
function setApprovalForAll(address operator, bool approved) public override(ERC721, IERC721) onlyAllowedOperatorApproval(operator) {
super.setApprovalForAll(operator, approved);
}
function approve(address operator, uint256 tokenId) public override(ERC721, IERC721) onlyAllowedOperatorApproval(operator) {
super.approve(operator, tokenId);
}
function transferFrom(address from, address to, uint256 tokenId) public override(ERC721, IERC721) onlyAllowedOperator(from) {
super.transferFrom(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId) public override(ERC721, IERC721) onlyAllowedOperator(from) {
super.safeTransferFrom(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override(ERC721, IERC721) onlyAllowedOperator(from) {
super.safeTransferFrom(from, to, tokenId, data);
}
address public PRIME_APE_CONTRACT = 0x6632a9d63E142F17a668064D41A21193b49B41a0;
address public PRIME_KONG_CONTRACT = 0x5845E5F0571427D0ce33550587961262CA8CDF5C;
address public PRIME_INFECTED_CONTRACT = 0xFD8917a36f76c4DA9550F26DB2faaaA242d6AE2c;
address public PRIME_DRAGON_CONTRACT = 0x3B81f59B921eD8E037c4F12E631fb7c46D821138;
address public BURN_WALLET = 0x000000000000000000000000000000000000dEaD;
function setContractAddress(address a1, address a2, address a3, address a4, address a5) external onlyOwner {
PRIME_DRAGON_CONTRACT = a1;
PRIME_APE_CONTRACT = a2;
PRIME_KONG_CONTRACT = a3;
PRIME_INFECTED_CONTRACT = a4;
BURN_WALLET = a5;
}
using Counters for Counters.Counter;
using EnumerableSet for EnumerableSet.AddressSet;
using EnumerableSet for EnumerableSet.UintSet;
event Burn(address contractAddress, uint256 tokenId, address owner);
bool public burnPhase1Enabled = true;
bool public burnBulkEnabled = false;
mapping(address => mapping(address => EnumerableSet.UintSet)) private addressToBurnedTokensSet;
mapping(address => mapping(uint256 => address)) private contractTokenIdToOwner;
mapping(address => mapping(uint256 => uint256)) private contractTokenIdToBurnedTimestamp;
mapping(address => uint256) public burnPoints;
mapping(address => uint256) public alphaBaby10p;
mapping(address => uint256) public alphaBaby25p;
mapping(uint => bool) public isEpic;
mapping(uint => bool) public isNormal;
function toggleBurnPhase1() external onlyOwner {
burnPhase1Enabled = !burnPhase1Enabled;
}
function toggleBurnBulk() external onlyOwner {
burnBulkEnabled = !burnBulkEnabled;
}
function burnPhase1(uint256[] memory dragonIds) external nonReentrant {
require(burnPhase1Enabled, "phase 1 burn not enabled");
for (uint256 i = 0; i < dragonIds.length; i++) {
uint256 tokenId = dragonIds[i];
if (isEpic[tokenId]) {
alphaBaby25p[_msgSender()] = alphaBaby25p[_msgSender()] + 1;
} else if (isNormal[tokenId]) {
alphaBaby10p[_msgSender()] = alphaBaby10p[_msgSender()] + 1;
} else {
revert("Not Epic or Normal Dragon with Baby.");
}
contractTokenIdToOwner[PRIME_DRAGON_CONTRACT][tokenId] = _msgSender();
IERC721(PRIME_DRAGON_CONTRACT).transferFrom(_msgSender(), BURN_WALLET, tokenId);
addressToBurnedTokensSet[PRIME_DRAGON_CONTRACT][_msgSender()].add(tokenId);
contractTokenIdToBurnedTimestamp[PRIME_DRAGON_CONTRACT][tokenId] = block.timestamp;
burnPoints[_msgSender()] = burnPoints[_msgSender()] + 60;
emit Burn(PRIME_DRAGON_CONTRACT, tokenId, _msgSender());
}
}
function burnBulk(uint256[] memory dragonIds, uint256[] memory apeIds, uint256[] memory kongIds, uint256[] memory infectedIds) external nonReentrant {
require(burnBulkEnabled, "bulk burn not enabled");
for (uint256 i = 0; i < dragonIds.length; i++) {
uint256 tokenId = dragonIds[i];
contractTokenIdToOwner[PRIME_DRAGON_CONTRACT][tokenId] = _msgSender();
IERC721(PRIME_DRAGON_CONTRACT).transferFrom(_msgSender(), BURN_WALLET, tokenId);
addressToBurnedTokensSet[PRIME_DRAGON_CONTRACT][_msgSender()].add(tokenId);
contractTokenIdToBurnedTimestamp[PRIME_DRAGON_CONTRACT][tokenId] = block.timestamp;
burnPoints[_msgSender()] = burnPoints[_msgSender()] + 8;
emit Burn(PRIME_DRAGON_CONTRACT, tokenId, _msgSender());
}
for (uint256 i = 0; i < apeIds.length; i++) {
uint256 tokenId = apeIds[i];
contractTokenIdToOwner[PRIME_APE_CONTRACT][tokenId] = _msgSender();
IERC721(PRIME_APE_CONTRACT).transferFrom(_msgSender(), BURN_WALLET, tokenId);
addressToBurnedTokensSet[PRIME_APE_CONTRACT][_msgSender()].add(tokenId);
contractTokenIdToBurnedTimestamp[PRIME_APE_CONTRACT][tokenId] = block.timestamp;
burnPoints[_msgSender()] = burnPoints[_msgSender()] + 12;
emit Burn(PRIME_APE_CONTRACT, tokenId, _msgSender());
}
for (uint256 i = 0; i < kongIds.length; i++) {
uint256 tokenId = kongIds[i];
contractTokenIdToOwner[PRIME_KONG_CONTRACT][tokenId] = _msgSender();
IERC721(PRIME_KONG_CONTRACT).transferFrom(_msgSender(), BURN_WALLET, tokenId);
addressToBurnedTokensSet[PRIME_KONG_CONTRACT][_msgSender()].add(tokenId);
contractTokenIdToBurnedTimestamp[PRIME_KONG_CONTRACT][tokenId] = block.timestamp;
burnPoints[_msgSender()] = burnPoints[_msgSender()] + 6;
emit Burn(PRIME_KONG_CONTRACT, tokenId, _msgSender());
}
for (uint256 i = 0; i < infectedIds.length; i++) {
uint256 tokenId = infectedIds[i];
contractTokenIdToOwner[PRIME_INFECTED_CONTRACT][tokenId] = _msgSender();
IERC721(PRIME_INFECTED_CONTRACT).transferFrom(_msgSender(), BURN_WALLET, tokenId);
addressToBurnedTokensSet[PRIME_INFECTED_CONTRACT][_msgSender()].add(tokenId);
contractTokenIdToBurnedTimestamp[PRIME_INFECTED_CONTRACT][tokenId] = block.timestamp;
if (tokenId > 7979) {
burnPoints[_msgSender()] = burnPoints[_msgSender()] + 10;
} else {
burnPoints[_msgSender()] = burnPoints[_msgSender()] + 5;
}
emit Burn(PRIME_INFECTED_CONTRACT, tokenId, _msgSender());
}
}
function burnedTokensOfOwner(address contractAddress, address owner) external view returns (uint256[] memory) {
EnumerableSet.UintSet storage userTokens = addressToBurnedTokensSet[contractAddress][owner];
uint256[] memory tokenIds = new uint256[](userTokens.length());
for (uint256 i = 0; i < userTokens.length(); i++) {
tokenIds[i] = userTokens.at(i);
}
return tokenIds;
}
function burnedTokenOwner(address contractAddress, uint256 tokenId) external view returns (address) {
return contractTokenIdToOwner[contractAddress][tokenId];
}
function burnedTokenTimestamp(address contractAddress, uint256 tokenId) external view returns (uint256) {
return contractTokenIdToBurnedTimestamp[contractAddress][tokenId];
}
function alphaBabyList10pView() external view returns (uint256[] memory) {
return alphaBabyList10p;
}
function alphaBabyList25pView() external view returns (uint256[] memory) {
return alphaBabyList25p;
}
}
{
"compilationTarget": {
"contracts/babydragon-erc721.sol": "BabyDragon"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"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":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"Burn","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":"BURN_WALLET","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIME_APE_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIME_DRAGON_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIME_INFECTED_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIME_KONG_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipient","type":"address[]"},{"internalType":"uint256[]","name":"quantity","type":"uint256[]"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"alphaBaby10p","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"alphaBaby25p","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"alphaBabyList10p","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alphaBabyList10pView","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"alphaBabyList25p","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alphaBabyList25pView","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[{"internalType":"uint256[]","name":"dragonIds","type":"uint256[]"},{"internalType":"uint256[]","name":"apeIds","type":"uint256[]"},{"internalType":"uint256[]","name":"kongIds","type":"uint256[]"},{"internalType":"uint256[]","name":"infectedIds","type":"uint256[]"}],"name":"burnBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnBulkEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"dragonIds","type":"uint256[]"}],"name":"burnPhase1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnPhase1Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"burnPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnedTokenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnedTokenTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"burnedTokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getTokenIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"uint256","name":"","type":"uint256"}],"name":"isEpic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isNormal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a1","type":"address"},{"internalType":"address","name":"a2","type":"address"},{"internalType":"address","name":"a3","type":"address"},{"internalType":"address","name":"a4","type":"address"},{"internalType":"address","name":"a5","type":"address"}],"name":"setContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPublicMintPrice","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":[],"name":"toggleBurnBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleBurnPhase1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicMint","outputs":[],"stateMutability":"nonpayable","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":[],"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"}]