Rare World Assets Fun (RWA) is a loss-to-earn NFT gacha on Solana. Deposit an NFT with SOL backing; anyone can pull one listing at random, weighted inversely to its backing. The puller keeps the NFT or sells it back to the depositor. Either way, being pulled earns you $RWAF.
RWA is a faithful Solana port of fwa.fun (“Rare World Assets Fun”). Same mechanics, audited-identical math — Fake → Real. Custody is native: a Solana program PDA holds the NFT. No bridge, no peg.
How it works
Every listing is an NFT plus a chosen amount of escrowed SOL — its backing. That backing does two things at once: it sets how often the listing gets pulled (inversely — more backing, pulled less), and it funds an irrevocable standing bid the depositor uses to buy the NFT back.
0.01 SOL). The program PDA escrows both. Your backing sets your selection weight and funds your standing bid.The core idea. A purchaser can never keep both the NFT and the SOL — the two outcomes are mutually exclusive, and each listing's backing is escrowed per-listing and only ever settles that listing. The program is always solvent: any un-pulled listing is fully withdrawable by its depositor.
Deployments
RWA runs as an Anchor program on Solana with a web app front-end. Custody, draws and settlement are on-chain; the app reads live market data and drives the wallet.
| Network | Status | Notes |
|---|---|---|
| Solana Devnet | Live / testing | Free airdrop SOL. Future-slot commit-reveal draw (un-grindable). No real value. |
| Solana Mainnet | Planned | Gated on Switchboard VRF for the draw and the $RWAF token launch (see below). |
The $RWAF token launches single-sided (tokens only, no seed capital) via a bonding curve that graduates to a Raydium pool — exactly like FWA's one-sided Uniswap-v4 seed. Buys are blocked during emission (earn-only); the protocol buys via a price-capped buyback-and-burn. 30% of supply is reserved to the emission vault PDA. See $RWAF & emission.
Positions & weighting
A position (listing) is your NFT plus its backing. Selection weight is inverse to backing — the whole point of the design:
weight(backing) = 1e24 / backing
Because weight = NUM / backing, a lightly-backed listing has high weight and gets pulled often; a richly-backed listing has low weight and gets pulled rarely. If you want to be left alone, back heavily. If you want the loss-to-earn flow, back lightly.
- Minimum backing is
0.01 SOL— a floor that stops dust deposits from crashing the pool's price and enables sybil / emission farming. - Raise or lower your backing to reprice your weight. Raising can also seize the Crown; lowering forfeits it.
- Withdraw any time your listing hasn't been pulled — you get 100% of your escrowed backing back.
Pricing & allocation
The price of a pull
An acquisition is priced at the pool's expected value times a protocol surcharge. Expected value is the weighted average of backings:
// with inverse weights this reduces to the HARMONIC MEAN of backings
acquisitionFee = EV · (10000 + surchargeBps) / 10000 // default surcharge = 10%
Since weightᵢ · backingᵢ ≈ NUM is roughly constant, EV collapses to the harmonic mean of the backings. That means a pool full of richly-backed listings prices cheaper — correctly reflecting that a pull is far more likely to land a lightly-backed listing. The 10% surcharge on top is the protocol/depositor/emission spread.
The draw — provably fair & un-grindable
Selection is a weighted walk over active listings, resolved by a single 256-bit random word reduced modulo the total weight:
// walk cumulative weights until target lands in a listing's segment
On devnet the word is a future Solana slot hash under a commit-reveal scheme: the acquisition commits to a slot that hasn't happened yet, then reveals against that slot's hash. Because the entropy is fixed before it exists, a purchaser can't grind for a favorable outcome, and given the same active set and slot hash everyone recomputes the identical winner. On mainnet this becomes Switchboard VRF.
Anti-snipe / fair-draw completeness. The draw is bound so it can't be selectively completed against a favorable subset — the full active set at commit is the set the word resolves over. Combined with the staging queue and a draw the buyer can't force, this closes the snipe surface.
Collections
Any Solana NFT can be deposited — the program is collection-agnostic and simply escrows the mint you list. The app surfaces featured, high-volume collections to concentrate liquidity and make pools more legible, but you are never restricted to them.
- Deposit standard Metaplex NFTs; the PDA takes native custody of the exact mint.
- The wallet NFT picker (via Helius) lists what you hold so you can deposit in a click.
- Pull odds are per-listing (by weight), not per-collection — a rarer collection doesn't change the draw math, only its backing does.
Settlement
After a listing is allocated to a purchaser, exactly one of two terminal outcomes settles it. The purchaser chooses within the settlement window.
Purchaser keeps the NFT. The escrowed backing returns to the depositor minus a 1% settlement fee. NFT → purchaser, SOL → depositor.
Purchaser accepts the depositor's standing bid at the 85% sell-back rate → purchaser; the settlement discount is retained by the protocol (or shared among depositors when retained-to-protocol is off). The NFT goes back to the depositor. The listing leaves the pool.
| Outcome | NFT goes to | SOL split |
|---|---|---|
| Keep | Purchaser | Depositor gets backing − 1% (fee → protocol) |
| Sell back | Depositor | Purchaser gets 85% (settlement discount retained by protocol) |
Assets never lock
Settlement is bounded by a liveness ladder so nothing can be stranded:
- Settlement window — the purchaser chooses keep or sell-back.
- Depositor reclaim — if the purchaser doesn't act, the depositor can reclaim.
- Permissionless finalize — after that, anyone can finalize the settlement, so a passive party can never lock an asset.
Rarity
Listings carry a rarity tier for display and flavor. Rarer tiers are less likely to be pulled — consistent with the draw, since desirable listings tend to be backed more heavily (lower weight, pulled rarely).
Rarity is presentational — the on-chain draw is driven purely by weight (i.e. backing). A Legendary you want to keep should be backed heavily so it's rarely pulled; a Common you're happy to churn for $RWAF can be backed at the floor.
Fees & protocol revenue
Protocol revenue is bounded and never touches your escrowed backing. Every fee is routed to the platform fee wallet:
| Fee | Rate | When |
|---|---|---|
| Owner acquisition fee | 1% | Owner's cut of each pull's acquisition fee — taken from the surcharge, so the buyer's price is unchanged |
| Owner settlement fee | 1% | Skimmed from the backing return when a purchaser keeps the NFT |
| Settlement discount | 85% (80–95%) | On a sell-back, the purchaser gets the settlement-discount % of backing — default 85%, owner-tunable within FWA's 80–95% band; retained by the protocol (or shared among depositors when retained-to-protocol is off) |
| Crown tithe | 5% | The top-deposit reward's slice of each acquisition fee (crownShareBps) |
| Trading fee | 1% | On $RWAF buys & sells once the token is live — routed to the fee wallet |
The rest of each acquisition fee is shared among depositors through a dividend accumulator. Critically, each active listing earns a flat, equal share — a dust-backed listing earns the same per-pull fee dividend as a whale-backed one:
accFeePerShare += pot · SCALE / Σ feeShare
earned = feeShare · (accFeePerShare − feeDebt) / SCALE
Equal fee shares keep small deposits attractive and raise the capital cost of sybil fee-farming (a thousand tiny listings each still earn just one flat share). The size incentive lives elsewhere — in the Crown and $RWAF emission, both √backing-weighted.
Top deposit reward — the Crown
A single king-of-the-hill slot tracks the highest committed backing. Whoever holds the Crown accrues a share of every acquisition fee into a visible, growing pot.
- The Crown earns 5% of each acquisition fee (
crownShareBps= 500) into its pot. - To seize it, a new deposit or a raise must clear the current top by the crown threshold (10%):
newBacking · 10000 > topBacking · (10000 + 1000). - The pot settles to the holder's credit when their listing is allocated, withdrawn, or taken over.
- Reducing your own backing (withdraw or a lower re-price) forfeits the Crown.
Richly-backed listings also have low weight, so the Crown holder is pulled rarely and tends to hold the slot longer — compounding the reward for the highest-committed backers. It's the counterweight to the flat fee shares.
$RWAF & emission
$RWAF is a fixed 1,000,000,000 supply SPL token (8 decimals) — the same supply as FWA. Emission is distribution from a reserved vault, not minting. Exactly like FWA: 30% of supply is emitted over the first 15 days — 1% per day to depositors (√-backing weighted, claimable anytime) and 1% per day to purchasers (equal share per pull, claimable after each day closes).
15% of supply, streamed continuously over 15 days, weighted by √backing. You earn every second you're in the pool. The clock pauses when the pool is empty. Claimable any time.
15% of supply as 15 daily pots (1% of supply/day), each split pro-rata by that day's pull count (not fees). Claimable after the day closes.
A dynamic slice of each pull's surcharge is routed to give the buyer $RWAF. The slice follows a cold-gap curve: pulls within ~1 min of the last one send 0% to the buyer (all to depositors); after ~60 min of silence, 100% goes to the buyer — rewarding whoever revives a cold pool. This is fee-funded extra buy pressure, not part of the 30% bucket.
Supply & buckets
| Parameter | Value |
|---|---|
| Total supply | 21,000,000 $RWAF (fixed) |
| Emission window | 15 days |
| Depositor bucket | 15% of supply (√backing stream) |
| Purchaser bucket | 15% of supply (daily pots by pull count) |
| Per day, per side | 1% of supply |
| Cold-gap band | hot ≤ 60s → 0% · cold ≥ 3600s → 100% |
Launch — single-sided, no seed capital (FWA parity)
Exactly like FWA: the pool is seeded single-sided with tokens only — the team puts up zero SOL for liquidity. The owner sets the opening price; buyers bring the SOL, pulling $RWAF out and pushing the price up. On Solana this is an internal bonding curve that graduates to a Raydium pool once emission ends. 30% is reserved to the emission vault, 20% to the snapshot claim, and the remainder seeds the curve/market.
Safety
Native Solana custody — no bridge, no peg. A Solana program PDA holds the NFT directly. There is no wrapped asset, no cross-chain bridge and no peg to trust. Settlement is on-chain and each listing's backing is escrowed independently, so the program is always solvent and un-pulled listings are always withdrawable.
- Fair-draw completeness (anti-snipe). The draw is bound to the full active set committed at request time — it can't be selectively completed against a favorable subset.
- Commit-reveal randomness. The entropy (a future slot hash) is fixed before it exists, so a purchaser can't grind the outcome; anyone can independently recompute the winner.
- Staging queue + activation delay. Deposits made during a pending draw can't react to an in-flight random word.
- Min-backing floor. Blocks dust deposits that would crater EV and enable sybil / emission farming.
- Liveness ladder. Settlement window → depositor reclaim → permissionless finalize means assets never lock.
- Audited, identical to FWA. Same math and defenses as fwa.fun, ported faithfully to Solana.
Parameters
All economic parameters are owner-configurable at initialization / update. Defaults:
| Parameter | Default | Meaning |
|---|---|---|
| Surcharge | 10% | Spread on top of EV for the acquisition fee |
| Owner fee | 1% | Protocol cut of each acquisition fee |
| Settlement fee | 1% | Skim from backing when a purchaser keeps |
| Sell-back | 85% | Share of backing paid to the purchaser on a sell-back — the settlement discount is retained by the protocol |
| Crown share | 1% | Acquisition-fee share accruing to the Crown pot |
| Crown threshold | 10% | Margin a new backing must clear the top by to seize the Crown |
| Min backing | 0.01 SOL | Floor per listing (anti-dust / anti-sybil) |
1e24, accumulator scale 1e18, and the BPS-denominated fee/threshold values above.Roles
Lists an NFT with SOL backing. Sets weight, funds the standing bid, earns flat fee dividends + √backing $RWAF stream, can hold the Crown. Withdrawable until pulled.
Pays the EV-priced fee for a random pull. Chooses keep or sell-back. Earns daily-pot $RWAF by pull count, plus the cold-gap surcharge slice.
Initializes the pool, sets parameters, and receives revenue at the fee wallet (1% acquisition fee + 1% keep-settlement fee + the sell-back settlement discount + the 5% Crown tithe). Cannot touch escrowed backing or stranded assets — those are protected by per-listing escrow and the permissionless finalize path.