NyroNFT
0xbaa97c9c01ec31d3317e7eda77303647e5046bc5
Verification
Verified
v0.8.28+commit.7893614a
Type
Contract
8,473 bytes
ABI entries
81
32 read · 15 write
License
mit
Contract information
- Address
- 0xbaa97c9c01ec31d3317e7eda77303647e5046bc5
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.28+commit.7893614a
- Optimization
- Enabled
- Creator
- 0x5cDAd9BBC1…899D004211
- Creation tx
- 0x16c593421f…894a2f1527
Token
- Name
- Nyro
- Symbol
- NYRO
- Decimals
- —
- Holders
- 913
- Market
- View token page →
Read contract (32)
DEFAULT_MINT_PRICE() → uint256
HARD_MAX_SUPPLY() → uint256
MAX_PER_TX() → uint256
MAX_SUPPLY() → uint256
TOKEN_REWARD_PER_NFT() → uint256
balanceOf(address) → uint256
collectionSeed() → bytes32
contractURI() → string
getApproved(uint256) → address
isApprovedForAll(address, address) → bool
mintCost(uint256) → uint256
mintOpen() → bool
mintPrice() → uint256
mintedByWallet(address) → uint256
name() → string
owner() → address
ownerOf(uint256) → address
pendingOwner() → address
remainingSupply() → uint256
renderer() → address
rewardToken() → address
seedOf(uint256) → bytes32
supportsInterface(bytes4) → bool
symbol() → string
tokenByIndex(uint256) → uint256
tokenOfOwnerByIndex(address, uint256) → uint256
tokenRewardFor(uint256) → uint256
tokenSVG(uint256) → string
tokenURI(uint256) → string
totalMinted() → uint256
totalSupply() → uint256
walletOfOwner(address) → uint256[]
Events (12)
ApprovalApprovalForAllFundsWithdrawnMaxSupplyChangedMintPriceChangedMintStatusChangedMintedOwnerMintedOwnershipTransferStartedOwnershipTransferredTokenRewardDistributedTransfer
ABI
[
{
"inputs": [
{
"internalType": "address",
"name": "initialOwner",
"type": "address"
},
{
"internalType": "contract NyroRenderer",
"name": "renderer_",
"type": "address"
},
{
"internalType": "contract NyroToken",
"name": "rewardToken_",
"type": "address"
},
{
"internalType": "bytes32",
"name": "collectionSeed_",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "initialMaxSupply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "initialMintPrice",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "ERC721EnumerableForbiddenBatchMint",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "ERC721IncorrectOwner",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "ERC721InsufficientApproval",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "approver",
"type": "address"
}
],
"name": "ERC721InvalidApprover",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
}
],
"name": "ERC721InvalidOperator",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "ERC721InvalidOwner",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "receiver",
"type": "address"
}
],
"name": "ERC721InvalidReceiver",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "ERC721InvalidSender",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "ERC721NonexistentToken",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "ERC721OutOfBoundsIndex",
"type": "error"
},
{
"inputs": [],
"name": "IncorrectPayment",
"type": "error"
},
{
"inputs": [],
"name": "InvalidAmount",
"type": "error"
},
{
"inputs": [],
"name": "InvalidQuantity",
"type": "error"
},
{
"inputs": [],
"name": "InvalidSupply",
"type": "error"
},
{
"inputs": [],
"name": "MintClosed",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "OwnableInvalidOwner",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "OwnableUnauthorizedAccount",
"type": "error"
},
{
"inputs": [],
"name": "ReentrancyGuardReentrantCall",
"type": "error"
},
{
"inputs": [],
"name": "SoldOut",
"type": "error"
},
{
"inputs": [],
"name": "TransferFailed",
"type": "error"
},
{
"inputs": [],
"name": "ZeroAddress",
"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": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "FundsWithdrawn",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "oldSupply",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "newSupply",
"type": "uint256"
}
],
"name": "MaxSupplyChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "oldPrice",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "newPrice",
"type": "uint256"
}
],
"name": "MintPriceChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "bool",
"name": "isOpen",
"type": "bool"
}
],
"name": "MintStatusChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "minter",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "firstTokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "quantity",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "paid",
"type": "uint256"
}
],
"name": "Minted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "firstTokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "quantity",
"type": "uint256"
}
],
"name": "OwnerMinted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferStarted",
"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": "recipient",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "nftQuantity",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "tokenAmount",
"type": "uint256"
}
],
"name": "TokenRewardDistributed",
"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": "DEFAULT_MINT_PRICE",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "HARD_MAX_SUPPLY",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "MAX_PER_TX",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "MAX_SUPPLY",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "TOKEN_REWARD_PER_NFT",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "acceptOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"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": "collectionSeed",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "contractURI",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"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": "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": "quantity",
"type": "uint256"
}
],
"name": "mint",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "quantity",
"type": "uint256"
}
],
"name": "mintCost",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "mintOpen",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "mintPrice",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "mintedByWallet",
"outputs": [
{
"internalType": "uint256",
"name": "quantity",
"type": "uint256"
}
],
"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": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "quantity",
"type": "uint256"
}
],
"name": "ownerMint",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "ownerOf",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pendingOwner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "remainingSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renderer",
"outputs": [
{
"internalType": "contract NyroRenderer",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "rewardToken",
"outputs": [
{
"internalType": "contract NyroToken",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"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": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "seedOf",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "setApprovalForAll",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newMaxSupply",
"type": "uint256"
}
],
"name": "setMaxSupply",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "isOpen",
"type": "bool"
}
],
"name": "setMintOpen",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newPrice",
"type": "uint256"
}
],
"name": "setMintPrice",
"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": "quantity",
"type": "uint256"
}
],
"name": "tokenRewardFor",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "tokenSVG",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"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": "totalMinted",
"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": "account",
"type": "address"
}
],
"name": "walletOfOwner",
"outputs": [
{
"internalType": "uint256[]",
"name": "tokenIds",
"type": "uint256[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address payable",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "withdrawTo",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]Source code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import {ERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {Base64} from "@openzeppelin/contracts/utils/Base64.sol";
import {NyroRenderer} from "./NyroRenderer.sol";
import {NyroToken} from "./NyroToken.sol";
/// @title Nyro
/// @notice 10,000 fully onchain, instant-reveal, black-and-lime pixel portraits on Robinhood Chain.
contract NyroNFT is ERC721Enumerable, Ownable2Step, ReentrancyGuard {
uint256 public constant HARD_MAX_SUPPLY = 10_000;
uint256 public constant DEFAULT_MINT_PRICE = 0.0001 ether;
uint256 public constant MAX_PER_TX = 10;
uint256 public constant TOKEN_REWARD_PER_NFT = 1_000 ether;
NyroRenderer public immutable renderer;
NyroToken public immutable rewardToken;
bytes32 public immutable collectionSeed;
uint256 public MAX_SUPPLY;
uint256 public mintPrice;
bool public mintOpen;
/// @notice Cumulative mint statistics only. This counter never limits future mints.
mapping(address account => uint256 quantity) public mintedByWallet;
error MintClosed();
error InvalidQuantity();
error IncorrectPayment();
error SoldOut();
error ZeroAddress();
error InvalidAmount();
error InvalidSupply();
error TransferFailed();
event Minted(address indexed minter, uint256 indexed firstTokenId, uint256 quantity, uint256 paid);
event OwnerMinted(address indexed to, uint256 indexed firstTokenId, uint256 quantity);
event MintStatusChanged(bool isOpen);
event MintPriceChanged(uint256 oldPrice, uint256 newPrice);
event MaxSupplyChanged(uint256 oldSupply, uint256 newSupply);
event FundsWithdrawn(address indexed to, uint256 amount);
event TokenRewardDistributed(address indexed recipient, uint256 nftQuantity, uint256 tokenAmount);
constructor(
address initialOwner,
NyroRenderer renderer_,
NyroToken rewardToken_,
bytes32 collectionSeed_,
uint256 initialMaxSupply,
uint256 initialMintPrice
)
ERC721("Nyro", "NYRO")
Ownable(initialOwner)
{
if (initialOwner == address(0) || address(renderer_) == address(0) || address(rewardToken_) == address(0)) revert ZeroAddress();
if (initialMaxSupply == 0 || initialMaxSupply > HARD_MAX_SUPPLY) revert InvalidSupply();
renderer = renderer_;
rewardToken = rewardToken_;
collectionSeed = collectionSeed_;
MAX_SUPPLY = initialMaxSupply;
mintPrice = initialMintPrice;
}
function mint(uint256 quantity) external payable nonReentrant {
if (!mintOpen) revert MintClosed();
_validateMint(quantity);
if (msg.value != mintPrice * quantity) revert IncorrectPayment();
uint256 firstTokenId = totalSupply() + 1;
_mintBatch(msg.sender, quantity);
emit Minted(msg.sender, firstTokenId, quantity, msg.value);
}
/// @notice Owner airdrop/reserve mint. Maximum 10 NFTs per transaction; no recipient wallet cap.
function ownerMint(address to, uint256 quantity) external onlyOwner nonReentrant {
if (to == address(0)) revert ZeroAddress();
_validateMint(quantity);
uint256 firstTokenId = totalSupply() + 1;
_mintBatch(to, quantity);
emit OwnerMinted(to, firstTokenId, quantity);
}
function setMintOpen(bool isOpen) external onlyOwner {
mintOpen = isOpen;
emit MintStatusChanged(isOpen);
}
function setMintPrice(uint256 newPrice) external onlyOwner {
uint256 oldPrice = mintPrice;
mintPrice = newPrice;
emit MintPriceChanged(oldPrice, newPrice);
}
/// @notice Changes the active collection cap without ever exceeding the audited 10,000 hard cap.
/// @dev The new cap cannot be lower than the number of NFTs already minted.
function setMaxSupply(uint256 newMaxSupply) external onlyOwner {
if (newMaxSupply == 0 || newMaxSupply > HARD_MAX_SUPPLY || newMaxSupply < totalSupply()) revert InvalidSupply();
uint256 oldSupply = MAX_SUPPLY;
MAX_SUPPLY = newMaxSupply;
emit MaxSupplyChanged(oldSupply, newMaxSupply);
}
function withdraw() external onlyOwner nonReentrant {
_withdrawTo(payable(owner()), address(this).balance);
}
function withdrawTo(address payable to, uint256 amount) external onlyOwner nonReentrant {
_withdrawTo(to, amount);
}
function tokenURI(uint256 tokenId) public view override returns (string memory) {
_requireOwned(tokenId);
return renderer.tokenURI(tokenId, seedOf(tokenId));
}
function tokenSVG(uint256 tokenId) external view returns (string memory) {
_requireOwned(tokenId);
return renderer.svg(tokenId, seedOf(tokenId));
}
function seedOf(uint256 tokenId) public view returns (bytes32) {
return keccak256(abi.encodePacked(collectionSeed, tokenId, address(this), block.chainid));
}
function totalMinted() external view returns (uint256) {
return totalSupply();
}
function remainingSupply() external view returns (uint256) {
return MAX_SUPPLY - totalSupply();
}
function mintCost(uint256 quantity) external view returns (uint256) {
return mintPrice * quantity;
}
function tokenRewardFor(uint256 quantity) external pure returns (uint256) {
return TOKEN_REWARD_PER_NFT * quantity;
}
function walletOfOwner(address account) external view returns (uint256[] memory tokenIds) {
uint256 count = balanceOf(account);
tokenIds = new uint256[](count);
for (uint256 i; i < count; ++i) {
tokenIds[i] = tokenOfOwnerByIndex(account, i);
}
}
function contractURI() external view returns (string memory) {
bytes32 previewSeed = keccak256("NYRO_COLLECTION_PREVIEW");
string memory image = string.concat(
"data:image/svg+xml;base64,",
Base64.encode(bytes(renderer.svg(1, previewSeed)))
);
bytes memory json = abi.encodePacked(
'{"name":"Nyro","description":"Fully onchain, instant-reveal, black-and-lime pixel portraits on Robinhood Chain.",',
'"image":"', image, '"}'
);
return string.concat("data:application/json;base64,", Base64.encode(json));
}
function _mintBatch(address to, uint256 quantity) internal {
mintedByWallet[to] += quantity;
uint256 start = totalSupply() + 1;
for (uint256 i; i < quantity; ++i) {
_safeMint(to, start + i);
}
uint256 tokenAmount = TOKEN_REWARD_PER_NFT * quantity;
rewardToken.mintReward(to, tokenAmount);
emit TokenRewardDistributed(to, quantity, tokenAmount);
}
function _validateMint(uint256 quantity) internal view {
if (quantity == 0 || quantity > MAX_PER_TX) revert InvalidQuantity();
if (totalSupply() + quantity > MAX_SUPPLY) revert SoldOut();
}
function _withdrawTo(address payable to, uint256 amount) internal {
if (to == address(0)) revert ZeroAddress();
if (amount == 0 || amount > address(this).balance) revert InvalidAmount();
(bool ok,) = to.call{value: amount}("");
if (!ok) revert TransferFailed();
emit FundsWithdrawn(to, amount);
}
function _increaseBalance(address account, uint128 value)
internal
override(ERC721Enumerable)
{
super._increaseBalance(account, value);
}
}
Chain explorer4605msChain node77ms