Single NFT (ERC-721 1/1)
A true 1/1: one contract, one token, one URI. Mint happens during initialization and token ID is 1.
Pre-flight checklist (what the UI validates)
- Name & Symbol: required, human-readable.
- Token URI: a single, final metadata URL (e.g.
ipfs://<CID>/meta.json).
This contract does not use a base URI or numbered token paths. - Royalties (ERC-2981): recipient is non-zero and BPS ≤ 1000 (10%). Immutable after deploy.
- Platform fee: exact
feeAmountin the chain’s native coin is forwarded at initialization. - Owner wallet: injected by the NFTFactory; receives token #1 at init.
The 1/1 contract mints exactly one token during initialize. There is no presale/public sale, no per-wallet limits, and no further minting.
What the contract does (tl;dr)
- Cloneable (EIP-1167) via NFTFactory; sets owner and forwards the platform fee.
- Mints token #1 to the owner on
initializeand pins itstokenURI. - Immutable royalties via ERC-2981 (set once at init).
- Withdraw helper for any stray native coin left on the contract.
Metadata shape (example)
{
"name": "Panthart Genesis 1/1",
"description": "A unique 1/1 artwork minted via Panthart.",
"image": "ipfs://bafy.../image.png",
"animation_url": "ipfs://bafy.../video.mp4",
"attributes": [
{ "trait_type": "Edition", "value": "1/1" },
{ "trait_type": "Artist", "value": "Panth" }
]
}Step-by-step
- Prepare the metadata
Upload your JSON and media to IPFS (or another permanent store). Verify the file resolves quickly.
- Initialize via Factory
Enter Name, Symbol, Token URI, Royalty recipient + BPS, and confirm the platform fee transaction.
On success, the contract emits SingleInitialized and immediately mints token #1 to you (emits SingleMinted).
- Verify & showcase
Open the token page. Ensure the image/animation loads from your Token URI and traits render as intended.
- List for sale (optional)
Create a fixed-price listing or start an auction on the marketplace.
Reference (functions & events)
Init
initialize(SingleConfig cfg) — payable; sets royalties, forwards fee, mints token #1 to owner.
Views
tokenURI(uint256 tokenId) → string (reverts unless tokenId == 1) ·
supportsInterface(bytes4) → bool (ERC-721 + ERC-2981)
Admin
withdraw(address payable to) — owner only (withdraw any residual native coin)
Events
SingleInitialized(owner, name, symbol) · SingleMinted(to, tokenId, uri)