编译器
0.8.17+commit.8df45f5f
文件 1 的 11: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;
}
}
文件 2 的 11:ECDSA.sol
pragma solidity ^0.8.0;
import "../Strings.sol";
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return;
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
}
}
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
}
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}
文件 3 的 11:ICoreRewarder.sol
pragma solidity ^0.8.0;
interface ICoreRewarder {
function stake(
uint256[] calldata tokenIds
) external;
function withdraw(
uint256[] calldata tokenIds
) external;
function claim(uint256[] calldata tokenIds) external;
function earned(uint256[] memory tokenIds)
external
view
returns (uint256);
function lastClaimTimesOfTokens(uint256[] memory tokenIds)
external
view
returns (uint256[] memory);
function isOwner(address owner, uint256 tokenId)
external
view
returns (bool);
function tokensOfOwner(address _owner)
external
view
returns (uint256[] memory);
function stakedTokensOfOwner(address owner)
external
view
returns (uint256[] memory);
}
文件 4 的 11:IDelegationRegistry.sol
pragma solidity ^0.8.0;
interface IDelegationRegistry {
function checkDelegateForContract(address delegate, address vault, address contract_)
external
view
returns (bool);
}
文件 5 的 11:IMetro.sol
pragma solidity ^0.8.9;
struct MetroTokenProperties {
uint256 mode;
uint256 progress;
uint256 maxProgress;
uint256 progressSeedStep;
uint256 curateCount;
bytes32 seed;
bytes32[] progressSeeds;
}
interface IMetro {
function mint(address target, uint256 count) external;
function getTokenProperties(uint256 tokenId)
external
view
returns (MetroTokenProperties memory);
}
文件 6 的 11:IMetroMinter.sol
pragma solidity ^0.8.9;
interface IMetroMinter {
function usedTheDudesTokenIds(uint256 tokenId) external view returns (bool);
function mintCountForPixelsIncAddresses(
address _address
) external view returns (uint256);
function mintCountForCollabAddresses(
address _address
) external view returns (uint256);
}
文件 7 的 11: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);
}
}
}
文件 8 的 11:MerkleProofLib.sol
pragma solidity >=0.8.0;
library MerkleProofLib {
function verify(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool isValid) {
assembly {
if proof.length {
let end := add(proof.offset, shl(5, proof.length))
let offset := proof.offset
for {} 1 {} {
let leafSlot := shl(5, gt(leaf, calldataload(offset)))
mstore(leafSlot, leaf)
mstore(xor(leafSlot, 32), calldataload(offset))
leaf := keccak256(0, 64)
offset := add(offset, 32)
if iszero(lt(offset, end)) { break }
}
}
isValid := eq(leaf, root)
}
}
}
文件 9 的 11:MetroMinterV2.sol
pragma solidity ^0.8.9;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import {MerkleProofLib} from "solmate/src/utils/MerkleProofLib.sol";
import {IMetroMinter} from "./interfaces/IMetroMinter.sol";
import {IMetro} from "./interfaces/IMetro.sol";
import {ICoreRewarder} from "./interfaces/ICoreRewarder.sol";
import {IDelegationRegistry} from "./interfaces/IDelegationRegistry.sol";
contract MetroMinterV2 is Ownable {
IMetro public immutable metro;
ICoreRewarder public immutable theDudesRewarder;
IDelegationRegistry public immutable delegationRegistry;
IMetroMinter public immutable minterV1;
bool isTheDudesMintOpen;
bool isThePixelsMintOpen;
bool isCollabMintOpen;
bool isPublicMintOpen;
address publicMintSigner = 0x305e0A36c6A43fbA881AF6dcD1e0703579a18033;
mapping(uint256 => bool) public v2usedTheDudesTokenIds;
mapping(address => uint256) public v2mintCountForPixelsIncAddresses;
mapping(address => uint256) public v2mintCountForCollabAddresses;
mapping(address => bool) public addressesForPublicMint;
bytes32 public pixelsIncMerkleProof;
bytes32 public communityMerkleProof;
error MintNotOpen();
error InvalidTheDudeOwner();
error AlreadyMinted();
error InvalidProof();
error NotEligibleForMint();
error InvalidAmount();
error InvalidSignature();
constructor(
address metroAddress,
address theDudesRewarderAddress,
address delegateRegistry,
address metroMinterV1
) {
metro = IMetro(metroAddress);
theDudesRewarder = ICoreRewarder(theDudesRewarderAddress);
delegationRegistry = IDelegationRegistry(delegateRegistry);
minterV1 = IMetroMinter(metroMinterV1);
}
function setisMintEnabled(
bool _isTheDudesMintOpen,
bool _isThePixelsMintOpen,
bool _isCollabMintOpen,
bool _isPublicMintOpen
) public onlyOwner {
isTheDudesMintOpen = _isTheDudesMintOpen;
isThePixelsMintOpen = _isThePixelsMintOpen;
isCollabMintOpen = _isCollabMintOpen;
isPublicMintOpen = _isPublicMintOpen;
}
function updatePixelsIncMerkleProof(
bytes32 _pixelsIncMerkleProof
) public onlyOwner {
pixelsIncMerkleProof = _pixelsIncMerkleProof;
}
function updateCollabMerkleProof(
bytes32 _communityMerkleProof
) public onlyOwner {
communityMerkleProof = _communityMerkleProof;
}
function updatePublicMintSigner(
address _publicMintSigner
) public onlyOwner {
publicMintSigner = _publicMintSigner;
}
function getUsedTheDudesTokenIds(
uint256 _tokenId
) public view returns (bool) {
return
minterV1.usedTheDudesTokenIds(_tokenId) ||
v2usedTheDudesTokenIds[_tokenId];
}
function getMintCountForPixelsIncAddresses(
address _address
) public view returns (uint256) {
return
minterV1.mintCountForPixelsIncAddresses(_address) +
v2mintCountForPixelsIncAddresses[_address];
}
function getMintCountForCollabAddresses(
address _address
) public view returns (uint256) {
return
minterV1.mintCountForCollabAddresses(_address) +
v2mintCountForCollabAddresses[_address];
}
function getMintAvailibility()
public
view
returns (bool, bool, bool, bool)
{
return (
isTheDudesMintOpen,
isThePixelsMintOpen,
isCollabMintOpen,
isPublicMintOpen
);
}
function getRequester(address vault) public view returns (address) {
if (vault != address(0)) {
bool isDelegateValid = delegationRegistry.checkDelegateForContract(
msg.sender,
vault,
address(this)
);
if (isDelegateValid) {
return vault;
}
}
return msg.sender;
}
function availableTheDudesForMint(
address vault
) public view returns (uint256[] memory, bool[] memory) {
address requester = getRequester(vault);
return availableTheDudesForMintWithRequester(requester);
}
function availableTheDudesForMintWithRequester(
address requester
) public view returns (uint256[] memory, bool[] memory) {
uint256[] memory theDudesTokens = theDudesRewarder.tokensOfOwner(
requester
);
bool[] memory tokenStatus = new bool[](theDudesTokens.length);
for (uint256 i; i < theDudesTokens.length; i++) {
tokenStatus[i] = getUsedTheDudesTokenIds(theDudesTokens[i]);
}
return (theDudesTokens, tokenStatus);
}
function mintWithTheDudes(
address vault,
uint256[] calldata tokenIds
) public {
if (!isTheDudesMintOpen) {
revert MintNotOpen();
}
address requester = getRequester(vault);
uint256 i;
uint256 length = tokenIds.length;
do {
uint256 tokenId = tokenIds[i];
if (!theDudesRewarder.isOwner(requester, tokenId)) {
revert InvalidTheDudeOwner();
}
if (getUsedTheDudesTokenIds(tokenId)) {
revert AlreadyMinted();
}
v2usedTheDudesTokenIds[tokenId] = true;
} while (++i < length);
metro.mint(requester, length);
}
function mintAmountForPixelInc(
address vault,
uint256 quantity,
bytes32[] calldata merkleProof
) public view returns (uint256) {
address requester = getRequester(vault);
return
mintAmountForPixelIncWithRequester(
requester,
quantity,
merkleProof
);
}
function mintAmountForPixelIncWithRequester(
address requester,
uint256 quantity,
bytes32[] calldata merkleProof
) public view returns (uint256) {
bytes32 node = keccak256(abi.encodePacked(requester, quantity));
if (!MerkleProofLib.verify(merkleProof, pixelsIncMerkleProof, node)) {
revert InvalidProof();
}
return quantity - getMintCountForPixelsIncAddresses(requester);
}
function mintWithPixelIncAddress(
address vault,
uint256 selectedQuantity,
uint256 quantity,
bytes32[] calldata merkleProof
) public {
address requester = getRequester(vault);
if (!isThePixelsMintOpen) {
revert MintNotOpen();
}
uint256 availableAmount = mintAmountForPixelIncWithRequester(
requester,
quantity,
merkleProof
);
if (availableAmount == 0) {
revert InvalidAmount();
}
if (selectedQuantity > quantity) {
revert InvalidAmount();
}
if (selectedQuantity > availableAmount) {
revert InvalidAmount();
}
v2mintCountForPixelsIncAddresses[requester] += selectedQuantity;
metro.mint(requester, selectedQuantity);
}
function mintAmountForCollab(
address vault,
uint256 quantity,
bytes32[] calldata merkleProof
) public view returns (uint256) {
address requester = getRequester(vault);
return
mintAmountForCollabWithRequester(requester, quantity, merkleProof);
}
function mintAmountForCollabWithRequester(
address requester,
uint256 quantity,
bytes32[] calldata merkleProof
) public view returns (uint256) {
bytes32 node = keccak256(abi.encodePacked(requester, quantity));
if (!MerkleProofLib.verify(merkleProof, communityMerkleProof, node)) {
revert InvalidProof();
}
return quantity - getMintCountForCollabAddresses(requester);
}
function mintWithCollabAddress(
address vault,
uint256 selectedQuantity,
uint256 quantity,
bytes32[] calldata merkleProof
) public {
address requester = getRequester(vault);
if (!isCollabMintOpen) {
revert MintNotOpen();
}
uint256 availableAmount = mintAmountForCollabWithRequester(
requester,
quantity,
merkleProof
);
if (availableAmount == 0) {
revert InvalidAmount();
}
if (selectedQuantity > quantity) {
revert InvalidAmount();
}
if (selectedQuantity > availableAmount) {
revert InvalidAmount();
}
v2mintCountForCollabAddresses[requester] += selectedQuantity;
metro.mint(requester, selectedQuantity);
}
function mint(bytes memory signature) public {
if (!isPublicMintOpen) {
revert MintNotOpen();
}
bytes32 messageHash = ECDSA.toEthSignedMessageHash(
abi.encode(msg.sender)
);
(address signer, ) = ECDSA.tryRecover(messageHash, signature);
if (signer != publicMintSigner) {
revert InvalidSignature();
}
if (addressesForPublicMint[msg.sender]) {
revert AlreadyMinted();
}
addressesForPublicMint[msg.sender] = true;
metro.mint(msg.sender, 1);
}
}
文件 10 的 11: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);
}
}
文件 11 的 11: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": {
"contracts/MetroMinterV2.sol": "MetroMinterV2"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"details": {
"constantOptimizer": true,
"cse": true,
"deduplicate": true,
"inliner": true,
"jumpdestRemover": true,
"orderLiterals": true,
"peephole": true,
"yul": false
},
"runs": 1000
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"metroAddress","type":"address"},{"internalType":"address","name":"theDudesRewarderAddress","type":"address"},{"internalType":"address","name":"delegateRegistry","type":"address"},{"internalType":"address","name":"metroMinterV1","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyMinted","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidProof","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"InvalidTheDudeOwner","type":"error"},{"inputs":[],"name":"MintNotOpen","type":"error"},{"inputs":[],"name":"NotEligibleForMint","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressesForPublicMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"availableTheDudesForMint","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"requester","type":"address"}],"name":"availableTheDudesForMintWithRequester","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"communityMerkleProof","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegationRegistry","outputs":[{"internalType":"contract IDelegationRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintAvailibility","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getMintCountForCollabAddresses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getMintCountForPixelsIncAddresses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"getRequester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getUsedTheDudesTokenIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metro","outputs":[{"internalType":"contract IMetro","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintAmountForCollab","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"requester","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintAmountForCollabWithRequester","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintAmountForPixelInc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"requester","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintAmountForPixelIncWithRequester","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"uint256","name":"selectedQuantity","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintWithCollabAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"uint256","name":"selectedQuantity","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintWithPixelIncAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mintWithTheDudes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minterV1","outputs":[{"internalType":"contract IMetroMinter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pixelsIncMerkleProof","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isTheDudesMintOpen","type":"bool"},{"internalType":"bool","name":"_isThePixelsMintOpen","type":"bool"},{"internalType":"bool","name":"_isCollabMintOpen","type":"bool"},{"internalType":"bool","name":"_isPublicMintOpen","type":"bool"}],"name":"setisMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"theDudesRewarder","outputs":[{"internalType":"contract ICoreRewarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_communityMerkleProof","type":"bytes32"}],"name":"updateCollabMerkleProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_pixelsIncMerkleProof","type":"bytes32"}],"name":"updatePixelsIncMerkleProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_publicMintSigner","type":"address"}],"name":"updatePublicMintSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"v2mintCountForCollabAddresses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"v2mintCountForPixelsIncAddresses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"v2usedTheDudesTokenIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]