In your wallet
0
BUBBLE, free to move
Moving between states costs 2%. What it costs goes to the states you did not join, split so that the least crowded one takes the largest share. There is no yield here from anywhere else: what you receive comes from someone who moved.
Where the next toll would go
These shares are read from the chain, live, and they move every time anyone enters, shifts or leaves. A state holding nothing shows 0% and not the largest share, because there is nobody in it to pay. Being the first one in is the whole game.
What you hold, where it sits, when it can move, and what it has earned from other people's movement.
In your wallet
0
BUBBLE, free to move
Earned, not yet taken
0
Neither locked nor tolled. It is yours the moment it lands.
Four paragraphs, and then you have read all of it.
The rule
You put BUBBLE into one of three states. Entering costs nothing. Changing state costs 2%, and so does leaving, because leaving is also a change of state.
That 2% does not go to us. Nine tenths of it is paid to the states you did not join, and one tenth goes to a single address written into the contract at deploy, which can never point anywhere else.
Why the emptiest state wins
The toll is not split evenly, and not by deposits either. Each state's share is inversely proportional to how crowded it already is, weighted by what it asks you to give up.
An almost empty state is worth roughly eleven times a state holding everything. So the best place to be is always the one everybody just left, and there is no resting point. The state is changing.
What each state costs you
The three states do not differ by a rate. They differ by what you accept to give up, and that is the only reason one weighs more than another.
SOLID locks for seven days and weighs 3. FLUID locks for a day and weighs 2. LIQUID never locks and weighs 1. A lock does not protect you: it protects everyone else from you taking back your share of their toll.
The token
BUBBLE, one billion, minted once. No transfer tax, no owner, no mint, no blocklist. A transfer does exactly what its name says, which is what a v3 pool needs and what a scanner reads cleanly.
The toll lives in the Surface contract, never in transfer. The
logo is carried on-chain by contractURI(), baked at deploy.
Toll
2%
flat, both ways, no setter
To the states
90%
of every toll
Owner
none
not a role, not an address
Oracle
none
nothing to manipulate
Where it lives
The mechanism is small enough that nothing needs hiding. Here is the whole of it, including the parts that are not flattering.
The one that matters most
This is not yield. It is redistribution. Every BUBBLE you receive was paid by someone who moved. Between participants, minus the tenth that goes to the protocol, it is zero sum: if you gain, someone else paid.
There is no treasury behind it, no emissions, no fee stream from somewhere else. No page here will ever show you an APY, because there is nothing that could produce one.
No movement, nothing paid
The toll only exists when somebody changes state. A quiet room produces nothing and pays nobody, for as long as it stays quiet.
We did not write a function that could promise otherwise, and one could not exist without a source of value we do not have.
A lock does not protect you
SOLID protects the others from you. For seven days you cannot take back your share of their toll, and that is exactly what its weight of 3 is paying for.
If the crowd moves to the state you just left, you will watch it pay more than yours until your lock expires. That is the cost, and it is the whole cost.
An empty state pays nothing
The largest weight belongs to the emptiest state, but a state with nobody in it has nobody to pay, so it shows 0%.
You capture that weight by entering, not by watching. The first one in is briefly alone in a room with the largest share, and that is the game.
What we can take, and what we cannot
One tenth of every toll goes to one address, written into the contract at deploy. It has no setter, so it can never point anywhere else. Anyone can push it there.
There is also skim(), which sends tokens that were mailed to the contract by
accident to that same address. It is computed as the balance minus everything owed,
so it reads zero unless something is genuinely in excess: it cannot reach a
holder's deposit or a holder's unclaimed earnings, and a test asserts exactly that.
What has no owner at all
Nobody can pause this, upgrade it, change the toll, change the weights, change the locks, or move a deposit. Those are not permissions we chose not to use — they were never written.
The flip side is honest: if something is wrong in this code, nobody can fix it either, and your exit is the only thing anyone can rely on.
New code, and what that is worth
These contracts are tested and untested by the world. The suite is public and it is the only reason to believe any of the sentences above: it proves the toll is 2%, that it reaches the states you did not join, that the emptiest one takes the largest share, that a lock is real, that everyone can take everything out, and that the last one to leave pays nothing, because there would be nobody left to pay.
Two bugs were found by those tests and not by reading: a weight that collapsed to
zero in integer division, which made the toll silently disappear, and an accounting
gap that would have let skim() reach money owed to holders. Both are fixed
and both now have a test that fails if they come back. There is no reason to assume they
were the last two.