Package nftminter is a single-collection GRC721 NFT minter realm.
Minting is public -- anyone can call MintAssembled, no allowlist, no curation. Every mint randomly assembles a small trait selection (traitPreset) from on-chain rosters (chainRoster, gemsart's ShapeNames/MetalNames/stone color palettes) and calls gemsart to render the actual image on every read -- storage cost is dominated by gemsart's own one-time deployment, not by how many tokens exist. No owner curation step, no preset pool, and no way for anyone -- including the collection owner -- to choose, influence, or later change what a token looks like once minted: no function in this realm can rewrite a token's traits, image, or attributes after the fact. Metadata is stored fully on-chain per token, following the OpenSea metadata standard.
An earlier version of this realm also shipped a second, owner-curated mint path (Mint/AddPresetToken, plus owner-only metadata-editing functions) for hand-authored art instead of on-the-fly assembly. Removed entirely, not just left unused -- a curated, editable path sitting next to the fair-random one invited a reasonable question ("could the owner just hand themselves something hand-picked through that?") that no amount of the pool being empty could fully answer just by reading the deployed bytecode. See git history if a future collection wants it back.
Uniqueness + reveal: MintAssembled retries with a fresh random draw on collision against an already-minted combination (see assembleUniqueTraits) -- chain state is publicly readable, so this alone doesn't stop someone computing in advance what a future draw might land on. What actually prevents sniping a specific outcome is the delayed reveal: each token's real name/image/attributes stay sealed behind a shared placeholder for RevealDelayBlocks blocks after mint, so nobody -- including the minter -- can see what they got until reveal, with one narrow exception: burning a token reconstructs and exposes its real traits immediately (see Burn), since burning is only ever available to that token's own current owner and destroys it in the same step.
Migration/provenance: every token carries an original-chain/original-token-id/original-mint-height record (Provenance). AddMigrationSnapshotEntry + AdminDeliverMigrated let the owner carry a previous chain's holder list forward onto a new deployment while preserving that provenance -- administrator-only end to end, and a migrated token's new id is always its original token's id, never drawn from nextID (see AddMigrationBurnGap for how an already-burned original index stays reserved too).
The realm's public functions deliberately mirror the standard GRC721 shape (Mint/OwnerOf/TokenURI/SafeTransferFrom/BalanceOf/...) so that tooling built against any GRC721 collection -- a marketplace, an explorer/observer -- can interact with this one without special-casing it. See gno.land/p/g1gn6t0q9wenwhdda47rkrpfd63kcxjvyp7eqwku/grc721 for the underlying token implementation.