Avenumhood
0x94270ba613507cdf4292b3c0c703cc5acc18069e
Verification
Verified
v0.8.17+commit.8df45f5f
Type
Contract
17,031 bytes
ABI entries
100
24 read · 30 write
License
none
Contract information
- Address
- 0x94270ba613507cdf4292b3c0c703cc5acc18069e
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.17+commit.8df45f5f
- Optimization
- Enabled
- Creator
- 0x9Cd0619803…Becb526e81
- Creation tx
- 0x04cc6e3bf6…856c8bf985
Token
- Name
- Avenumhood
- Symbol
- AVMH
- Decimals
- —
- Holders
- 765
- Market
- View token page →
Read contract (24)
balanceOf(address) → uint256
baseURI() → string
contractURI() → string
getApproved(uint256) → address
getMintStats(address) → uint256, uint256, uint256
getTransferValidationFunction() → bytes4, bool
getTransferValidator() → address
isApprovedForAll(address, address) → bool
maxSupply() → uint256
name() → string
owner() → address
ownerOf(uint256) → address
provenanceHash() → bytes32
renderer() → address
revealSeed() → bytes32
revealed() → bool
royaltyAddress() → address
royaltyBasisPoints() → uint256
royaltyInfo(uint256, uint256) → address, uint256
supportsInterface(bytes4) → bool
symbol() → string
tokenSeed(uint256) → bytes32
tokenURI(uint256) → string
totalSupply() → uint256
Events (16)
AllowedSeaDropUpdatedApprovalApprovalForAllBatchMetadataUpdateConsecutiveTransferContractURIUpdatedMaxSupplyUpdatedOwnershipTransferredPotentialOwnerUpdatedProvenanceHashUpdatedRendererUpdatedRevealedRoyaltyInfoUpdatedSeaDropTokenDeployedTransferTransferValidatorUpdated
ABI
[
{
"inputs": [
{
"internalType": "string",
"name": "name_",
"type": "string"
},
{
"internalType": "string",
"name": "symbol_",
"type": "string"
},
{
"internalType": "address",
"name": "renderer_",
"type": "address"
},
{
"internalType": "address[]",
"name": "allowedSeaDrop",
"type": "address[]"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "AlreadyInitialized",
"type": "error"
},
{
"inputs": [],
"name": "AlreadyRevealed",
"type": "error"
},
{
"inputs": [],
"name": "ApprovalCallerNotOwnerNorApproved",
"type": "error"
},
{
"inputs": [],
"name": "ApprovalQueryForNonexistentToken",
"type": "error"
},
{
"inputs": [],
"name": "BalanceQueryForZeroAddress",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newMaxSupply",
"type": "uint256"
}
],
"name": "CannotExceedMaxSupplyOfUint64",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "basisPoints",
"type": "uint256"
}
],
"name": "InvalidRoyaltyBasisPoints",
"type": "error"
},
{
"inputs": [],
"name": "MintERC2309QuantityExceedsLimit",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "total",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxSupply",
"type": "uint256"
}
],
"name": "MintQuantityExceedsMaxSupply",
"type": "error"
},
{
"inputs": [],
"name": "MintToZeroAddress",
"type": "error"
},
{
"inputs": [],
"name": "MintZeroQuantity",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "got",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalMinted",
"type": "uint256"
}
],
"name": "NewMaxSupplyCannotBeLessThenTotalMinted",
"type": "error"
},
{
"inputs": [],
"name": "NewOwnerIsZeroAddress",
"type": "error"
},
{
"inputs": [],
"name": "NotNextOwner",
"type": "error"
},
{
"inputs": [],
"name": "OnlyAllowedSeaDrop",
"type": "error"
},
{
"inputs": [],
"name": "OnlyOwner",
"type": "error"
},
{
"inputs": [],
"name": "OwnerQueryForNonexistentToken",
"type": "error"
},
{
"inputs": [],
"name": "OwnershipNotInitializedForExtraData",
"type": "error"
},
{
"inputs": [],
"name": "ProvenanceHashCannotBeSetAfterMintStarted",
"type": "error"
},
{
"inputs": [],
"name": "RendererMissing",
"type": "error"
},
{
"inputs": [],
"name": "RoyaltyAddressCannotBeZeroAddress",
"type": "error"
},
{
"inputs": [],
"name": "SameTransferValidator",
"type": "error"
},
{
"inputs": [],
"name": "SignersMismatch",
"type": "error"
},
{
"inputs": [],
"name": "TokenGatedMismatch",
"type": "error"
},
{
"inputs": [],
"name": "TransferCallerNotOwnerNorApproved",
"type": "error"
},
{
"inputs": [],
"name": "TransferFromIncorrectOwner",
"type": "error"
},
{
"inputs": [],
"name": "TransferToNonERC721ReceiverImplementer",
"type": "error"
},
{
"inputs": [],
"name": "TransferToZeroAddress",
"type": "error"
},
{
"inputs": [],
"name": "URIQueryForNonexistentToken",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address[]",
"name": "allowedSeaDrop",
"type": "address[]"
}
],
"name": "AllowedSeaDropUpdated",
"type": "event"
},
{
"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": "uint256",
"name": "_fromTokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "_toTokenId",
"type": "uint256"
}
],
"name": "BatchMetadataUpdate",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "fromTokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "toTokenId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "ConsecutiveTransfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "newContractURI",
"type": "string"
}
],
"name": "ContractURIUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "newMaxSupply",
"type": "uint256"
}
],
"name": "MaxSupplyUpdated",
"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": false,
"internalType": "address",
"name": "newPotentialAdministrator",
"type": "address"
}
],
"name": "PotentialOwnerUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "bytes32",
"name": "previousHash",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "newHash",
"type": "bytes32"
}
],
"name": "ProvenanceHashUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "renderer",
"type": "address"
}
],
"name": "RendererUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "bytes32",
"name": "seed",
"type": "bytes32"
}
],
"name": "Revealed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "receiver",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "bps",
"type": "uint256"
}
],
"name": "RoyaltyInfoUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "SeaDropTokenDeployed",
"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"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "oldValidator",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "newValidator",
"type": "address"
}
],
"name": "TransferValidatorUpdated",
"type": "event"
},
{
"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": "baseURI",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "burn",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "cancelOwnershipTransfer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "contractURI",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "fromTokenId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "toTokenId",
"type": "uint256"
}
],
"name": "emitBatchMetadataUpdate",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getApproved",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "minter",
"type": "address"
}
],
"name": "getMintStats",
"outputs": [
{
"internalType": "uint256",
"name": "minterNumMinted",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "currentTotalSupply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxSupply",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getTransferValidationFunction",
"outputs": [
{
"internalType": "bytes4",
"name": "functionSignature",
"type": "bytes4"
},
{
"internalType": "bool",
"name": "isViewFunction",
"type": "bool"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [],
"name": "getTransferValidator",
"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": [],
"name": "maxSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "minter",
"type": "address"
},
{
"internalType": "uint256",
"name": "quantity",
"type": "uint256"
}
],
"name": "mintSeaDrop",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "uint256",
"name": "maxSupply",
"type": "uint256"
},
{
"internalType": "string",
"name": "baseURI",
"type": "string"
},
{
"internalType": "string",
"name": "contractURI",
"type": "string"
},
{
"internalType": "address",
"name": "seaDropImpl",
"type": "address"
},
{
"components": [
{
"internalType": "uint80",
"name": "mintPrice",
"type": "uint80"
},
{
"internalType": "uint48",
"name": "startTime",
"type": "uint48"
},
{
"internalType": "uint48",
"name": "endTime",
"type": "uint48"
},
{
"internalType": "uint16",
"name": "maxTotalMintableByWallet",
"type": "uint16"
},
{
"internalType": "uint16",
"name": "feeBps",
"type": "uint16"
},
{
"internalType": "bool",
"name": "restrictFeeRecipients",
"type": "bool"
}
],
"internalType": "struct PublicDrop",
"name": "publicDrop",
"type": "tuple"
},
{
"internalType": "string",
"name": "dropURI",
"type": "string"
},
{
"components": [
{
"internalType": "bytes32",
"name": "merkleRoot",
"type": "bytes32"
},
{
"internalType": "string[]",
"name": "publicKeyURIs",
"type": "string[]"
},
{
"internalType": "string",
"name": "allowListURI",
"type": "string"
}
],
"internalType": "struct AllowListData",
"name": "allowListData",
"type": "tuple"
},
{
"internalType": "address",
"name": "creatorPayoutAddress",
"type": "address"
},
{
"internalType": "bytes32",
"name": "provenanceHash",
"type": "bytes32"
},
{
"internalType": "address[]",
"name": "allowedFeeRecipients",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "disallowedFeeRecipients",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "allowedPayers",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "disallowedPayers",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "tokenGatedAllowedNftTokens",
"type": "address[]"
},
{
"components": [
{
"internalType": "uint80",
"name": "mintPrice",
"type": "uint80"
},
{
"internalType": "uint16",
"name": "maxTotalMintableByWallet",
"type": "uint16"
},
{
"internalType": "uint48",
"name": "startTime",
"type": "uint48"
},
{
"internalType": "uint48",
"name": "endTime",
"type": "uint48"
},
{
"internalType": "uint8",
"name": "dropStageIndex",
"type": "uint8"
},
{
"internalType": "uint32",
"name": "maxTokenSupplyForStage",
"type": "uint32"
},
{
"internalType": "uint16",
"name": "feeBps",
"type": "uint16"
},
{
"internalType": "bool",
"name": "restrictFeeRecipients",
"type": "bool"
}
],
"internalType": "struct TokenGatedDropStage[]",
"name": "tokenGatedDropStages",
"type": "tuple[]"
},
{
"internalType": "address[]",
"name": "disallowedTokenGatedAllowedNftTokens",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "signers",
"type": "address[]"
},
{
"components": [
{
"internalType": "uint80",
"name": "minMintPrice",
"type": "uint80"
},
{
"internalType": "uint24",
"name": "maxMaxTotalMintableByWallet",
"type": "uint24"
},
{
"internalType": "uint40",
"name": "minStartTime",
"type": "uint40"
},
{
"internalType": "uint40",
"name": "maxEndTime",
"type": "uint40"
},
{
"internalType": "uint40",
"name": "maxMaxTokenSupplyForStage",
"type": "uint40"
},
{
"internalType": "uint16",
"name": "minFeeBps",
"type": "uint16"
},
{
"internalType": "uint16",
"name": "maxFeeBps",
"type": "uint16"
}
],
"internalType": "struct SignedMintValidationParams[]",
"name": "signedMintValidationParams",
"type": "tuple[]"
},
{
"internalType": "address[]",
"name": "disallowedSigners",
"type": "address[]"
}
],
"internalType": "struct ERC721SeaDropStructsErrorsAndEvents.MultiConfigureStruct",
"name": "config",
"type": "tuple"
}
],
"name": "multiConfigure",
"outputs": [],
"stateMutability": "nonpayable",
"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": [],
"name": "provenanceHash",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renderer",
"outputs": [
{
"internalType": "contract IAvenumhoodRenderer",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "reveal",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "revealSeed",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "revealed",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "royaltyAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "royaltyBasisPoints",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_salePrice",
"type": "uint256"
}
],
"name": "royaltyInfo",
"outputs": [
{
"internalType": "address",
"name": "receiver",
"type": "address"
},
{
"internalType": "uint256",
"name": "royaltyAmount",
"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": "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": "string",
"name": "newContractURI",
"type": "string"
}
],
"name": "setContractURI",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newMaxSupply",
"type": "uint256"
}
],
"name": "setMaxSupply",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "newProvenanceHash",
"type": "bytes32"
}
],
"name": "setProvenanceHash",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "renderer_",
"type": "address"
}
],
"name": "setRenderer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "royaltyAddress",
"type": "address"
},
{
"internalType": "uint96",
"name": "royaltyBps",
"type": "uint96"
}
],
"internalType": "struct ISeaDropTokenContractMetadata.RoyaltyInfo",
"name": "newInfo",
"type": "tuple"
}
],
"name": "setRoyaltyInfo",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newValidator",
"type": "address"
}
],
"name": "setTransferValidator",
"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": "tokenId",
"type": "uint256"
}
],
"name": "tokenSeed",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"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": "newPotentialOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "seaDropImpl",
"type": "address"
},
{
"components": [
{
"internalType": "bytes32",
"name": "merkleRoot",
"type": "bytes32"
},
{
"internalType": "string[]",
"name": "publicKeyURIs",
"type": "string[]"
},
{
"internalType": "string",
"name": "allowListURI",
"type": "string"
}
],
"internalType": "struct AllowListData",
"name": "allowListData",
"type": "tuple"
}
],
"name": "updateAllowList",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "seaDropImpl",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipient",
"type": "address"
},
{
"internalType": "bool",
"name": "allowed",
"type": "bool"
}
],
"name": "updateAllowedFeeRecipient",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "allowedSeaDrop",
"type": "address[]"
}
],
"name": "updateAllowedSeaDrop",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "seaDropImpl",
"type": "address"
},
{
"internalType": "address",
"name": "payoutAddress",
"type": "address"
}
],
"name": "updateCreatorPayoutAddress",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "seaDropImpl",
"type": "address"
},
{
"internalType": "string",
"name": "dropURI",
"type": "string"
}
],
"name": "updateDropURI",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "seaDropImpl",
"type": "address"
},
{
"internalType": "address",
"name": "payer",
"type": "address"
},
{
"internalType": "bool",
"name": "allowed",
"type": "bool"
}
],
"name": "updatePayer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "seaDropImpl",
"type": "address"
},
{
"components": [
{
"internalType": "uint80",
"name": "mintPrice",
"type": "uint80"
},
{
"internalType": "uint48",
"name": "startTime",
"type": "uint48"
},
{
"internalType": "uint48",
"name": "endTime",
"type": "uint48"
},
{
"internalType": "uint16",
"name": "maxTotalMintableByWallet",
"type": "uint16"
},
{
"internalType": "uint16",
"name": "feeBps",
"type": "uint16"
},
{
"internalType": "bool",
"name": "restrictFeeRecipients",
"type": "bool"
}
],
"internalType": "struct PublicDrop",
"name": "publicDrop",
"type": "tuple"
}
],
"name": "updatePublicDrop",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "seaDropImpl",
"type": "address"
},
{
"internalType": "address",
"name": "signer",
"type": "address"
},
{
"components": [
{
"internalType": "uint80",
"name": "minMintPrice",
"type": "uint80"
},
{
"internalType": "uint24",
"name": "maxMaxTotalMintableByWallet",
"type": "uint24"
},
{
"internalType": "uint40",
"name": "minStartTime",
"type": "uint40"
},
{
"internalType": "uint40",
"name": "maxEndTime",
"type": "uint40"
},
{
"internalType": "uint40",
"name": "maxMaxTokenSupplyForStage",
"type": "uint40"
},
{
"internalType": "uint16",
"name": "minFeeBps",
"type": "uint16"
},
{
"internalType": "uint16",
"name": "maxFeeBps",
"type": "uint16"
}
],
"internalType": "struct SignedMintValidationParams",
"name": "signedMintValidationParams",
"type": "tuple"
}
],
"name": "updateSignedMintValidationParams",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "seaDropImpl",
"type": "address"
},
{
"internalType": "address",
"name": "allowedNftToken",
"type": "address"
},
{
"components": [
{
"internalType": "uint80",
"name": "mintPrice",
"type": "uint80"
},
{
"internalType": "uint16",
"name": "maxTotalMintableByWallet",
"type": "uint16"
},
{
"internalType": "uint48",
"name": "startTime",
"type": "uint48"
},
{
"internalType": "uint48",
"name": "endTime",
"type": "uint48"
},
{
"internalType": "uint8",
"name": "dropStageIndex",
"type": "uint8"
},
{
"internalType": "uint32",
"name": "maxTokenSupplyForStage",
"type": "uint32"
},
{
"internalType": "uint16",
"name": "feeBps",
"type": "uint16"
},
{
"internalType": "bool",
"name": "restrictFeeRecipients",
"type": "bool"
}
],
"internalType": "struct TokenGatedDropStage",
"name": "dropStage",
"type": "tuple"
}
],
"name": "updateTokenGatedDrop",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]Source code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import {ERC721SeaDrop} from "seadrop/ERC721SeaDrop.sol";
import {ERC721A} from "ERC721A/ERC721A.sol";
interface IAvenumhoodRenderer {
function tokenURI(uint256 tokenId, bytes32 seed) external view returns (string memory);
}
/**
* AVENUMHOOD
* ==============================================================
* Open-edition pixel faces. Fully on-chain art + metadata.
* Mints directly on OpenSea via SeaDrop.
*
* Every token is a unique face, generated on-chain from a
* per-token seed derived from a global reveal seed + tokenId.
* Before reveal, all tokens show a placeholder. After the owner
* calls reveal(), the global seed is locked in and every face
* appears at once — unique and deterministic forever.
*
* No fusion. No levels. No engine. Just regular tokens.
* ==============================================================
*/
contract Avenumhood is ERC721SeaDrop {
bytes4 internal constant ERC4906_INTERFACE_ID = 0x49064906;
IAvenumhoodRenderer public renderer;
// Global reveal seed: 0 = not revealed yet
bytes32 public revealSeed;
bool public revealed;
event RendererUpdated(address indexed renderer);
event Revealed(bytes32 seed);
error RendererMissing();
error AlreadyRevealed();
constructor(
string memory name_,
string memory symbol_,
address renderer_,
address[] memory allowedSeaDrop
)
ERC721SeaDrop(name_, symbol_, allowedSeaDrop)
{
renderer = IAvenumhoodRenderer(renderer_);
}
// ============================================================
// SEED (per token)
// ============================================================
/// Deterministic unique seed per token, derived from the global
/// reveal seed and the tokenId. Stable forever once revealed.
function tokenSeed(uint256 tokenId) public view returns (bytes32) {
return keccak256(abi.encodePacked(revealSeed, tokenId));
}
// ============================================================
// tokenURI
// ============================================================
function tokenURI(uint256 tokenId) public view override returns (string memory) {
if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
if (address(renderer) == address(0)) revert RendererMissing();
// Before reveal: seed is derived from revealSeed=0 (placeholder look).
// After reveal: unique per-token seed.
bytes32 seed = revealed ? tokenSeed(tokenId) : bytes32(0);
return renderer.tokenURI(tokenId, seed);
}
// ============================================================
// ADMIN
// ============================================================
/// Lock in the global reveal seed. One-time, irreversible.
/// Uses on-chain entropy at the moment of reveal.
function reveal() external onlyOwner {
if (revealed) revert AlreadyRevealed();
revealSeed = keccak256(
abi.encodePacked(
block.difficulty,
block.timestamp,
blockhash(block.number - 1),
address(this)
)
);
revealed = true;
emit Revealed(revealSeed);
// tell marketplaces all metadata changed
if (_totalMinted() > 0) {
emit BatchMetadataUpdate(_startTokenId(), _totalMinted());
}
}
function setRenderer(address renderer_) external onlyOwner {
renderer = IAvenumhoodRenderer(renderer_);
emit RendererUpdated(renderer_);
if (_totalMinted() > 0) {
emit BatchMetadataUpdate(_startTokenId(), _totalMinted());
}
}
function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId);
}
}
Chain explorer4091msChain node95ms