Our project's main goal is to enable people to create their own Dynamic NFT Collections.
These collections can be used for any use case, such as: Games, Art, etc.
To be able to demonstrate the power of our idea, we created a Product named Frankie.
Our inspiration came from Frankenstein, as you can define the different parts your NFT will have as part of the Collection creation.
Our product Frankie is divided into 3 categories: Collection Creations, Ghouls Shop and Surf Game.
The ‘Collection Creations’ is the UI that lets the user define which Traits their NFT will have and automate the creation and deployment of the smart contracts needed to create these dynamic NFTs.
To start a Collection you need first to login in our product, make sure your wallet is connect, and click in Create a new Frankie button on the ‘Creations’ menu
After clicking you will be redirected to our Lab, and be able to start customizing your Frankie:
Here you will give a name to your collection, select the block chain you want it to be deployed (For now only Avalanche Fuji is supported), and define what will be the Price of your NFT.
Here you will also find an advanced section:
This section contains fields that for now are blocked, but are also part of the collection.
The future idea is to allow users to have more freedom on their creation.
The integration hostname for example is the address the Collection will use as the base domain for its URI operations. For example, the GetURI method of the NFT will use this hostname as base and attach /GetTokenURI to the end. This link will be used by external sites like OpenSea to retrieve the NFTs information. For now we use our own server as a Proxy, always getting the information directly from the blockchain. In the future the idea will be to make it customizable so users can use their own logic or external providers like IPFS.
The NFT dimensions represent the size of the canvas your appearance traits will have.
It means that all your images need to use these dimensions as the ViewBox they will be on.
This is to ensure all the layers are correctly positioned when merged. For the time being we are locking the NFT size to always be a square of W 500 x H 500. In the future this is something that will be customizable.
Once you define all the needed fields and click on ‘Start Mutating’ you will be prompt to sign a message using metamask:
This will be used to define the ownership of your collection.
After you sign it, you will redirected to a new screen:
Here you will be able to define which traits the NFTs of this Collection will have.
You can create 4 different types of traits: Appearance, Option, Range and Label.
To add a new trait of a given type, select the tab of the trait you want to add, and click on the ‘Add new ‘Trait type’ trait’ button on the top right:
The appearance traits are traits that have a visual representation on the NFT.
Once you click on the Add button you will be able to define its details:
First you need to define the trait name. In this example we want to add the body of our NFT. So we will define the name as ‘Body’.
Then, you can define if this trait is Optional or not. And in case it is optional you need to define the chance it has of appearing when you mint an NFT:
When an End User mints a NFT, the smart contract will use the VRF Chain Link product to get a random number, and use this random number and the ‘Chance of Appearing’ field to determine if the trait will be present in the NFT. (The VRF interactions will be explained later on this doc)
The fields: ‘Trait Name’, ‘Optional Trait’ and ‘Chance of Appearing’ are common to all trait types and follow the same structure and rules.
For the Appearance trait type specifically, you can also define the different options it will have.
To add a new option click on the ‘Add new option’ link, and you will be able to define the options details:
You can add as many options as you want, and each option will have an image, a name and also an appearing chance.
The ‘Option Image’ is the image this option will have on the NFT when it’s minted and it needs to be an SVG, with 500 x 500 dimensions. The choice of using an SVG at this point was simply to allow css customizations in web games, like animations or effects. In the future the plan is to allow different image extensions such as PNG.
The ‘Option Name’ is the value the trait will have on the minted NFT.
The option ‘Appearing Chance’ is how likely this option will appear on a minted NFT compared to the other options. All the options ‘Appearing Chances’ summed up needs to have a total value of 100%.
For example, in this case we have 2 options for the Body trait: ‘Blue Body’ and ‘Yellow Body’.
Both will have the same chance of appearing, so each one’s ‘Appearing Chance’ is 50%:
When an End User mints a NFT, the smart contract will use the VRF Chain Link product to get a random number, and use this random number and the ‘Appearing Chance’ field to determine what option will be present in the NFT. (The VRF interactions will be explained later on this doc)
Once you define your options and click save, you will see it on the left list. You will also see a preview of a possible NFT on the right:
To give a better idea, we will also add some wings and eye appearance traits to our demo collection. It should look like this:
You will notice that the wings are on top of the body. To fix that you can use the arrows on the left to chance the order of the traits:
An ‘Option’ trait is very similar to an ‘Appearance’ trait. The only difference is that it doesn’t have an image:
If creating an NFT for a game for example, you could use it to define what would be the character class. If the NFT will be a Warrior or a Mage, for instance:
Once you add your options and save, you will also see them on the NFT preview:
A ‘Range’ trait, is a number that will be between a range. For example, if using an NFT for a game, you could have a ‘Range’ trait called Strength that would have a value between 10 and 40:
When an End User mints a NFT, the smart contract will use the VRF Chain Link product to get a random number, and use this random number and the defined range to determine the value of the trait that will be present in the NFT. (The VRF interactions will be explained later in this doc).
A ‘Label’ trait is as simple as a static field. This type is not random and will always have the same value.
You can use it if you need to define a specific address, link or string:
Finally, after you defined all the traits you need, you can publish your collection:
Once you click this button, the system will first check if you have a Pass to be able to publish your collection.
A Pass is how we monetize our Product.
It will give you the right to publish a Collection and is a single use. Meaning that after you use it if you want to publish another Collection you will need to buy a new one.
If the system identifies you have an unused pass it will use it automatically. Otherwise it will prompt you to buy a new one using Metamask:
Once you confirm and buy a new pass, you will be prompt to sign another message to start the deployment and configuration of the smart contracts needed for your collection:
This signature is just to validate the ownership of the pass and the collection.
All the Deployments and configurations are done from the server side and will be explained later in this document.
After the deployment is complete we sync all traits of the Collection:
And finally make sure all the final adjustments are defined and the collection is now locked so no one can change it anymore:
When everything is done, you can’t edit anything else, but you can mint a NFT for this Collection using the Mint button on the bottom right:
If you click it, you will be prompt to give your NFT a name:
And when you click mint we use the Price Feed Chain Link Product to calculate how much the NFT costs in the AVAX (Since the chain being used is Avalanche) based on the dollar price defined in the collection.
The user is then prompt to accept the transaction:
And a NFT is generated:
You can check this NFT and Collection in the OpenSea:
NFT: https://testnets.opensea.io/assets/avalanche-fuji/0x855f69998ffc21c0e707f17f0696019cd2c64810/0
Collection: https://testnets.opensea.io/collection/chainlink-demo
The Ghouls Store is where you can check all the different collections Published using Frankie. Here you can also select one Collection and Mint your own NFT:
The Surf Game is a sample game showing how people can use the Collections created on Frankie to build their own games.
You basically need to mint your own Surfer and Board NFTs from the surf collections, and deploy them to a queue that will be processed and define your Surfer output.
It uses real time data from Australian beaches to check how difficult it is to surf a certain wave in a given moment and the NFTs traits to check if your surfer is good enough to surf that wave.
Then using VRF random elements it decides if your surfer can do certain tricks and gain experience.
The game uses Chain Link Automation to process the queue of surfers and VRF to decide if the surfer will have success or not.
If you use an Admin User, you will also notice that we have an Admin Section:
Here we define certain info to support the product.
The Smart Contract Codes, is the place where we define the ABIs, Bytecodes and Addresses of all contracts we need to deploy and use during our process:
These contracts are automated in a way that everytime we publish a new contract, it is automatically uploaded to our product and all collections start using the new version right away.
The smart Contract Roles is where we define the Roles we use for given permissions on for the Collections.
The Legacy Collections is a developer view of the Collections that allow us to access the contracts methods directly.
The Royalties is the place where we define how much a pass costs, and how much we get when an NFT is minted using our collections.
The Surf Game Admin is the place where we configure which collections are used by the Surf Game