Docs

BSKTS is a launchpad on Robinhood Chain. Tokens launch through Pons, trade against ETH, and their trading fees are spent buying a basket of real-world asset tokens that is pushed to holders every three minutes.

Overview

A creator launches a token and picks one to three approved RWA reward assets, with weights totalling 100%. From the first trade, Pons charges fees on the ETH side of the market. Those fees do not go to the creator's wallet — they go to a contract that converts them into the chosen RWAs and sends them to the people holding the token.

The RWAs are a reward, not a trading pair. Every BSKTS market is TOKEN / ETH regardless of what its basket contains.

How it works

01

Launch on BSKTS

Create your token and choose up to three supported RWA reward assets.

02

Trade against ETH

Every BSKTS token launches through Pons with an ETH market.

03

Fees accumulate in ETH

Trading generates creator fees that flow into the token’s BSKTS reward contract.

04

BSKTS buys the basket

Every three minutes, accumulated ETH is converted according to the selected weights.

05

Holders receive RWAs

BSKTS distributes the purchased RWA tokens automatically. No staking. No claiming. No claim fees.

The reward cycle

The same five steps, in protocol terms. Each launch runs its own three-minute clock:

  1. Trading on Pons accrues ETH creator fees, credited to the launch's BasketDistributor.
  2. When the window closes, a keeper calls processEpoch. The distributor pulls its accrued ETH out of the Pons fee escrow.
  3. The ETH is split by the basket weights and swapped for each RWA through RewardRouter, which only follows pre-approved routes.
  4. The purchased RWAs are moved to AutoAirdropDistributor and recorded as that epoch's reserve.
  5. The airdrop worker computes each holder's share and submits it in batches. The contract transfers the tokens out.
If the accrued ETH is below the minimum process threshold, the epoch still closes and the clock still advances — the ETH just carries forward to the next window rather than being spent on gas for a negligible swap.

How Pons is wired

BSKTS launches through PonsV2LaunchFactory on Robinhood Chain (chain id 4663). Two details carry the whole integration.

The fee recipient. Pons' launch parameters include a creatorFeeRecipient. BSKTS sets it to the launch's own BasketDistributor. That single field is what makes Pons pay holders instead of the creator, and Pons fixes it at creation — so a creator cannot redirect the reward stream after the fact.

ETH as the quote asset. BSKTS always passes the zero address as the pair token, which is how Pons expresses a native-ETH market. Fees therefore arrive in one uniform asset for every launch.

Pons credits fees to an escrow rather than pushing them, and its claim() takes no arguments — it pays whoever calls it. So each distributor pulls its own balance during processEpoch; nothing can claim on its behalf, and a keeper has no recipient or calldata to manipulate.

The RWA basket

A basket holds one to three assets from a curated registry, with weights in basis points that must total exactly 10,000. Both the assets and the weights are fixed at launch and cannot be changed afterwards, by the creator or by protocol admins.

Only assets in RewardRegistry can be chosen, and each must have an approved swap route. A creator cannot point a basket at an arbitrary token address.

Multiple launches

With many launches running at once, nothing about a distribution is global. Every launch gets its own BasketDistributor clone, and Pons pays that specific contract, so fee streams never mix: a token's ETH physically lands in its own distributor.

Holder rewards are held in one shared AutoAirdropDistributor, but every record inside it is keyed by the launched token first:

RecordKeyed by
Epoch reservetoken, epoch, reward asset
Pending holder balancetoken, holder, reward asset
Allocation already processedtoken, epoch, holder
Batch already submittedtoken, epoch, batch

Two guards keep those namespaces honest. Only a launch's registered distributor may credit that launch's reserves, and no allocation can exceed the reserve recorded for its own token and epoch. This matters because the reward assets themselves sit in one pooled contract balance: if two launches both reward the same asset, they share an ERC-20 balance, and it is the per-launch accounting that stops one from spending the other's share.

The holder list itself is not computed on chain. The indexer follows ERC-20 transfers for each launched token and keeps balances per token and wallet, so a wallet holding two BSKTS tokens has two independent balances and earns each basket separately. At epoch close, the worker reads the snapshot for that one token, allocates pro-rata by balance, and submits the result as an explicit list of recipients and amounts.

So a holder of token A receives only token A's basket, in proportion to their share of token A. Holding both tokens simply means being included in two separate distributions.

Who is eligible

Eligibility is a token balance at the epoch snapshot. There is no staking, no lockup, and no registration. Allocation is strictly pro-rata: your share of the basket equals your share of the eligible supply.

A small set of addresses is excluded explicitly — the zero and burn addresses, the protocol's own contracts, and the launch's Pons bonding curve. The curve matters most: Pons mints the entire supply to it, so until the launch graduates the curve is by far the largest holder. Leaving it in would hand nearly every reward back to the venue.

Exclusions are always an explicit list. BSKTS never excludes “all contracts” — smart contract wallets hold tokens for real people and stay eligible.

Why there is no claim

Rewards are pushed, not claimed. There is no claim() function for holders to call, which means no gas cost, no forgotten rewards, and no advantage for whoever watches the chain most closely.

Two details make pushing safe. A reward below a per-asset dust threshold stays pending and accumulates instead of being sent, so tiny balances do not cost more in gas than they are worth. And a transfer that fails — a token that reverts on a particular recipient, for instance — is isolated: that holder's balance stays pending and the rest of the batch still goes out.

The $BSKTS exception

The protocol's own $BSKTS token follows a different economic model. Its creator fees go to the protocol treasury rather than buying an RWA basket, so it never gets a BasketDistributor and never distributes RWA rewards. The launchpad rejects any attempt to give it one.

The contracts

Six contracts are deployed once on Robinhood Chain and shared by every launch, listed here in the order a launch touches them. Every address is shown in full and links to the explorer, so nothing on this page has to be taken on trust.

The contracts were deployed under the protocol's former name and their source still carries it, so several read Slice… on the explorer. The names are left exactly as deployed: a contract cannot be renamed after the fact, and changing them here would break the one thing this section is for, which is matching what you see on chain.

SliceLaunchpad

Creates launches

The only contract a creator calls directly. One transaction validates the basket, creates the launch's reward contract, launches the token through Pons, records the basket, and optionally spends part of the sent ETH buying the creator their own token. Doing all of it in one call is what stops anyone from buying a launch before its creator can.

View on explorer

PonsAdapter

Talks to Pons

Every call BSKTS makes to Pons goes through here and nowhere else, so Pons' interface is not spread across the codebase. It forces ETH as the quote asset, sets the launch's fee recipient to its reward contract, and buys on the bonding curve for a dev buy. If Pons ships a new version, this is the piece that changes.

View on explorer

RewardRegistry

The approved RWA list

The curated list of RWA tokens a basket may contain, with the decimals of each. Creators pick from it rather than pasting an address, so a basket cannot be pointed at a token nobody can trade, or at a fake one wearing a real ticker.

View on explorer

BasketDistributorFactory

Mints reward contracts

Deploys one cheap clone of BasketDistributor per launch and initialises it with that launch's basket. Clones make a dedicated contract per launch affordable, which is what allows fee streams to stay physically separate instead of being tracked as balances in one shared pot.

View on explorer

RewardRouter

Buys the RWAs

Swaps a launch's accrued ETH for its basket through Uniswap V3, following only routes an admin has approved in advance. The keeper that triggers a swap supplies nothing but a price floor and a deadline — never a path, a recipient, or calldata — and output always returns to the distributor that called it. The worst a stolen keeper key can do is submit a swap that reverts.

View on explorer

AutoAirdropDistributor

Pays holders

Holds the purchased RWAs and transfers them out to holders in batches. It has no claim() at all. Rewards too small to be worth their own gas stay pending and accumulate, and a transfer that fails for one holder does not take the batch down with it.

View on explorer

One per launch

BasketDistributor is the exception: there is a separate one for every token, created at launch, and its address is shown on that token's page. It is the contract Pons pays. It holds that launch's ETH, runs its three-minute clock, and on each epoch pulls its fees out of the Pons escrow, splits them by the basket weights, sends them through RewardRouter, and hands the purchased RWAs to AutoAirdropDistributor. Its basket is fixed at creation and cannot be changed by anyone, including protocol admins. Neither the creator nor an admin can withdraw from it — there is no function to do so.

Supporting code

BasketLib holds the basket rules, so the same validation applies wherever a basket is read: one to three assets, no duplicates, no zero weights, every asset in the registry, and weights summing to exactly 10,000 basis points. V3Path encodes Uniswap V3 swap paths and checks that an approved route really starts at WETH and ends at the asset it claims to buy. SliceTreasury receives the native token's fees and is deliberately never attached to a launch, which keeps protocol revenue and holder rewards from touching the same accounting.

Retired

The launchpad and the adapter are not upgradeable, so changing them means deploying new ones. These are the versions they replaced. They can no longer create launches, but the tokens they did create are unaffected and still earning: a launch's rewards run through its own distributor, which does not depend on the launchpad that created it.

View on explorer
View on explorer

Roles and permissions

Two keys sign continuously from a server: a keeper that closes epochs and a worker that sends the airdrops. Both are deliberately limited, because a server key is the one most likely to be stolen.

RoleCan do
KEEPER_ROLEClose an epoch and trigger its swaps, supplying only a price floor and a deadline
AIR_DROP_ROLESubmit holder allocations, bounded by the reserve recorded for that token and epoch
RWA_MANAGER_ROLEAdd or disable assets in the registry
ROUTER_MANAGER_ROLEApprove the swap route used to buy an asset
PAUSER_ROLEPause launches or distribution
LAUNCHPAD_ROLECreate and register a launch's reward contract. Held by the launchpad itself, not by a person

What no role can do matters more. Nobody can change a basket after launch, redirect where a launch's fees go, withdraw ETH or RWAs from a distributor, or pay a swap out to an address of their choosing. Those are not permissions that are withheld — the functions do not exist.

The launchpad and the adapter are not upgradeable. Changing either means deploying a new one and moving LAUNCHPAD_ROLE across, which leaves existing launches running on the contracts they were created with.