Submitted to the 2023 Sandstorm Hackathon. Application available: sandstorm.md
Mint and Drop an NFT after Verifying a Specific Solana Event has occurred
This is a serverless function that handles a POST
request from Helius on Vercel using Next.js. The function:
- Validates and authorizes the
POST
request - Verifies that the type of transaction received matches what was expected (in this case 'BURN').
- It extracts the
tokenTransfer
array from the body, and verifies that the tokens burned is greater than theMIN_BURN
constant. - If the amount of tokens burned is greater than the
MIN_BURN
constant, we send a call to CrossMint to mint an NFT to the burner orpyro
.
Note, the front end here is really is just a tool to let ppl easily burn tokens. There's no link between the FE/BE. So you're welcome to play around with the FE, but the fun stuff is in
pages/api/burn.ts
.
- Clone from GH.
- Rename
.env.example
to.env
and update the variables. \AUTH_CODE
is self generated (i like solana keygen-grind to find something secure)CROSS_MINT
envs require a dev account from CrossMintDISCORD
keys are available via the Developer Portal-
- NOTE: You can disable DISCORD BOT by setting
const NOTIFY_DISCORD = false
inpages/api/burn.ts
, in which case you shouldn't need these keys
- NOTE: You can disable DISCORD BOT by setting
-
- You'll need a Helius WebHook. At present this repo is only really indexed for the
Enhanced Transaction
typeBURN
. The verification component is pretty modular and could easily be replaced with some other Tx Type and different success criteria. You'll need to wait to deploy the webhook until after you've launched your server. - Modify NFT rewards/metadata to your liking.
You should be able to test things out. Install dependencies and launch the app:
yarn
yarn dev
- Out the gate, you should be able to use
utils/samples/samplePOST.md
to run acurl
command in a seperate terminal--this should effectively simulate recieving aPOST
request from the WebHook. Just make sure you're sending the request to the right path (in my case,http://localhost:3000/api/burn
) You should see something like this in your server terminal:
Requesting NFT Mint:
- Pyro: Cw9P...4J1E
- Burn: 10,055,679 $BONK
- TxId: JWSn...JoDR
- CMID: w44177a9-02e9-4d04-a5ce-de7d5739d5bx
✅ Mint: arGbzUJQ1vTmjqPdDTqXsuqPxLQb1MGkUX5qTXt483Kx
✅ DCRD: 🤖 Connection Established
✅ DCRD: Message sent to server
✅ DCRD: 🤖 Connection destroyed
To get the feed from Helius, you need to push your component to a serverless function hosting provider. I used Vercel. I note some issues/limitations below, especially on their free plan.
At present (Jan 21, 2023):
- Webhooks:
- BURN Feed does not include inner tx Burns (e.g., burns associated with a Candy Machine mint)
- BURN Feed does not include BurnChecked tx's
- Vercel:
- Base plan is limited to 10s executions (which is only enough time to send a CM request)
- Pro plan is limited to 60s which is sufficient MOST of the time but I have seen some executions time out
- Future phases will have to explore alternatives
- Note: The Serverless Function logs will automatically be cut-off if the total size reaches over 4KB. This will require a log drain for future use
- CM:
- I don't believe metadata currently uses Metaplex's latest standard. I think the lack of
properties.files
for the img file causes the NFT to not render on all platforms (e.g., Solana Explorer)
- I don't believe metadata currently uses Metaplex's latest standard. I think the lack of