The bond
The moment a coin stops being backed by dollars and starts being backed by a leveraged tracker of a real stock.
The threshold
Once a coin's own pool holds $15,000 of USDC principal — the USDC buyers paid in, not counting unclaimed fees — it is eligible. That value is set when the launchpad is deployed, has no function to change it, and is public — read it rather than trusting a number written on a website:
launchpad.bond_threshold() → "15000000000" (15,000 USDC, 6 decimals)
launchpad.config().bond_backing_usdc → the sameThe coin page shows progress as "$X of $15,000 in the pool"; the board states the same moment as a market cap — see Reading a coin page for why the supply cancels out of that conversion entirely.
Anyone triggers it
bond(coin) is permissionless. The coin page offers the button once the threshold is met; the caller attaches 0.05 NEAR (the new position's storage on Rhea and Rhea's registration on the tracker) and the maximum gas, 1 PGas. Nobody decides whether a coin bonds — the threshold does — and every caller gets exactly the same result.
That is deliberate. A migration that depended on us running a bot would be a migration that stops when our bot stops. Whether the protocol's own keeper will also send bonds automatically on NEAR is not settled yet; nothing depends on it.
What happens, step by step
NEAR has no transaction spanning several contracts, so the bond is a chain of recorded steps, a few seconds end to end:
- Read. The launchpad reads the coin's position, its pool and the tracker's NAV. If the pool is short of the threshold, or the tracker has no usable NAV, the bond stops here and nothing has moved.
- Remove. The entire position comes out of the
COIN / USDCpool, principal and unclaimed fees together. The fees are booked 70/30 like any other. - Mint. The USDC principal mints the coin's leveraged tracker at its NAV, at the tracker's vault. The USDC lands in the vault.
- Deposit and add. The coin's
COIN / TRACKERpool — created, empty, at launch, so nobody could create it first — is moved to the same dollar price and the whole float goes back in, with the tracker, in one position owned by the launchpad under the same rules. - Bid band. The tracker the main position cannot take goes into a second, tracker-only position one grid step wide, right above the price: bid depth under the coin, as the USDC was before the bond.
Holders do nothing. Their tokens never move, their balances do not change, and the dollar price of the coin is the same on both sides. What changes is what stands behind it — and from then on, the coin's own trading is what funds its hedge.
For the few seconds between steps 2 and 4, the coin is in neither pool and cannot be traded. If a step fails, the bond waits at that step with everything inside the launchpad, and resume_bond(coin) — anyone, 400 TGas — continues it. Only one coin can bond onto a given tracker at a time.
The coin side goes back in whole, less rounding dust (burned) and a reserve of 1,000 units (about 10⁻¹⁵ of a coin) the launchpad keeps to move an empty pool's price back. The tracker side cannot always fit exactly, because the ranges are aligned to the pool's grid: in the first sandbox bond the main position took 70% of the tracker, before the bid band existed; with it, less than 0.1% is left over. That remainder is booked to the protocol rather than left stranded, and redeeming it at the vault undoes the dilution it would otherwise cause.
And then the hedge
A tracker starts life bond-gated: while it is, its NAV is pinned at exactly 1.0 and its vault refuses to send anything to the venue (fund_hedge fails with "not bonded"). So a coin that bonds onto a tracker that is still gated mints it at 1.0, and its USDC waits in the vault as plain dollars.
A tracker bonds on its own condition: once its USDC reference pool holds $20,000 (the factory's bond_depth_usdc, set at deployment), anyone can call poke_bond(tracker) on the factory, which reads the pool's depth on chain and flips the tracker to bonded. From then on its NAV follows the keeper's signed posts, and USDC above the vault's idle buffer can be sent to the venue, where it becomes a position on Hyperliquid at the tracker's multiple. The factory's owner can also bond a tracker directly — meant for a reference pool seeded some other way — and that is visible as the same event. How the money travels, and who holds which key, is in The hedge book.
The price, carried across
The new pool has to open at the same value in dollars, but its quote is now worth NAV rather than one dollar. In Rhea DCL's points that is a shift, not a multiplication: the coin/tracker point is the coin/USDC point plus log_1.0001 of "raw USDC per raw tracker at this NAV" (NAV · 10^6 / 10^36). At NAV 1.0 that is about −276,324 points; the sign is negative because a unit of tracker is worth a trillion more raw units than a unit of USDC.
What the contract guarantees
| Once per coin | only a live, USDC-quoted coin with no bond in progress can start one |
| Only its own tracker | fixed at launch, not chosen by the caller |
| Everything goes back in | the coin has no path out of the launchpad except the pool, a dust burn and the 1,000-unit reserve |
| Nothing lost on failure | every step is recorded and resumable by anyone; nothing is left outside the launchpad |
| Trigger | permissionless, 0.05 NEAR |
Where the new range comes from
The new position's range is derived from the amounts actually withdrawn and the NAV, and aligned to the pool's grid — not carried over from the old pool.
That is not a detail. Carrying the old lower bound over and rounding it the wrong way widens the band beneath the current price, which means the position needs dollars it does not have — and the deposit strands coin. That bug shipped once, on a deployment before Avalanche, and broke a live bond; the NEAR bond is tested in a sandbox running the real Rhea DCL code (version 2.3.13), which bonds a coin and checks the whole float comes back.