NFT drops
Streamers can mint and distribute basic NFTs to their most valuable viewers around special events — milestone streams, charity events, tournament wins, anniversary streams, sponsored campaigns. The accrual ledger already knows who the valuable viewers are; this is the non-fungible layer on top.
Why this matters
The fungible BTV / STREAM layer pays viewers for time spent. NFTs do something fungible tokens can't:
- Mark identity, not balance. Holding "PEWPIE 24-hour Charity Stream Survivor" badge says something specific. Holding 50,000 PEWPIE says nothing personal.
- Create permanent collectibles — viewers who were there for the moment have something durable. This is the streamer-fan equivalent of physical concert tour merch.
- Gate ongoing perks — Discord roles, future-drop priority, raffle weights, IRL meetup access. NFT-balance-gating is cleaner than token-balance-gating because non-fungibility means you either have the badge or you don't.
- Drive secondary-market activity that the streamer earns royalties on — separate from STREAM token swap volume.
- Add Plus-tier upgrade pressure — advanced collection features are SaaS-monetizable (see §Revenue).
NFT drops are an engagement amplifier, not a primary monetization mechanism. The goal is to deepen the streamer-viewer relationship in a way the fungible layer alone can't.
What we're shipping (recommended)
Recommended: Two NFT primitives, streamer chooses per drop.
| Drop type | Underlying | Best for | Cost per mint |
|---|---|---|---|
| Premium drop | Metaplex Core asset | Top-N exclusive collectibles (≤ 500 per drop) | ~0.005 SOL rent + tx |
| Mass drop | Metaplex Bubblegum compressed NFT | Everyone-present-at-moment-X (1K–500K per drop) | ~$0.0001 effective per mint |
Streamers pick the drop type at event-creation time. The UI nudges them toward the right choice based on intended audience size. Both primitives sit on standard Solana NFT infra — they trade on Magic Eden and Tensor, they show up in any Solana wallet, they're interoperable with the rest of the ecosystem.
Eligibility rules — the menu
Streamers define who qualifies at drop-creation time. The platform ships a fixed menu of eligibility predicates (composable, AND-able):
| Predicate | Description |
|---|---|
top_n_by_accrual | Top N wallets by accrued BTV/STREAM in a window |
top_n_by_messages | Top N wallets by chat message count |
present_at_timestamp | Linked viewers present in chat at a specific moment |
held_for_at_least | Held STREAM token balance ≥ X for ≥ Y hours |
subscribed_to_channel | Twitch subscriber-tier ≥ N at drop time |
has_badge | Has a specific Twitch badge (mod, vip, founder, sub-anniversary) |
holds_prior_drop | Holds an NFT from a prior drop (loyalty stacking) |
streamer_allowlist | Hand-picked wallets the streamer specifies |
bv_stake_minimum | BTV stake ≥ X (always enforced as a floor, not optional) |
A drop is the AND of selected predicates. Examples:
- "VIP early-supporters drop" →
top_n_by_accrual=100ANDheld_for_at_least(STREAM, 100, 30d)ANDbv_stake_minimum(100) - "Charity stream survivors" →
present_at_timestamp(end_of_stream)ANDtop_n_by_messages=500ANDbv_stake_minimum(100) - "Subscriber appreciation" →
subscribed_to_channel(tier_2+)ANDbv_stake_minimum(100)
The BTV stake minimum is always present as a base floor — it's the same anti-sybil gate as for fungible accruals. This is non-negotiable to prevent NFT-farming.
Drop mechanics
Push vs Pull
Two delivery models, streamer chooses per drop:
Pull (recommended for >50 recipients)
The streamer publishes a merkle root of eligible (wallet → metadata) pairs. Each eligible viewer claims their NFT by submitting their leaf and proof, similar to how token claims already work. Viewer pays the small Solana transaction + ATA rent (~$0.001).
Why default to pull:
- Streamer's wallet doesn't need SOL for hundreds of mint transactions.
- Eligibility is provably committed at snapshot time but cost is amortized.
- Reuses our existing merkle infrastructure pattern.
- Viewers who don't claim within the window forfeit — the unclaimed NFTs are never minted, so dust-collection is zero.
Push (for ≤50 recipients, e.g. exclusive top-10)
BitView (or the streamer) directly mints + transfers the NFT to each qualifying wallet. Costs ~$0.005 per recipient × N recipients. Best for small high-value drops where streamer wants the surprise-and-delight UX ("you don't even need to claim, it just shows up").
Metadata and traits
Each drop has:
- Collection-level metadata — name, description, image, social links, external_url pointing back to the streamer's BitView profile.
- Per-asset metadata — for ranked drops (top-N), the rank is encoded as a trait. For mass drops, all assets are identical.
- Optional traits — Pro/Plus tier feature: streamer can define rarity tiers within a drop (e.g., 10× legendary / 50× rare / 500× common with different artwork).
All artwork is uploaded by the streamer and pinned to permanent storage (Arweave or IPFS via Pinata). BitView does not generate AI artwork on the streamer's behalf — they bring their own assets or hire a designer. We just handle the on-chain side.
Royalties
Solana royalties are unenforceable on most pre-2023 NFT standards. We solve this by using Metaplex Core's enforceable royalty plugin, which is whitelist-enforced at the marketplace layer (Magic Eden, Tensor honor it).
- Streamer sets the royalty % at drop creation: 0–10%, capped. Default 5%.
- BitView platform fee on royalties: 10% of the streamer's royalty. At 5% royalty → 0.5% goes to BitView treasury, 4.5% to streamer.
- Royalties accrue automatically to the streamer wallet on every secondary sale on a whitelisted marketplace.
For Bubblegum compressed NFTs, royalty enforcement is weaker (compressed NFT royalties are still being standardized). For mass drops we set royalty to 0% by default; streamer can override.
Utility for holders
What makes the NFT worth holding (and trading) past the drop event?
| Utility | Mechanism | Streamer-controlled? |
|---|---|---|
| Discord role gating | BitView Discord bot reads holder set, assigns role | Yes |
| Future-drop priority | Holders of drop N auto-eligible for drop N+1 (regardless of other rules) | Streamer-toggle, default ON |
| Accrual multiplier | NFT holders earn 1.10× rate on future distributions from this streamer | Streamer-toggle, default OFF |
| Raffle weight | Holding NFT = N entries in streamer-run raffles | Streamer-toggle |
| IRL access | Streamer manually validates NFT ownership for meetup invites | Off-platform |
| Marketplace tradability | Standard Solana NFT — sells on Magic Eden / Tensor | Always on |
The future-drop priority mechanic creates a soft loyalty stacking effect: viewers who got drop #1 are guaranteed eligibility for drop #2, which guarantees them drop #3, etc. This is meaningful retention.
Revenue model
Per-tier feature gating
| Tier | NFT drop access | Drop frequency | Per-drop fee |
|---|---|---|---|
| Free | Mass drop only (Bubblegum), basic metadata | 1 per month | $5 |
| Pro ($99/mo) | Mass + Premium, traits + rarity tiers | Unlimited | $0 |
| Plus ($499/mo) | Pro features + custom royalty config + Magic Eden / Tensor verified-collection submission + brand sponsor co-mint | Unlimited | $0 |
This is sized so:
- Free streamers can experiment (1 drop/mo at $5 is "we want you to try it"). Most won't outgrow this.
- Pro is the obvious upgrade once a streamer runs > 1 drop a month or wants any rarity story. The unit economics make it pay for itself with the third drop.
- Plus unlocks the brand-sponsor co-mint flow — a brand pays for an NFT drop on the streamer's channel, BitView takes a marketplace fee, the brand gets verifiable on-chain proof of audience reach.
Royalty take rate
10% of streamer royalty on secondary sales. So a 5% streamer royalty becomes 4.5% to streamer / 0.5% to BitView. Indicative numbers:
- Mid-tier streamer with active fanbase, 500-NFT drop, 30% drop trades secondary at average $10 → $5,000 secondary volume per drop event → $25 royalty to streamer, $2.50 to BitView per event.
- Top-tier streamer, 100-NFT premium drop, average $100 secondary trade, 50% trades within 6 months → $5,000 secondary volume → $25 royalty per event.
This is modest revenue per drop. The aggregate at 1,000 active streamers running 2 drops/year → ~$5K/year from royalties. NFT drops are not a primary revenue line. The point is engagement and Pro/Plus upgrade pressure, not direct take.
Marketplace listing (Phase 5+)
Eventually we may run a BitView-curated NFT marketplace that specifically aggregates streamer-NFT drops with provable audience-engagement provenance (each NFT carries on-chain attestation of "earned by being top-N on stream X at time Y"). Marketplace listing fees would be the revenue line; Magic Eden / Tensor are still the primary trade venues.
Anti-fraud for NFT drops
NFTs need their own anti-fraud thinking because the rewards aren't fungible — a sybil farm can't just earn a million dust NFTs and sell them. But there are two attacks worth defending:
- Sybil multi-account farming a top-N rank. A farm runs 50 alt accounts that lurk all stream, each accruing enough to crack the top-100 of a small streamer.
- NFT speculation pumping — a wallet buys 50 cheap drop NFTs on secondary, gets future-drop priority for all of them, dumps the next drop.
Defenses
- BTV stake floor on every drop. The 100 BTV anti-sybil stake is mandatory; combined with stake-slashing, sybil networks pay to play.
- Per-drop holder cap. A single wallet can hold at most 1 NFT per drop event. Enforced at mint time. Prevents whale concentration on Pull drops.
- Transfer cooldown (optional, streamer-toggle). Drop NFTs non-transferable for first N days after claim. Hurts speculation but also dampens secondary volume; default off, recommended on for charity / milestone drops.
- Future-drop priority requires hold of original recipient. Buying drop #1 NFT on secondary does NOT grant priority for drop #2. We snapshot the original recipient list, not the current holder set. Marketplace buyers get aesthetic + utility (Discord role) but not the loyalty-stacking primary advantage.
- Wash-trade detection on royalty payouts. Same wallet cluster trading the same NFT back and forth to inflate royalty payouts is detected and royalties on those trades are clawed back to treasury.
Streamer flow (UX)
1. Streamer opens BitView dashboard, clicks "Create NFT drop"
2. Picks drop type: [ Premium / Mass ]
3. Picks eligibility: [ checkbox menu of predicates above ]
4. Uploads artwork: [ image, name, description ]
5. Sets royalty: [ 0–10% slider ]
6. Sets utility: [ Discord role / accrual multiplier / etc. ]
7. Reviews summary: "X eligible wallets, Y SOL / N USDC fee"
8. Signs transaction: publishes merkle root or initiates push
9. Notifies viewers: tweet template, in-stream OBS overlay,
Discord announcement bot
The whole thing is a 5-minute wizard. The magic is that the eligible wallet list is already known — we have the accrual ledger, the chat presence map, the BTV stake balances. The streamer just defines "who qualifies" and the system computes "which wallets that means".
Viewer flow (UX)
For Pull drops:
1. Viewer gets notification (Discord, in-app, email)
2. Opens BitView rewards page
3. Sees "You're eligible for [Streamer] [Drop name]"
4. Clicks Claim
5. Wallet pops up signature request
6. NFT lands in their wallet within ~30s
For Push drops, the NFT just appears in their wallet with a "you got something special!" notification.
For Discord role utility, the BitView Discord bot in the streamer's server detects holders and auto-grants the configured role. Viewer joins the streamer's Discord, the bot checks their wallet, role appears.
Technical architecture
We already have what we need on the frontend (@metaplex-foundation/mpl-core
and @metaplex-foundation/mpl-bubblegum are imported).
Backend additions:
- New collection
nft_dropsin MongoDB:{_id: drop_id,streamer_wallet,channel_login,drop_type: "premium" | "mass",collection_pda,eligibility_rules: [...],eligible_wallets: [pubkey], // computed at snapshot timemerkle_root, // for Pull dropsmetadata_uri,royalty_bps,royalty_split_bps_to_streamer, // typically 9000 (90%)utility_flags,created_at,snapshot_at,claim_window_end,status: "pending" | "active" | "ended"} - New API surface
/nft-api:POST /drops— create drop (admin or Pro+ streamer)GET /drops/eligible/{wallet}— what drops this wallet can claimGET /drops/{id}— drop details + metadata + eligibility listGET /drops/{id}/proof/{wallet}— claim proof for Pull dropsGET /drops/by-channel/{channel}— drop history for a streamer
- Eligibility computation runs at
snapshot_attime as a background job. Reads the accrual ledger, chat presence snapshot, BTV stakes, Twitch badge cache → produces the eligible wallet list → builds the merkle tree for Pull drops or queues Push transactions. - Discord bot integration: a separate service that periodically polls
/drops/by-channel/{channel}and updates roles based on holders.
The on-chain side reuses standard Metaplex tooling. We don't write custom Anchor programs for this — we wire existing Core / Bubblegum primitives.
Phasing
| Phase | Scope |
|---|---|
| P3.1 | Mass drop (Bubblegum) on Free tier. 1 drop / month. Basic metadata, no traits. |
| P3.2 | Premium drop (Core) on Pro tier. Traits + rarity tiers. Unlimited drops. |
| P3.3 | Royalty plugin enforced. 10% BitView platform fee on royalties active. |
| P3.4 | Discord bot for role gating. Future-drop priority loyalty stacking. |
| P4.1 | Brand sponsor co-mints (Plus tier). Brand pays for an NFT drop on a streamer's channel; co-branded asset. |
| P5+ | BitView-curated NFT marketplace with on-chain audience-engagement provenance. |
Open questions
- Default royalty split — 90/10 streamer/BitView feels right. Could go 80/20 if we end up subsidizing significant marketplace activity.
- Mass-drop maximum size — Bubblegum compressed trees can hold up to 1B leaves but real-world depth for cheap mints is ~500K. We cap mass drops at 100K per event in P3 as a sanity floor.
- AI artwork generation — currently out of scope. A streamer who wants AI art uses a third-party tool then uploads. We could partner with an AI art provider in P4+ if streamers ask, but we don't host that capability ourselves.
- NFT-token-gated streams — should holding a streamer's NFT unlock Twitch sub-equivalent perks (sub-only mode access, special emotes via Twitch's API)? This is explored in P5+ if Twitch API support is good enough.