A behind the scenes look at how to launch a collectible
On August 9th 2021, FVCKRENDER dropped his FVCK_CRYSTAL// collection which sold out instantly. The drop happened in two phases, a redemption phase which rewarded HODLers and kept gas prices low, followed by a public sale which sold in under a minute (9 blocks).
We would like to share some of the design and technical aspects of the drop and highlight what we did to ensure that drop was smooth and successful.
The Smart Contract
The base smart contract for FVCK_CRYSTAL// was a Manifold Creator contract. By using the Manifold Creator as the underpinning, it allowed for a distribution mechanic that featured both burn redemptions and direct purchasing, but also the ability to keep expanding the mechanics of FVCK_CRYSTAL// with future app extensions.
The FVCK_CRYSTAL// contract was used to facilitate the minting of all crystals, while the logic for the redemption and sale were contained in an app extension contract.
The Drop Mechanic
The FVCK_CRYSTAL// drop had two phases, a one hour redemption period, where FVCKRENDER fans could burn either an INVALIDITY// (763 editions) or BALANCE// (511 editons) for 2x FVCK_CRYSTAL//s. This was done to achieve 4 key objectives:
avoid gas wars for the first hour. This was possible as there were more FVCK_CRYSTAL//s available than the maximum possible INVALIDITY// and BALANCE// burned
reward hodlers with first option to obtain FVCK_CRYSTAL//s
increase the value of INVALIDITY// and BALANCE// on the secondary marketplace and allowing loyal hodlers to realize a profit pre-drop
reduce the total supply of INVALIDITY// and BALANCE//, thus increasing their value
While FVCKRENDER could have simply sold this portion of his FVCK_CRYSTAL// supply, he wanted to share his success with his community. The redemption mechanic and Manifold’s smart contracts made this simple, using the same underlying app extension as MDJ’s cat redemptions.
Unlike many other collectible drops, we wanted FVCK_CRYSTAL// owners to have a fully immersive experience, without the need to visit OpenSea or wait until a later time to discover what they received. We also didn’t want people to discover all the possible crystal combinations beforehand.
In order to pull this off, Manifold designed a collectible reveal server. The smart contract would initially point to this server for metadata. After drop completion, all the metadata was uploaded to arweave.net and the smart contract updated to point to the Arweave endpoint.
The Collectible Server
Since we wanted to keep all FVCK_CRYSTAL// variations private, we needed to serve metadata in a way that was not publicly visible before a given crystal was assigned to a token. Furthermore, we wanted to ensure that the distribution of crystals was truly random. This is why we didn’t simply upload all the metadata and assets to IPFS/arweave in a sequential fashion and simply randomize the starting seed (like many other collectible drops).
Instead, we designed a collectible server with the following key elements:
All the crystal metadata was stored in a table, but unassigned
There was a blockchain scanner that watched for an ‘Unveil’ event emitted by the smart contract. When it encountered an event, it would randomly pick an unassigned crystal and assign it to the token referenced by the ‘Unveil’ event. It would then trigger a metadata update on OpenSea
The metadata endpoint would return placeholder crystal metadata for any given token id unless it had been assigned a crystal. Doing so prevented discovery of the full set of FVCK_CRYSTAL// metadata beforehand
On the client side, upon a burn redemption or purchase, the client would wait for the transaction to complete. Upon transaction completion, it would poll the metadata endpoint for the tokens minted until it received non-placeholder metadata, at which point it could reveal the newly created FVCK_CRYSTAL//s.
The integration of web3 event handling on both the client and server allowed for a seamless redeem and purchase experience.
Limiting Failed Transactions
One final thing we did to try and limit failed transactions was to over-estimate the gas required to redeem or purchase (we chose to overestimate by 30%). By doing so, we avoided two things:
MetaMask gas underestimation problems, which could cause transaction to fail with ‘Out of Gas’ errors
Some situations where an individual would try and speed up a transaction manually without adjusting the gas limit., which would also result in ‘Out of Gas’ errors
As a result, we didn’t see any legitimate out of gas transaction failures (the ones that did were very clearly bots).
Finally, we also alerted people on FVCKRENDER’s discord upon sell out so that they could cancel any pending transactions.
These steps, along with the 1 hour redemption period limited the number of failed transactions. Of course, there’s nothing we could do saving bots like this :)
Test, Test, Test
One of the key things that participants didn’t see was all the testing that went on behind the scenes. This was critical to ensure that the drop went flawlessly. Here’s a checklist of items that we went through:
Smart contract unit testing (full code coverage)
Smart contract integration testing (on private chain and on rinkeby)
Server unit and integration testing (on private chain and on rinkeby)
Client unit and integration testing (on private chain and on rinkeby)
Deploying smart contracts, server and client onto a test net and running through a full sale.
Testing ending conditions of a sale (by reducing the number of items available)
Testing website on multiple browsers and platforms
Metadata integration testing with OpenSea and Rarible
Arweave asset retrieval testing and validation
Server failover and recovery plan (for the period between sale completion and metadata upload to arweave)
Through a combination of drop mechanics, product design and testing, Manifold was able to create a flawless drop experience. We hope that others can learn from this sale and incorporate these strategies into their own releases. It’s important for the NFT community to keep delivering premium experiences and we believe that there’s a lot more innovation to come!
great work, a github for the server to have a deep dive on mechanics and impl would be a blessing
Appreciate the tools, would love to see some more open source stuff from Manifold.