value
price
supply
burned
Value is price from Birdeye multiplied by the live supply read from the mint. Candles cover the last 24 hours at 15 minute steps.

What afloat is

afloat is one coin and one program. The coin has a fixed supply of one billion and trades wherever Solana coins trade. The program owns the coin's creator fee account and is called the hull, because that is what it does: it sits under the coin and keeps it up.

Every claim of creator fees is swapped into one of three paired tokens and locked in a vault the program controls. There are three vaults, called tanks, holding USDC, SOL and ZEC. Nothing leaves a tank except to buy the coin back or to pay the coin's holders, and both of those only happen when a trade big enough to count lands in the pool.

There are no timers, epochs or schedules anywhere in the program. Every state change is caused by a trade. The program reads the pool's reserves, measures how much they moved since it last looked, and fires only if the move is large enough. Anyone can press the crank; a bot presses it so you do not have to.

Below, each piece is explained next to the live numbers it produces. The numbers are read from the program's own accounts on Solana and from Birdeye. If a number is missing, the thing it describes has not happened yet.

The hull

The hull is three tanks. Each claim of creator fees arrives as SOL and is routed to whichever tank is furthest below its target share of the hull, then swapped into that tank's token and deposited. The target shares are 40% USDC, 35% SOL and 25% ZEC. USDC is there so the hull keeps a floor in flat money, SOL so it rises with the chain it lives on, and ZEC so part of the hull is uncorrelated with both. When the program spends from a tank it records the tank's cost basis in SOL at fill, so the site can show which tank has gained most since it was filled. That gain is what decides which tank fires.

tankbalancevalue in SOLcost basis SOLgainfillsspends
USDC
SOL
ZEC
hull value in SOL
floor reserve
target shares
40 / 35 / 25
USDCSOLZECsurface
Compartment fill is each tank's share of the hull's value in SOL, scaled so the fullest tank reaches the surface line.

The waterline

The waterline is a price the program remembers. It is set the first time the hull claims fees, at the pool price in that slot, and from then on it can only rise. When a buy wave lands and the price is above the waterline, the waterline moves up by one eighth of the distance between them. It never moves down and it never moves on a sell.

Everything else is measured against it. If the price is above the waterline the gap is called freeboard. If the price is below it the gap is called draft, as a fraction of the waterline. Draft is what sizes the hull's buys and what gives a buyer their depth factor. A price exactly at the waterline, or within half a percent either side, is trim, and in trim nothing fires.

waterline
freeboard
draft
mode
raises
waterlinebreach
slotprice beforeprice afterwaterline beforewaterline afterstep

Displacement

A trade's size is measured as displacement: how many tokens the pool's token reserve moved since the program last recorded it, divided by the supply. Forty basis points of supply is the threshold. Below it, the crank instruction refuses to run and nothing changes. At or above it, the move is a wave, and the crank records the new reserves, the price, the draft and whatever it did about it.

Because displacement is read from the pool reserves and not from a feed or an indexer, the measurement is the same for everyone and can be checked by anyone with an RPC node. The crank is permissionless. A bot watches the pool and presses it the moment a trade clears the threshold, but anybody could.

Last wave
register head
slotkinddisplacementpricedraftactionamounttank

All 256 recorded waves are on the register page.

Buying against the sell

When a sell wave lands below the waterline the hull answers it. The spend is the hull's value in SOL multiplied by the draft and by one half, capped at one fifth of the chosen tank. The chosen tank is the one whose value has gained most against its cost basis since it was filled, so the hull always sells its strongest asset to buy the coin. The coin it buys is burned in the same instruction. Supply falls, the hull's share of what remains rises, and the next wave is measured against a smaller supply.

The table shows what the hull would spend right now at each draft, from the live hull value and the live tank balances. It is arithmetic on real numbers, not a forecast.

draftuncapped spend SOLcap, 20% of spend SOLtokens at live priceshare of supply
5%
10%
15%
20%
30%
40%
50%
60%
selected tank
its gain
total bought back
total burned

Who kept it afloat

Holders are paid in the paired token out of the hull. On a buy wave above the waterline the program releases two percent of the selected tank into a payout round. The round is split by weight, and a wallet's weight is its balance multiplied by its depth factor.

The depth factor rewards buying under the waterline. It is one plus four times the wallet's average entry draft, so a wallet that bought everything at a forty percent draft carries a factor of 2.6 and a wallet that bought at the waterline carries 1.0. The cap is 5.0. Selling any amount resets the wallet's factor to 1.0; the balance keeps its weight, the depth is gone. There is no time in the formula, only where you bought relative to the waterline.

The payout bot computes each round from the on chain trades and holder balances, publishes the round's merkle root and totals in a round account the program owns, and then sends the tokens. The root is what you check.

entry draftfactorweight per 1,000,000 tokens
0%1.001,000,000
10%1.401,400,000
20%1.801,800,000
30%2.202,200,000
40%2.602,600,000
50%3.003,000,000
60%3.403,400,000
100%5.005,000,000
factor = min(5, 1 + 4 × average entry draft). Weight = balance × factor.
Last payout round
rounds so far
paid out in total

Every round is listed on the register page.

Breach and refloat

If the draft reaches sixty percent the coin is breached. The waterline freezes where it is. The hull stops paying holders and defends: on each sell wave it spends as above, but it will not take any tank below the floor reserve, which is thirty percent of the hull's value in SOL at the moment of the breach. The floor is recorded in the state account the moment it is set, so it cannot be moved afterwards.

A breach closes when a buy wave carries the price back over the frozen waterline. That is the refloat. The waterline unfreezes, payouts resume, and the breach is written to the register with its deepest draft, the number of waves it lasted and what the hull spent inside it. Breaches never leave the register.

breaches
open breach
floor reserve
spent inside breaches
opened at slotclosed at slotdeepest draftwavesspent SOLburned

Reading the program yourself

Everything above is decoded in your browser from one program account and a handful of token accounts. You can do the same with any RPC node. The state account is a program derived address with the seeds "hull" and the coin's mint, under the program id. Its layout is fixed and written out here, offsets in bytes, all integers little endian.

program
state account
coin mint
USDC vault
SOL vault
ZEC vault
pool token vault
offsetsizefieldmeaning
08discriminatorAnchor account discriminator
832mintthe coin's mint
4032pool_token_vaultthe pool's token account for the coin
721bumpPDA bump
731mode0 buoyant, 1 trim, 2 submerged, 3 breached, 4 refloated
748waterlinelamports per 1,000,000 base units
828last_pricesame units, at the last crank
908last_token_reservepool token reserve at the last crank, base units
988last_slotslot of the last crank
1068total_boughtcoin base units bought back
1148total_burnedcoin base units burned
1228wave_countwaves since creation
1308breach_countclosed breaches
1388breach_open_wavewave index that opened the open breach, 0 if none
1468floor_reservelamports
1548spent_in_breacheslamports, cumulative
1628hull_valuelamports, at the last crank
1708round_countpayout rounds published
17824paid_total[3]three u64, cumulative payouts per tank in that tank's base units
20232register_headhash chaining every wave record
2342ring_headindex of the newest ring entry
236270tanks[3]three tank records of 90 bytes each
50610240waves[256]256 wave records of 40 bytes each
107461536breaches[32]32 breach records of 48 bytes each

Tank record

offsetsizefieldmeaning
032mint32
3232vault32
648value_lamportsu64
728cost_basis_lamportsu64
802target_weight_bpsu16
824fillsu32
864spendsu32

Wave record

offsetsizefieldmeaning
08slotu64
81kindu8, 0 buy, 1 sell
91actionu8, 0 nothing, 1 raised, 2 bought, 3 paid
101tanku8, 0 USDC, 1 SOL, 2 ZEC, 255 none
111padu8
122displacement_bpsu16
142draft_bpsi16, negative means freeboard
168priceu64
248amountu64
328waterline_afteru64

Breach record

offsetsizefieldmeaning
08opened_slotu64
88closed_slotu64, 0 while open
162deepest_draft_bpsu16
186pad6
244wavesu32
284pad4
328spent_lamportsu64
408burnedu64

Round account

offsetsizefieldmeaning
08discriminator8
88indexu64
168slotu64
241tanku8
257pad7
328totalu64
404recipientsu32
444pad4
4832root32

The arithmetic, with today's numbers

These sentences are filled from the live values on this page. They change only when the values change.

What afloat is not

The hull does not hold the coin. Everything it buys is burned in the same instruction, so there is no program owned supply that could be sold later. The tanks hold USDC, SOL and ZEC and nothing else.

The waterline is not a price target and not a promise. It is a record of where buy waves have carried the price, and it is the only thing the hull measures against. A coin can sit under its waterline for as long as sellers keep it there; the hull spends against each sell wave in proportion to the draft and never all at once.

The depth factor is not a lock. Nobody's tokens are held. Selling simply returns a wallet's factor to one.

Nothing here runs on a clock. If no trade clears the threshold, nothing happens, however long that takes.

The ZEC in the hull is the bridged ZEC on Solana, not native Zcash, and it trades in thinner pools than USDC or SOL, so the ZEC tank's value in SOL moves more per trade than the other two. The trim rule takes that into account only by measuring gain, not by measuring liquidity.