These are a fork of Zora NFT Editions with a few additions with a specific focus on NFT's with webpage content.
They are well tested in-house but they haven't been used in the wild all that much. It's advised to deploy and thoroughly test your project on mumbai first.
- Added versioning for the animation and image urls. The implementation makes use of
Versions.sol
library contract to store a history of versions - Added the project contract address to the animation url for easier querying of subgraphs from within the NFT content.
- Support interface check for
IStandardProject.sol
/ISeededProject.sol
useful for checking sales contracts. - Added two project implementations with the ability to add more.
- The projectCreator contract is upgradable
- Mumbai deployments are open for anyone to create new projects
- Polygon is currently only curated artists only
- Each version consist of an animation url, animation content hash, image url, image content hash and a version label.
- The last added version is assumed to be the latest and used for generating the metadata (this may change)
- It is still possible to update urls of a version.
- The versioning label follows the semantic versioning specification. This is to keep things neat and more easily order versions off-chain. The exact implementation uses is an array
[uint8, uint8, uint8]
limiting the max increment to 255.
An example of a version:
{
urls: [
// image
{
url: "https://url-of-thumbnail.com",,
sha256hash: "0x0000000000000000000000000000000000000000000000000000000000000000",
},
// animation
{
url: "https://url-of-live-artwork.com",
sha256hash: "0x0000000000000000000000000000000000000000000000000000000000000000"
},
// patch notes
{
url: "https://url-of-patch-notes-text-file.com",
sha256hash: "0x0000000000000000000000000000000000000000000000000000000000000000"
},
],
label: [0,0,1]
}
StandardProject
Each edition is a unique contract. This allows for easy royalty collection, clear ownership of the collection, and your own contract 🎉ProjectCreator
Gas-optimized factory contract allowing you to easily + for a low gas transaction create your own edition mintable contract.SharedNFTLogic
Contract that includes dynamic metadata generation for your editions removing the need for a centralized server. imageUrl and animationUrl can be base64-encoded data-uris for these contracts totally removing the need for IPFS
Name | Address |
---|---|
ProjectCreator_Proxy | 0x17F92AE6d8770CE4Ee689f188Bcc83e1Ab1e58d4 |
StandardProject | 0xD68FFD0b6D54EB86A083eA167aF1c9e504075fCd |
SeededProject | 0x321D8f554847bA2E0ad8fe6aF289620eedf95F67 |
SharedNFTLogic | 0x92419d3c2ce2EF407F8705cf1A85b131bBcebf01 |
Versions | 0x26a7811cd374AE3140d302F64567Af2E3c18106e |
Name | Address |
---|---|
ProjectCreator | 0x0bEc046DDbA18894088Bf4130AbD8496b8dff154 |
call createProject
with the given arguments to create a new project:
- EditionData: an object containing the following
- Name: Token Name Symbol (shows in etherscan)
- Symbol: Symbol of the Token (shows in etherscan)
- Description: Description of the Token (shows in the NFT description)
- Version: an object with the structure of the example version above
- Edition Size: Number of this edition, if set to 0 edition is not capped/limited
- BPS Royalty: 500 = 5%, 1000 = 10%, so on and so forth, set to 0 for no on-chain royalty (not supported by all marketplaces)
- Implementation: a number specificing the type of singleEditionMintable contract.
See tests for examples.
Now that you have a edition, there are multiple options for lazy-minting and sales:
- To sell editions for ETH you can call
setSalePrice
- To allow certain accounts to mint
setApprovedMinter(address, approved)
. - To mint yourself to a list of addresses you can call
mintEditions(addresses[])
to mint an edition to each address in the list.
- Full ownership of your own created minting contract
- Each serial gets its own minting contract
- Gas-optimized over creating individual NFTs
- Fully compatible with ERC721 marketplaces / auction houses / tools
- Supports tracking unique parts (edition 1 vs 24 may have different pricing implications) of editions
- Supports free public minting (by approving the 0x0 (zeroaddress) to mint)
- Supports smart-contract based minting (by approving the custom minting smart contract) using an interface.
- All metadata is stored/generated on-chain --only image/video assets are stored off-chain
- Permissionless and open-source
- Simple integrated ethereum-based sales, can be easily extended with custom interface code