Documentation · v1
How BASKT works
Last updated Oct 20, 2026 · Describes the protocol as built. Nothing here is live on mainnet yet.
Introduction
BASKT is an index protocol on Robinhood Chain. Anyone picks listed tokens, sets weights and a fee, and seeds the basket with ETH. A basket can hold memecoins that graduated on Pons, Robinhood's tokenized stocks, or both at once. The basket is an ERC-20 token that anyone can buy and sell with ETH, up to the basket's deposit cap.
Two kinds of people use it. Curators build baskets and earn a fee, paid in wrapped ETH (WETH), every time someone buys or sells their basket. Buyers pick a basket instead of picking one token.
The protocol is a set of smart contracts on Robinhood Chain (chain id 4663) plus a web interface. The contracts hold the tokens; the interface only shows them. Everything a buyer can do through the interface can also be done directly against the contracts.
Status. The contracts are complete and reviewed internally; the interface and indexer are built. The protocol is not deployed on mainnet yet and the $BSKT token does not exist yet. See Status.
Concepts
| Term | Meaning |
|---|---|
| Basket (baskt) | A vault that holds 2 to 10 listed tokens at fixed weights, plus an ERC-20 token that represents shares of that vault. |
| Curator | The person who creates a basket: picks the tokens, the weights and the fee, and seeds it. Their address and every basket they launched are public. |
| Constituents | The tokens inside a basket: any asset listed in the registry. Tokens launched on Pons, Robinhood's tokenized stocks, protocol tokens such as INDEX, and the chain's base assets (WETH, USDG). WETH is ETH wrapped one to one and shows as ETH (WETH); withdrawing in kind gives you WETH. A basket can combine them. |
| Weights | The target split at creation, in basis points, between 1% and 50% per constituent, adding up to 100%. Weights never change after creation. |
| Share | One unit of the basket token. A share is a proportional claim on everything inside the vault at the moment you redeem it. Supply grows when someone buys and shrinks when someone sells. |
| Asset class | Every listed asset carries a class, crypto or stock. The class is a label, not a wall: a basket can hold both, so a curator can put four memes and two stocks in the same one. |
| Quote asset | The asset you pay with and get paid in. For crypto baskets it is ETH (WETH inside the contracts). |
| NAV per share | The value of what one share can claim, computed from the vault's reserves. It is what the interface displays. After the seed, the vault never uses a price to mint or burn shares. |
A share is not a fixed bundle of tokens. It is your shares / total shares of every reserve in the vault. If a constituent doubles, the share is worth more; if one goes to zero, the share loses that part and keeps the rest. Buying and selling against the vault does not change what existing holders own: the value per share never decreases because of another user's action.
Creating a basket
Creating and seeding happen in one transaction, paid in ETH. You never need to hold the constituents yourself.
- Pick 2 to 10 listed tokens: memes that graduated on Pons, tokenized stocks, or both. The contract checks that every one is listed; see Eligible tokens.
- Set the weights. Each between 1% and 50%, adding up to 100%.
- Set your fee. Between 0% and 10% per side, on entry and on exit. It is fixed at creation and cannot be raised later.
- Seed it with ETH. 0.004 ETH minimum. The router converts your ETH into the constituents at your weights and mints the first shares to you, one share per dollar deposited, valued with the pools' prices.
- Pay the creation fee. 0.0009 ETH at launch, to the protocol. Governance can change it through the timelock (see fees below).
| Rule | Value | Where it lives |
|---|---|---|
| Constituents | 2 to 10 | MIN_CONSTITUENTS, MAX_CONSTITUENTS |
| Weight per constituent | 1% to 50% | MIN_WEIGHT_BPS, MAX_WEIGHT_BPS |
| Minimum seed | 0.004 ETH | MIN_SEED_QUOTE |
| Creation fee | 0.0009 ETH | FeeController.creationFee |
| Curator fee | 0% to 10% per side, fixed at creation | MAX_CREATOR_FEE_BPS |
| Deposit cap | 20 times the seed, in shares, by default | defaultDepositCapMultiple, a governance parameter |
The seed deposit pays the protocol fee only, not the curator's own fee. When the curator later sells their shares, both fees apply like for anyone else.
Every basket starts with a deposit cap. Its total supply can grow to 20 times the shares of the seed, so a bigger seed gives a bigger cap. A buy that would go above it reverts until governance raises the cap, through the timelock. The curator can lower the cap, which stops new buys, but never raise it. The cap never limits selling or withdrawing.
A curator who changes their mind launches another basket. The old one stays as it is, and both appear on the curator's public profile with their dates.
Buying and selling
Buying
You send ETH to IndexRouter.mintWithETH. In one transaction the router wraps the ETH, splits it across the constituents according to the value of the vault's current reserves, swaps into each token on the DEX, deposits them into the vault and mints shares to you. Whatever the vault did not take comes back to you in the same transaction: unspent ETH as WETH, extra tokens as those tokens. The exception is dust: an extra amount under 0.2% of a leg (a governance setting, capped at 1% in the code) that is not clearly worth more than the gas to send it stays in the router, and governance can sweep it to the treasury. When two tokens of a basket trade through the same thin pool, what comes back can be a visible part of what you paid, and the fee was already charged on it; the app shows how much before you sign.
Shares are minted against what actually reached the vault, so the shares you receive are worth the NAV of what was deposited. What you pay also includes BASKT's fees, each pool's own fee and the price impact of the swaps. For a Pons meme, the pool's fee is Pons' own fee plus a creator tax chosen at launch, up to 10%: at most 11% per trade under Pons' current settings, paid to Pons and to the token's creator, not to BASKT.
Selling
You send shares to IndexRouter.redeemToETH. The vault burns them and hands the router your proportional part of every constituent; the router swaps each one back to ETH and sends you the ETH. redeemToQuote does the same and leaves you WETH instead.
Slippage
Both routes take a minimum you are willing to accept (minSharesOut on entry, a minimum ETH amount on exit) and revert if the swaps come out worse. Memecoin pools can be thin; large orders move them. Before you sign, the interface runs the whole trade through the router and undoes it, so two tokens that share a thin pool are priced the way they will really execute, one after the other. If the pools move between that simulation and your transaction, the trade can still come out below your minimum and revert. Nothing moves except the gas. Your tolerance is also the most you can lose to the price, including to someone who trades just before and just after you; the app starts at 1%.
An order larger than what a pool can absorb is rejected, not filled halfway. Some pools stop at a price limit and take only part of what you sent, which would leave the rest stranded and the quote flattering. The router refuses those trades instead, so the honest answer is "not that size against this pool" rather than a transaction that looks like it worked.
The vault never swaps. It only holds tokens and keeps the accounting. Swaps happen in the router, a separate and replaceable contract. If the router disappeared, holders could still deposit and withdraw directly against the vault.
Withdrawing the tokens
Selling to ETH is the comfortable exit. It is not the only one, and it is not the one the protocol's safety rests on.
IndexVault.withdraw(shares) burns your shares and sends you your proportional part of each constituent, as tokens (ETH held by a basket comes out as WETH). It reads no price, calls no DEX, and depends on no website or server. It works with the protocol paused, with the basket deprecated, with every oracle down and with the fee controller broken.
It is also tolerant to broken tokens. Each transfer runs on its own: if a constituent can no longer be transferred (a blacklist, a pause, an upgraded contract), that one is skipped, an event records it, and you receive all the others. One dead token cannot hold the other nine hostage.
The part you could not receive is set aside in your name. If the token starts moving again (a stock its issuer paused, for example), you can claim it later with IndexVault.reclamar(token), in any state of the vault. If it never moves again, that part is lost. Only you can claim it, and nobody can redirect it: if the address blocked by the issuer is yours, you claim it once you are unblocked, and if you would rather not wait, do not withdraw: the app shows before you sign which part would be set aside, and a direct call to withdraw with minimums reverts instead.
Burned tokens are different. If an issuer burns tokens the vault holds, there is nothing left to set aside: that token's reserve drops to what is really there, and every holder bears the loss in proportion to their shares, whatever the order in which they leave.
| Route | You receive | Depends on |
|---|---|---|
vault.withdraw() | The constituents, in proportion | Nothing. Always available after seeding |
router.redeemToETH() | ETH | DEX liquidity, every token in the basket being able to move, and the protocol not being paused |
router.redeemToQuote() | WETH | DEX liquidity, every token in the basket being able to move, and the protocol not being paused |
Fees
Fees are additive: the protocol charges its own and the curator charges theirs on top. The protocol never takes a cut of the curator's fee. When you buy or sell with ETH, both are paid in WETH (wrapped ETH) at the moment of the trade, to the curator's wallet and to the protocol treasury. Nothing to claim. If you use the vault directly with the tokens themselves, the fees are taken in shares of the basket instead.
| Fee | Who receives it | Amount | Cap in the contract |
|---|---|---|---|
| Creation | Protocol | 0.0009 ETH, once | Governance parameter |
| Entry and exit, protocol | Protocol treasury | 0.50% per side | 1% per side |
| Entry and exit, curator | Curator | 0% to 10% per side, set at creation | 10% per side |
| Total, BASKT's fees | 11% per side | ||
| Harvest | Protocol treasury | 0% at launch | 1% of what is harvested |
The caps are constants in the bytecode, not settings, and the vault checks them itself, including the curator fee when a basket is created. BASKT's fees on a basket can never add up to more than 11% per side, and the interface reads these limits from the contracts instead of hardcoding them. The harvest fee is a switch governance can turn on through the timelock; it is taken from the payouts a harvest takes in, never from what you deposited (see tokens that pay their holders).
Pool fees come on top. Every buy and sell swaps through each token's own pool, and that pool charges its own fee. For Pons memes that is Pons' fee plus a creator tax chosen at launch, up to 10% (11% in total at most under Pons' current settings), paid to Pons and to the token's creator, not to BASKT. BASKT's 11% cap covers BASKT's fees only.
Through the router, the protocol collects its fees in WETH and the creation fee in ETH, never in the tokens inside a basket.
Eligible tokens
A token has to be listed in the AssetRegistry before it can enter a basket, and there are three doors into that registry.
The open door, for Pons V2. It is the filter that does the work: listAsset asks the PonsProvenanceValidator to compare the token's code against the Pons contract we reviewed: same length, same hash, with only the values Pons sets at deployment masked. A token with different code, whatever it calls itself, is rejected, and nobody on our side approves anything.
A governed door, for the curated Pons V1 list. listAssetVia can only be called by the governor. It runs the same kind of bytecode check, through a V1 validator that governance approved, and emits AssetListedVia.
A governed door with a written reason, for base assets, protocol tokens and stocks. Some assets never came from a launchpad: WETH and USDG are the obvious ones, protocol tokens such as INDEX are others, and Robinhood's tokenized stocks are the rest. listCanonicalAsset can only be called by the governor, requires a written reason, and emits ProvenanceWaived with that reason onchain. It skips the provenance check, which is exactly why every use of it is public and permanently auditable.
Every listing that does not check the bytecode runs a transfer test first: whoever lists sends a small amount, the protocol passes it on to a burn address, and the token is refused if less arrives than was sent, which is what a token that charges a fee on transfer does. Pons tokens skip that test: their code is checked against the reviewed contract, and that code has no transfer fee.
Pons has had two generations, and they get in through different doors.
| GENERATION | HOW IT GETS IN | WHY |
|---|---|---|
| V2, the current one. Bonding curve, graduates into a Uniswap v4 pool | Self-service. Anyone lists a graduated token by calling AssetRegistry.listAsset. No curation on our side, nothing to apply for | A V2 token has no pool until it graduates, so "it has a pool" proves "it graduated". The contract can check it |
| V1, the older one, from the two factories we reviewed. No curve; the token launches straight into a locked Uniswap v3 pool | A curated list. Governance lists them in batches, and the same bytecode check applies to every one. The contract also refuses any V1 token whose pool holds less than 1 WETH | In V1 the pool exists from the first block, so having one proves nothing. Most V1 pools hold less than twenty dollars today. The list is the only filter that separates them. Pons deployed a third V1 factory in August 2026; its tokens are not eligible until it has been reviewed |
Every pair asset Pons allows, automatically. A Pons meme can trade against ETH, USDG, a tokenized stock, or even another meme. Pons publishes which pair assets it approved, on chain, and only Pons can change that list. When Pons approves a new one, anyone can propose it to BASKT without asking us, as long as it has a real pool against USDG to price it. If that pool is a Pons pool, whose liquidity is locked forever, it connects at once. If it is any other pool, it is checked for a full day before it connects: the fee has to be 1% or less, the money a trade can actually use has to be there every time it is sampled, at irregular times one to two hours apart, and the price has to hold steady and stay within 5% of the price BASKT already reads for that asset from its Uniswap v3 pool; a pair asset BASKT does not price there is connected by governance instead. The samples are taken by a protocol wallet, because a sample anyone could take could be faked with liquidity borrowed for one transaction. That wallet can delay a connection by not sampling, and since only a sampled pool can connect, it decides which of the pools that pass the checks prices the pair asset: our bot activates the one that is cheapest for a 200 USD trade, but a third party can activate another candidate that also passed first, and changing it is up to governance (48 h). It cannot connect a pool that fails the checks, and the guardian can take it off the job at once. If the pool is later emptied, or its price moves more than 5% away from the v3 price, three failed checks in a row by the same wallet, at most one an hour, pause new memes against it; a third party can also cause those failures by trading the pool just before each check, and reopening it is then up to governance (48 h). Memes launched against it open at once with the floor Pons publishes for that pair asset (its graduation threshold divided by 1,600), or, if Pons publishes none, once BASKT has a time weighted price for it; after that they can be listed the same way as the rest. That floor is Pons' to set, and governance's lasting lever on a pair asset is to close it. Tokenized stocks are pair assets too: about one Pons launch in six is against a stock, and those memes are priced through that stock's own pool and listed like any other. If a token you want is not listed yet, paste its address on the create page and add it yourself.
A V2 Pons token has no custom code: it is OpenZeppelin's ERC20 plus ERC20Burnable and nothing else. No blacklist, no pause, no mint function, no privileges for the deployer. A V1 token carries one extra thing, and we disassembled it to be sure of what it is: a cap on how much of the supply one wallet can hold or buy, active only during the two blocks after launch and dead forever after. No fee on transfers, no way to freeze anyone.
What this does not protect against. A Pons token can still go to zero, lose its liquidity, or be dumped by its creator. That is market risk, and a basket exists to take it. What the check rules out is the contract-level trap: a token that lets you buy but not sell.
Tokenized stocks
Stocks come through the governed door, and the reason is worth stating plainly. We read Robinhood's AccessControlsRegistry straight from its bytecode: it knows about blocked accounts and a global pause, and it has no list of assets. There is no contract on chain that can be asked "is this address one of your stock tokens", so provenance cannot be derived, and what cannot be derived is not accepted automatically. Anyone can deploy an ERC-20 called NVDA.
So every stock is listed one by one with listCanonicalAsset, which emits ProvenanceWaived with a written reason. Each listing is a public, permanent record you can read back, and the address of every listed stock can be checked against Robinhood's own published catalogue. On top of that a stock only lists if its pool is deep enough to get out of: it has to absorb about 5,000 USD of trading before its price moves 1%, measured by walking the liquidity the pool actually has around its price. For stocks priced from a Uniswap v3 pool, the contract adds its own check and refuses a pool holding less than 10,000 USDG, or the same value in ETH. In a full rehearsal of the launch against a copy of mainnet on Oct 4, 2026, with the bar then at 10,000 USD, 31 stocks passed. The day Robinhood publishes an asset registry on chain, stocks move to the open door like everything else.
Liquidity is the filter that matters for this class. A meme with a thin pool is a known risk that a curator takes on purpose; a stock nobody can exit is a different problem, and the floor is there so the exit exists before the asset does. The floor is checked on chain once, when the stock is listed. After that we watch the pools off chain, and moving a stock to a different pool is a governance decision that goes through the timelock, in public.
Each asset has one price, read from the same pool the router trades it through, so the price you see and the price you get come from the same place. ETH's dollar price comes from a Uniswap v3 WETH/USDG pool on Robinhood Chain, whose fee tier is fixed at deployment from the real depth measured in the days before, not chosen by whatever looks deepest in that block.
Stocks and memes live in the same universe. A basket can hold both, at whatever weights the curator sets, and it is priced and exited exactly like any other basket.
Protocol tokens
A basket can also hold protocol tokens such as INDEX. They come through the same governed door, one by one, each with its reason onchain, as the crypto class. They have their own bar, between the two: their pools are much deeper than a typical meme's and shallower than what a stock needs, so each one has to absorb about 400 USD of trading on its thinner side before its price moves 1%, and a token whose pools do not clear that bar is not listed until they do. A pool with a dynamic fee, where a hook can change the fee on every swap, is refused by the contract, and so is a pool whose hook acts on swaps. Some of them pay their holders, and what they pay reaches the basket and is converted like any other payment once the protocol can price it (until then it waits in the basket); see tokens that pay their holders.
What cannot change
These are design decisions, not features. They are the reason it is reasonable to buy a basket made by a stranger.
The composition
Once a basket is created, nobody can change what is inside it: not the curator, not governance, not the protocol. There is no rebalance function and no function to remove a constituent. A token that goes to zero stays in the basket as dead weight; holders can still withdraw the rest.
A curator who could rebalance could empty the basket and refill it with their own token after people bought. Not being able to is the point.
The accounting
After the seed, shares are minted and burned against the vault's internal reserves, never against a price. A manipulated oracle cannot mint unbacked shares or drain a basket. Prices are used in three places, none of which moves anyone else's money: to set the first share at 1 USD when a basket is seeded, to split a buyer's ETH between the tokens, and to check that a harvest does not convert far below the market price. The deposit cap is counted in shares (20 times the seed's), so a price pushed at seeding changes how many shares the cap is, not how much money fits under it.
Reserves are tracked internally, not read from balanceOf. Sending tokens directly to a vault does not move the value per share, and nobody can turn a donation into shares. Tokens sent to a vault by mistake are not returned to the sender. A token that is in the basket, sent by mistake, is added to the basket for all holders when it is harvested. Any other token is either converted into the basket by a harvest, if the protocol can price it, or moved to the protocol treasury by governance, one token at a time, after a public announcement and 30 days without a harvest (when the notice names only one basket token's share, without a harvest that buys that basket token). Anything that is in the basket's reserves can never be moved out by the protocol, governance or anyone else using the protocol, for any reason. The one exception is outside the protocol: the issuer of a tokenized stock can burn tokens a basket holds, and then the loss is shared by that basket's holders in proportion to their shares (see the risks). See tokens that pay their holders.
The exit
withdraw() works in every state after seeding, paused or deprecated, with every oracle down. A compromised guardian can stop the protocol; it cannot seize a single token.
Tokens that pay their holders
Pons lets a creator send their trading fees to the people holding the token instead of to themselves. It is a switch on the launch form, Creator fees go to holders, and it is popular: more than fifty thousand of these fee distributors had been deployed on the chain as of 15 Sep 2026. If you hold one of those tokens, you are being paid for holding it.
The payment does not arrive in the token. It arrives in whatever the token trades against, which is usually ETH. And you do not have to go and get it: the claim function takes the holder's address as an argument, and Pons runs a keeper that claims on everyone's behalf.
A basket is a holder like any other, so those payments arrive at the vault. Harvesting turns them into more of what the basket already holds, split at the weights the curator declared at creation (a payment that is already one of the basket's tokens is simply added to that token), so every share is worth more in proportion. It does not change which tokens are in the basket, it compounds them. There is nothing to claim: the value of every share goes up at once, and you get it when you sell or withdraw.
Harvesting is done by protocol wallets that governance authorizes, and only by them: a bot on our server, which checks every basket every hour (with more than 100 baskets, 100 per hour in turn) and harvests the payouts in each token once they are worth more than 10 USD (by default) and clearly more than the gas it costs, and a backup wallet of the team that can harvest from the web if the bot fails. Not the curator, and not the holders. It used to be open to anyone, and an internal review showed why it should not be: whoever harvests can move a thin pool in the same transaction and keep part of the fees, and no check inside the contract can see it. The defence is a minimum for each swap, quoted outside the transaction by someone who is not the attacker, so the harvester quotes every leg before signing. A minimum quoted outside the transaction does not see a price that was moved before it, so the bot also compares each leg's quote with the last one it accepted for that leg in the previous six hours, whatever the size of the harvest, and does not sign a leg that quotes more than 5% worse. Without such a quote it does not sign that leg on that run: the quote becomes the reference for the next run, an hour later. A leg that still quotes worse when its reference expires is not accepted at the new price by the clock: the bot reports it every run until the price comes back or the team accepts it. The swap route is the one registered in the protocol, not one chosen by the caller, and the basket's reserves are never touched: only the fees that arrived are swapped, and only what actually comes back is added. Each harvest must also receive, at oracle prices, at least 80% of what it spends, so a swap route that tried to keep the fees would fail. And the bot never forces a token's share through a pool too thin for it: a share that would move the price of its route by more than about 1% in one transaction waits, and later harvests can put it into the other tokens. While nothing is harvested, the fees stay in the vault and belong to the basket's holders, and withdrawing is not affected. The only way they can leave the vault without a harvest is the rule below. Governance can name another harvester through the timelock, and the guardian can take the role away from a wallet at once. The protocol takes nothing from a harvest at launch: the harvest fee is a switch, off, that governance can turn on through the timelock, at most 1% of the payouts a harvest takes in, a cap written in the vault's own code. Each basket page shows the fees that have arrived. Pons memes that pay their holders carry a pays holders tag, both in the basket and when you create one. Other tokens that pay, such as INDEX and BUCKET, do not carry it.
The safety net, and its limit. It exists for fees that cannot be converted, for example because a pair has no route. Governance can announce, through the timelock, that it will move a basket's unharvested fees in one token to the protocol treasury, and the announcement is public onchain. If nobody harvests that token in the 30 days that follow, governance can move them during the next 7 days, and never more than was there when it announced. A harvest in between cancels the announcement; after the 7 days it expires and has to be made again. Governance can also announce only the share of those fees meant for one token of the basket that cannot be bought (no route, paused): then it can move only that token's share, by its weight, and only a harvest that buys that token cancels the announcement; the regular harvests of the other tokens do not. It can only move tokens that are not in the basket, never a constituent or the reserves. Harvesting stays open even when the basket is paused or deprecated. Holders cannot cancel an announcement themselves, because only the protocol's harvester wallets can harvest: the fees reach holders when one of them harvests.
How much this adds depends on each token's fee and on how much it trades, and there is no fixed rate. Harvesting also has a cost: every harvest swaps through the same pools, paying their fees and, on a Pons token with a creator tax, that tax too.
Governance
Roles are separate. Every role that can change parameters, list assets or pause is held by a multisig, from the governance handover on. During the deployment, for a few hours before that handover, a single-use deployer wallet holds them; the app opens after the handover. The only externally owned accounts with a role are the two harvester wallets, a server bot and a team backup: they convert the payouts waiting in a basket (see tokens that pay their holders), and the bot's wallet also samples the pools of new pair assets (see eligible tokens). Neither can move anyone's funds. The router, a contract, holds the role that lets it create, seed, buy and sell on behalf of the person who signs.
| Who | Can | Cannot |
|---|---|---|
| Governor, Safe 2/3 behind a 48 h timelock | Change protocol parameters (fees within the caps, listing rules), list Pons V1 tokens and, with a reason emitted onchain, base assets, protocol tokens and tokenized stocks, turn on stocks in baskets, replace the router and adapters, name the wallets that harvest fees, turn on the harvest fee (at most 1%), raise a basket's deposit cap, deprecate a basket, and, after a public 30-day notice with no harvest in between (with no harvest that buys that token, when the notice names one token's share), move to the treasury tokens a vault holds that are not in its basket (unharvested fees, tokens sent by mistake) | Touch reserves, touch anything that is in a basket, change a basket's composition, block withdrawals |
| Guardian, Safe 2/3 | Pause, and take away at once a bot wallet's right to harvest and to sample pair-asset pools, from the moment the team knows: the harvest bot reports every harvest it did not sign on its next hourly run | Unpause, grant any role, move anything |
| Harvester wallets: a server bot and a team backup | Convert the payouts waiting in a basket into more of its tokens, with a minimum per leg and an 80% floor at oracle prices. The bot also samples the pools of new pair assets, which decides which of the pools that pass the checks prices one | Touch reserves, take anything out of a basket, choose the swap route |
| Router, a contract | Create, seed, buy and sell on behalf of the person who signs; it charges BASKT's fees in WETH instead of in shares | Seed someone else's basket, act on anyone else's shares |
| Curator | Create baskets, earn the fee they set, set their basket's metadata URI through the contract (the app does not show or edit it yet), lower its deposit cap | Change a basket's tokens, weights or fee after creation, raise the cap, block exits |
A basket has four states: PENDING_SEED (created, no liquidity yet), ACTIVE, PAUSED (no new deposits; withdrawals work) and DEPRECATED (terminal; no new deposits; withdrawals work forever). Nothing confiscates anything in any state.
Every parameter change goes through the timelock: the governance multisig proposes, the proposal waits 48 hours in public, and the same multisig executes it. Adding to the Pons V1 list goes through the timelock like everything else. The multisig acts directly only to put labels on baskets in the registry (curated, risk flags) and to name the guardian. The caps on fees are constants in the bytecode and are outside governance entirely.
$BSKT
$BSKT is the protocol's token. It launches on Pons like every other token on the chain: no presale, no VC round, no team allocation, no vesting for insiders.
10% of the supply is set aside for the Genesis community, the people who took part in the pre-launch campaign. There are no team tokens to take it from, so it is bought at the $BSKT launch, as the launcher's initial buy on the Pons curve (the dev buy), paid with the fees the protocol collected before launch and, where those fall short, by us. We publish the wallet that holds it the day it is bought. It is distributed under rules we publish before the distribution, and it goes to users, never to a team or a private round. The 10% is the size of the pool, not a promise of an amount to any wallet. See the Genesis campaign terms.
Buyback and burn: 80% of revenue, in two phases. Phase one, before $BSKT exists. There is nothing to buy or burn, so fees go to a multisig treasury. That treasury funds the $BSKT launch and the purchase of the 10% of supply set aside for Genesis participants; the size of that pool does not depend on what the fees cover, because whatever they do not cover we pay ourselves. Phase two, from the $BSKT launch. The treasury becomes a contract that splits the fees the protocol collects in ETH and WETH 80% to buying $BSKT and burning it, 20% to operations, with a floor in the code that stops governance taking the buyback share below 20%. Anything else that reaches the treasury (basket shares from direct vault use, recovered tokens, dust) goes to operations. The buying contract calls burn(), which lowers totalSupply: not a transfer to a dead address, the supply goes down and anyone can read it from the contract. Both the split and the buyback are permissionless: anyone can call them, so the 80% does not depend on us remembering. Neither runs on its own. Every split emits an event carrying both amounts and the split used, which is what the public counter reads. The buying contract has no withdrawal function; governance can change, through the 48 hour timelock, the route and the price source it buys with, so that commitment rests on the timelock as well as on the code.
Contracts
Solidity 0.8.28, OpenZeppelin 5.1, Foundry. Chain id 4663 (testnet 46630). Explorer: robinhoodchain.blockscout.com.
| Contract | Role |
|---|---|
| BasktProtocol | Address book and roles: governor, guardian, curator |
| AssetRegistry | Which tokens can enter a basket. Three doors: self-service for Pons V2, a governed curated list for V1, and a governed door for base assets, protocol tokens and stocks that logs its reason |
| FeeController | Fee parameters. The caps are constants in the bytecode |
| IndexFactory | Validates and clones new baskets |
| IndexRegistry | Canonical directory of baskets. Integrators check isCanonical() |
| IndexVault | Custody and accounting. The critical contract |
| IndexToken | The basket's ERC-20. No tax, no hooks, no pause |
| NAVOracle | Valuation for display. Reverts entirely if a single price is unusable |
| PonsProvenanceValidator | Checks that a token came from Pons, by bytecode |
| UniV4TwapAdapter, UniV3SpotAdapter, StablePegAdapter | Prices, read from the pools themselves: Uniswap v4 for Pons V2, v3 for Pons V1, and for each tokenized stock the v3 or v4 pool it was listed with. ETH in dollars comes from a Uniswap v3 WETH/USDG pool whose fee tier is fixed at deployment from the depth measured in the days before. USDG counts as one dollar. No external price feed on the path |
| ConectorDeQuotes | Connects a pair asset that Pons approved, without a governance vote. See eligible tokens |
| IndexRouter | Create and seed, buy and sell with ETH. Holds nothing between transactions except dust below the return threshold |
Addresses: published here at mainnet launch, together with the verified source on the explorer. Integrators: the protocol reference has the calls, quotes, state, events and errors.
Tests and reviews: Over 1,500 contract tests, plus 46 more that run against a copy of mainnet. Fourteen review passes, six internal and eight AI-assisted, all closed, with their proof-of-concept exploits fixed and most findings regression-tested. The last one, before mainnet, ended by checking every fix against its proof of concept. The deployment scripts have been rehearsed end to end against a local copy of the chain, with real transactions. No external audit yet; it is on the roadmap.
License: the core contracts are under BUSL-1.1, which turns into GPL-2.0-or-later on Oct 1, 2028. The interfaces, and the shared types and errors they use, are under MIT, so anyone can integrate; one library derived from Uniswap keeps its GPL-2.0-or-later license. The interface, indexer and tools are not licensed for reuse.
Risks
- Tokens are volatile. A basket can lose most or all of its value. A constituent going to zero stays in the basket.
- No rebalancing. Weights drift with prices. A basket that started 50/50 can end up 95/5. That is by design.
- Thin liquidity. Buying and selling to ETH goes through DEX pools. Large orders move prices, and an order bigger than a pool is rejected rather than half filled; a dead pool means you exit in tokens, not in ETH. The app simulates the whole trade before you sign; if the pools move before your transaction lands, it can still revert, and then nothing moves except the gas.
- Pool fees and Pons taxes. On top of BASKT's fees, every buy and sell pays each pool's own fee. For a Pons meme that is Pons' fee plus a creator tax chosen at launch, up to 10% (11% in total at most under Pons' current settings), paid to Pons and to the creator. BASKT's 11% cap covers BASKT's fees only.
- Deposit cap. Every basket can only grow to 20 times its seed, in shares, until governance raises the cap. Above it, buys revert. Selling and withdrawing are never capped.
- Tokens that pay their holders. If a constituent shares its trading fees with holders, those payments arrive at the vault and count toward the value of a share only once they are harvested. A harvest swaps them through the pools, so a thin pool gives a worse conversion. Only the protocol's harvester wallets can harvest. Someone who enters right before a harvest and leaves right after takes part of the payouts that were waiting; after fees that only pays when the waiting payouts are above about 1% of the basket with no curator fee (about 1.6% with a 0.30% curator fee, more with a higher one, and about 1% for the curator, whose own fee comes back to them), and the bot checks every basket every hour (with more than 100 baskets, 100 per hour in turn), and harvests the payouts in each token once they are worth more than 10 USD (by default). Governance can announce that it will move to the treasury unharvested payouts in a token that is not in the basket, and if nobody harvests them in the following 30 days, it can move them; payouts in the basket's own tokens can only be harvested. See tokens that pay their holders.
- Broken constituents. A token whose transfers stop working is skipped on withdrawal and you receive the rest. That part is set aside in your name: if the token moves again, you can claim it with
reclamar; if it never does, it is lost. If an issuer burns tokens the vault holds, the loss is shared by every holder in proportion. - Tokenized stocks. The issuer can pause or block its token, and the price is the pool's, not the stock market's. A token that starts charging a fee on transfer after it is listed closes buying and selling its baskets through the router; withdrawing the tokens keeps working. See the risk disclosure.
- The swap route can be replaced. Governance can replace the route the router swaps through, after the 48 hour timelock. A hostile route could keep part of every buy and sell through the router; the app values each trade before you sign and refuses when what you get is worth too little, and withdrawing the tokens never uses the route.
- Rankings can be pushed. Performance is read from pool prices, and a curator can move a thin pool: in a test run on Oct 7, 2026, holding a buy of about 3,300 USD in one meme's pool showed +45% for a basket half in that meme, with nothing else moving, and undoing the buy cost about 640 USD. Sending a basket tokens of its own constituents also lifts it, since they are harvested like any payout, and Top performers ranks baskets by their return since launch, whatever their size, so a small basket can top it that way (the risk page has the figures). Check what is inside a basket, not only its ranking.
- Smart-contract risk. The contracts are reviewed internally and tested, not yet audited externally. Code can have bugs.
- Curator fees. Up to 10% per side. Check the fee before buying; it is shown on every basket and cannot be raised after creation.
Nothing on this site is a recommendation to buy anything.
FAQ
- Can the curator change the basket after I buy?
- No. Nobody can. There is no function for it in the contracts.
- What happens if one of the tokens goes to zero?
- It stays in the basket and your share is worth less. You can still withdraw your part of the other tokens.
- Can I get the tokens instead of ETH?
- Yes.
withdraw()gives you your proportional part of every constituent, as tokens, with no DEX involved. - Is the price of a basket its NAV?
- The shares you receive are priced at the NAV of what reached the vault: you mint and redeem against the vault, not against a market for the basket token. What you pay also includes BASKT's fees, each pool's fee and price impact. A DEX pool for a basket token is optional and would come later.
- Do I need to hold the tokens to create a basket?
- No. You seed with ETH and the router buys the constituents for you in the same transaction.
- Can a basket mix memes and stocks?
- Yes. A curator can put memecoins and tokenized stocks in the same basket, at whatever weights they choose. See eligible tokens.
- Who can list a token?
- Anyone, if it is a graduated Pons V2 token whose bytecode matches. There is no application. Pons V1 tokens are listed by governance from a curated list. Base assets like WETH and USDG, protocol tokens like INDEX, and tokenized stocks come through the governed door,
listCanonicalAsset, which requires a written reason and emits it onchain. - The meme I hold pays me fees. Do I keep them inside a basket?
- They go to the basket, shared with every holder, once they are harvested. Pons claims them for the vault automatically, and a harvest by one of the protocol's harvester wallets turns them into more of the basket, which raises the value of every share. Fees nobody harvests can be moved to the treasury after a public 30-day notice. See tokens that pay their holders.
- What does the protocol do with its fees?
- Until $BSKT exists, to a multisig treasury that funds the token launch and the 10% for the Genesis community. From the $BSKT launch, to a contract that splits them 80% to buying $BSKT and burning it and 20% to operations. See $BSKT.
- Is BASKT audited?
- Not by an outside firm yet. Fourteen review passes are closed, the last one checking every fix against its proof of concept, with over 1,500 contract tests plus 46 against a copy of mainnet.
Status
| Piece | State |
|---|---|
| Protocol contracts | Complete. Over 1,500 contract tests, plus 46 against a copy of mainnet. Fourteen review passes, all closed. Deployment rehearsed end to end. External audit: not yet |
| Interface | Built. Explore, create, buy, sell, curator profiles |
| Indexer | Built |
| Testnet | Private testnet complete. Deployed and verified on Robinhood testnet (46630), end-to-end test passed. No public testnet: the testnet cannot reproduce Pons, the tokenized stocks or real liquidity, so every deployment script is rehearsed against a copy of mainnet instead, and mainnet opens guarded (a few days with the team's own small baskets, a deposit cap of 20 times the seed per basket, and the guardian able to pause) |
| Tokenized stocks | Supported. Listed one by one by governance, each with its reason on chain, and only if its pool can take about 5,000 USD of trading before moving 1%. 31 passed in our Oct 4 rehearsal, with the bar then at 10,000 |
| Mainnet | Coming soon |
| Genesis campaign | Pre-registration opens Sep 22, 2026 at 18:00 UTC and closes Sep 25 at 18:00 UTC. Phase 0 runs Sep 25 to Oct 5, 2026, ten quests, closing together Oct 5 at 18:00 UTC. 10% of the $BSKT supply is set aside for the Genesis community, bought at the token launch and distributed under rules published before the distribution. See the Genesis campaign terms |
| $BSKT token | Does not exist yet. It will launch on Pons. The date will be announced on X |
| Buyback and burn | From the $BSKT launch. Until then, fees go to the multisig treasury |
Questions: contact@onchainbaskt.com, @onchainbaskt or the Telegram.
© 2026 BASKT · Built on Robinhood Chain, on top of Pons · onchainbaskt.com