The permanent bid
k can only go up, and nobody can take it out. The one rule a stranger can verify — and the boundary it doesn't cross.
Demand, stripped to its essentials, is someone willing to buy when you sell. Every asset asks you to trust that this someone appears — usually a safe bet, right up until it matters. ODIN's answer is to make the buyer a contract instead of a person.
The rule#
In a V2 pool the reserves hold x · y = k, and the swap fee stays inside — so k grows on every trade: buys, sells, arbitrage, MEV, all of it. Normally a liquidity provider can withdraw k. ODIN's sixteen LPs are unreachable, so that exit is gone.
kcan only go up. Every trade permanently increases it, and no one can ever take it out.
Three properties make the rule hard to game:
-
No exit path#
The LP tokens sit at a dead address — fourteen pools directly, ODIN/TSUKA through burned lock ownership, the sink through the spValhalla chain. The withdrawal function can never be called on the originally locked liquidity.
-
No discretion inside ODIN#
No admin, no governance, no ODIN fee switch. No human in the loop to persuade, pressure, bribe, or impersonate.
-
Adversaries pay in#
Any attack routes through swaps, and every swap pays fees into locked reserves. The only way to attack ODIN is to pay it.
The formal statement#
The network invariant is the product of all sixteen pool invariants:
No term is redeemable, so dK/dt ≥ 0 always. Decomposed over trades:
over every trade τ ever executed, each leaving its fee in reserves, so every ε > 0. K is the running product of every trade that has ever touched the network, and no inverse operation exists.
The executable bid in pool i for a sell of size Δ:
It always exists, improves as k grows, and is never withdrawable. The bid is a consequence of the arrangement, not a promise about behaviour.
The bid survives the climb#
What happens if ODIN actually goes up a lot?
A typical token is born with one LP against ETH or a dollar. When it runs, buying thins that reserve — price distorts upward, then brutally downward, because there isn't enough token left in decentralised liquidity to absorb a sell. Trading migrates to centralised venues, and the token loses the protection that made it trustworthy.
ODIN is arranged so the opposite happens:
- The sinks keep ODIN in the pools. Capped pairs force
x ≥ k / max_supply. However high price goes, those pools can't be drained — a bid always remains. - Growth pairings keep depth scaling with price. Most counter-assets are expected to move with the market, so the pools deepen as price rises rather than thinning out.
The permanent bid isn't only a downside backstop — it's designed to persist through the upside.
The honesty boundary#
This rule guarantees depth, not price.
The paired assets can fall and ODIN with them. What cannot happen is K falling, the bid vanishing, or liquidity being withdrawn.
And k growth needs volume as fuel — a ratchet, not a perpetual-motion machine. On a quiet day it barely moves. Conceding this separates a mechanism from a "floor price" claim.
One precision, commonly gotten wrong: the fuel is fees, not recaptured MEV. ODIN captures the swap fees paid by arbitrage and MEV volume. The arbitrage profit — formally the pool's loss-versus-rebalancing — goes to the external searchers, and on immutable V2 pools it cannot be recaptured. Say the loop captures the fees, not ODIN captures the MEV. The first is true and good; the second is neither.
The asterisk#
In late December 2025 Uniswap governance passed UNIfication and turned on the V2 protocol fee switch. ODIN inherited that decision and had no vote.
What it did not change#
The swap fee is 0.30%, hard-coded in UniswapV2Pair.swap:
balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3)); // the 3 IS the fee
The pairs were deployed in 2020 with no admin; governance could not reach that constant. Every swap still pays the full 0.30% into reserves, and k grows by the full amount.
What it did change#
UNIfication set feeTo on the V2 factory. The protocol's share is taken as dilution of the claim: on the next mint or burn in a pool, the pair mints fresh LP tokens to feeTo worth about one-sixth of the growth in √k since the previous such event.
Two different quantities, not interchangeable:
| Quantity | Rate | What it is |
|---|---|---|
| What a trade costs | 0.30% | Hard-coded. Sets the execution math. |
| What reserves accrue | 0.30% | All of it enters k. Volume derived from k growth must use this. |
| What a position's claim compounds at | up to 0.25% | Post-dilution. The conservative figure ODIN quotes. |
The mistake this section prevents. "Reserves now keep 0.25%" is wrong in a way that breaks arithmetic downstream — derive volume from k growth at 0.0025 and you land about 17% short of every independent volume source. Reserve accrual is 0.30%. The 0.25% is a claim rate, belonging to positions, not to k.
The size of the lever#
feeTo is the whole of it. A deployed UniswapV2Pair has no owner and no proxy, so the fee switch is the entire governance surface: flipped once, fixed at one-sixth of fee growth (hard-coded in the pair, not the factory), with no second setting to move to. It applies only to growth after the switch — the originally locked liquidity sits outside its reach, along with the other five-sixths of what accrues on top.
A real dependency, not a dismissed one. ODIN's pools are Uniswap's contracts, and a decision ODIN had no vote in reached them. That it reached them narrowly is a fact about V2's design, not something ODIN arranged. ODIN's own contracts still have no admin, no governance and no fee switch — but its permanence is built on top of Uniswap's, not independent of it. How we think about that.