maxEpochSupply = 1_000 (not 10,000)Pausable, Ownable, role-based MINTER_ROLEredeemed boolean) for the coaching utility (or point the flag to the registry—see Layer B)Purpose: The source of truth across all epochs and standards.
Stores:
Global maxSupply = 10,000 (sum across all future drops)
Mint accounting per contract (contract → count)
Redemption status for any token (contractAddress, tokenId → redeemed/when/where)
(so even 1155/4907/6551 assets can mark a coaching hour as used)
Redemption window (2035–2050) and guards
Exposes:
markRedeemed(address tokenContract, uint256 tokenId),
isRedeemed(tokenContract, tokenId),
globalSupplyUsed(), remaining()
Access control: only approved epoch contracts (and the Foundation) can mark redemption.
Upgrade pattern: if you want flexibility, make the Registry UUPS-upgradeable; keep drop contracts non-upgradeable.
With this split, the epoch drop contracts stay dumb and safe; the Registry is the only piece you may ever need to evolve.
You could deploy one ERC-721 with maxSupply = 10_000 and mint by tranches per epoch. But:
Net: a Registry + multiple epoch/pack contracts is cleaner, safer, and more future-proof.