Waffle is a simple primitive for NFT raffles inspired by Jon Itzler.
- NFT Owners can specify the number of available raffle slots, and price per slot.
- Entrants can deposit and withdraw until all slots are filled.
- Owners can raffle the NFT and select a winner at any point (slots filled or not).
Additionally:
- Owners can delete a raffle so long as a winner hasn't been selected.
Edit the necessary RPC endpoints and private keys in hardhat.config.js
. It is recommended to run the test suite against Chainlink's Kovan or Rinkeby deployments, to remove the need to simulate Chainlink VRF responses.
# Install dependencies
npm install
# Run tests
npx hardhat test
- Base
Waffle.sol
contract - Base
WaffleFactory.sol
contract - Testing suite
Waffle.sol
is a full-fledged raffle system that enables the deposit, withdrawal, and post-raffle disbursement of an ERC721
NFT. Randomness during winner selection is guaranteed through the use of a Chainlink VRF oracle.
WaffleFactory.sol
is the factory deployed for child Waffle.sol
instances. It simplifies the deployment of a raffle and ensures that deployers pre-fund Waffle.sol
instances with the LINK
necessary to retrieve a random result from the Chainlink oracle.
- Extension: Can include an automatic raffle timestamp to force a raffle to occur, regardless of whether a NFT owner chooses or not. Or, can remove the ability to delete a raffle.
- Limitation: When too many slots are filled, you can hit the upper limit for gas on successive
transfer
calls when deleting a raffle.
Freepik for the icon.