Paddl

The arithmetic

Nine steps, in order, with the constants written out. Nothing is simplified for comfort, and where something is not decided it says so.

01Every swap pays its base fee twice

Ethereum sets a base fee for each block. Your transaction pays it and the network burns it. Nobody receives it. That part is not ours, it is how Ethereum works, and it happens whether this pool exists or not.

This pool charges the same kind of amount a second time, in ETH, and hands that second one to the shares. A reader who knows how the base fee works knows, by the end of that sentence, who pays what and to whom.

One swap First base fee Ethereum burns it Second base fee Paid out in ETH To the shares Divided by their number

02A fixed envelope of gas, times the base fee

The surcharge is not a curve and not a percentage of anything the pool decides. It is an amount of gas taken from a table of five rows, multiplied by the block's own base fee. The row depends only on the size of the ETH side of the swap.

Size of the ETH leg Gas envelope under 0.0520 000 0.05 to 0.550 000 0.5 to 290 000 2 to 10130 000 10 and above150 000

The table is the same in both directions. A buy and a sell of the same size in the same block pay exactly the same amount.

03Two ceilings keep it sane

A flat charge in gas would be brutal on a small order, so there is a hard ceiling of 0.25% of the ETH leg. Whichever is smaller, the envelope or the ceiling, is what the swap pays.

And the base fee itself is capped at 200 gwei for this purpose. Above it, the surcharge stops growing. The largest amount this hook can ever take from one swap is 150 000 times 200 gwei.

0.25%Of the ETH leg, hard ceiling
200 gweiWhere the base fee stops counting
0.03 ETHThe most one swap can ever pay

04All of it goes to the shares

The amount is added to a per-share index in the same transaction as the swap. Every share holds an equal claim on it. There is no staking, no claim window and no snapshot.

Shares, pro rata 100% Team 0% Treasury, multisig, anything else 0%

The contract has no owner, no admin role, no upgrade path and no address that can be set after deployment.

Integer division leaves a remainder of at most one wei per distribution. It is carried into the next one instead of being kept. Nothing is swept anywhere.

05A share is a thousand tokens, held outside the pool

Shares are not a separate asset and nothing is locked. They are counted from balances, in the same transaction as the transfer that changed them. One thousand PADDL makes one share, and a balance under that holds no share and accrues nothing.

Buying takes tokens out of the pool and creates shares. Selling puts them back and destroys them. The pool itself holds no share, so tokens sitting in it do not take part in the split.

The pool holds no share buy, a share is created sell, a share is destroyed Held outside it 1 000 PADDL = 1 share

06The counter is two integers

How many gwei landed on one share at the last block, and how many shares are splitting it. Both come from contract state, both can be recomputed by anyone from a node, and there is no schedule and no deadline anywhere in the design.

432Gwei per share, last block
18 240Shares splitting it
1 weiCarried to the next block

07The flow does not grow when you arrive

What lands in a block is decided by gas and by volume. It does not care how many shares exist. So every share created makes every existing share smaller, including the ones bought a second earlier.

That is not a side effect waiting to be fixed. It is the shape of the thing: a pro rata flow divided by a number that anyone can increase by buying. The protocol does not correct it, it displays it, permanently, as the second integer of the counter.

20 000 shares each gets a slice 20 040 shares every slice is 0.20% smaller

Selling runs the same arithmetic backwards. Shares returned to the pool stop counting in the same transaction.

08What the hook cannot do

  • 01Cancel a swap. There is no revert path. If the state were ever inconsistent the surcharge would be zero and the swap would still settle. A hook that can revert a sell is a trapdoor.
  • 02Change the table. The five envelopes, the two ceilings and the quantum are constants in the bytecode, and there is no setter because there is no owner.
  • 03Create tokens. Supply is fixed at a billion and there is no mint after the constructor.
  • 04Take anything other than ETH. The surcharge is always on the ETH leg, and the hook never touches token balances.
  • 05Force a claim. Claiming is a pull, and an unclaimed amount stays credited until someone calls for it.
  • 06Ask who you are. In a v4 hook the address it receives is the router, not the trader, so this design never pays swappers in the first place.

09The flaw

It charges the most when it hurts the most. At 100 gwei a large swap pays about 0.0148 ETH of gas for itself and up to 0.0150 ETH of surcharge on top. That is 101%: the swap really does settle its base fee twice, and the second one is not burned, it is transferred.

And volume leaves exactly when the flow is richest. Anyone can deploy a second pool on the same pair with no hook attached, and the token cannot stop them, because a token that can block a transfer is a trap. For a 4 ETH swap paying the 0.25% ceiling, that pool becomes the better route as soon as it holds 1 600 ETH of depth.

We did not add a transfer tax. We did not whitelist the pool. We did not make the token pausable. Each of those would have closed the leak and opened something worse: a contract that can stop you from selling. So the leak stays open, and it is written on the front of the site as well as here.

101%Surcharge against the swap's own gas, at 100 gwei
1 600 ETHDepth a hookless pool needs to win a 4 ETH swap
No ownerAnd therefore no way to close it