A proof-of-concept for fair NFT drops
Github • Etherscan • Polygonscan
At 0xEssential we've been learning from other NFT collectible drops to determine the best way to release our collection Wrasslers. We appreciate that projects like ArtBlocks and Parallel are exploring different models to reduce the gas wars that happen on popular drops, and have been impressed by projects like Forgotten Runes Wizard's Cult who used and shared some best practices. We're also excited about some platforms our friends are working on to help solve similar issues, like Nifty Royale and Chestr. We think we can add something to the conversation by offering this idea and reference implementation to the community.
0xEssential is committed to building open source developer tools for NFT projects. We are primarily focused on inheritable contracts that provide metaverse portability and utility, but any time we build tools for ourselves, we like to share them back to the community - a rising tide lifts all boats⛵️
Our ideal NFT drop is average user first - no FOMO or failed transactions, fewer bots. No drama, no whales minting 30% of supply, for better or worse. These are the key aspects of a FairDrop:
- Efficient - no more gas wars, and no performance issues related to pageloads.
- Timezone agnostic - crypto is global, and timed drops inevitably put someone at a disadvantage, while launch dates are too frequently missed.
- Distributed randomly - being the quickest to click and pumping gas is not the best way to decide who gets an NFT.
- Decentralized and Trustless - we should not be asking users to register with email, or using a centralized database and webserver to manage who can buy what.
We took all of those requirements and built a system that uses raffles with a right to buy reward. Random winners get to mint NFTs at a fair floor price, wherever they are in the world, whether they're influencers, etherscan minters, bot makers, or MEV manipulators.
Address registers for drop on-chain
A user can register their interest in an NFT drop in a decentralized way. We use Polygon for registration to keep things cheap. A project can launch their list before release to build and gauge interest, while users know they have a fair chance to mint.
Totally fair random selection
Once a project is ready for launch we use Chainlink VRF to select a random list of eligible minters. These addresses can each mint n tokens, where n x minters is equal to available tokens. Addresses are passed to Ethereum mainnet for minting.
Chilled out and cheap mints
Eligible minting addresses have 24 hours to mint their tokens. They mint on Ethereum mainnet without the need for gas wars or staying up all night to catch a drop.
After 24 hours a new batch of eligible minters is selected for minting. Previous minters become ineligible and we select a new set of minters relative to remaining tokens.
While there are certainly potential pitfalls and improvements to the implementation of this approach, we think these mechanics would be a huge win for NFT collectors without adding much of a burden to project developers. Note that this was hacked together quickly, and while we are testing it in production, this code is not audited or battle-tested at all.
One issue with this approach is that it does not prevent bots from signing up thousands of addresses. Since registration is cheap in tx cost and onchain, there is not a great way to prevent this. We could require at least a small payment for registration, which might help, but adds complexity and might not be accepted by users. It is true that the bot owner would need to check each of their registered addresses for eligibility, and purchase through eligible addresses, but this can be done pretty easily too, and captchas or other web-based tools of course cannot prevent interacting with the contracts directly. In some ways we are forced to choose between decentralization and fairness. Parallel used email registration with a centralized server - this makes it a lot easier to prevent bots, but also introduces trust and the potential of censorship.
Another area of concern is with a large number of addresses eligible to mint, transaction costs of passing these addresses back to L1 might become too expensive. One alternative might be to sell users an ERC20 token on Polygon, allow the user to bridge that token to L1, and then accept that token as payment for minting an NFT - this might also help with the bot problem, where migrating an ERC20 token is a bit more complex of a process. Or mint NFTs on Polygon and allow users to migrate them to L1 if they choose.
We don't have all of the answers but hope to kick off a conversation with the community! Thanks for reading, PRs welcome, and let us know your thoughts?