Where PancakeSwap is not Uniswap
The cores are the same source. Everything below is a place they diverge, and each one is a defect this project hit before it was a paragraph.
The math is Uniswap's
PancakeSwap v3 forks Uniswap v3, so the tick and liquidity libraries are the same source. That is what makes a differential corpus meaningful rather than circular.
| Library | Commit | Pinned |
|---|---|---|
| forge-std | 467ffd422ca0 | 2026-08-10 |
| v3-core | d0831dc6b8a3 | 2026-04-30 |
| v3-periphery | 0682387198a2 | 2024-07-25 |
19,546 recorded answers across 9 functions, replayed at exact integer equality — no tolerance anywhere. What was recorded, and whether it still holds →
Where it is not
Each row cost something before it was written down. The last column is what catches it now.
The protocol takes 34% of every fee, by default
Uniswap v3
protocol fee off unless governance turns it on
PancakeSwap v3
slot0.feeProtocol packs (fee0, fee1); this pool reads 3400, so LPs keep 66%
Reconstructing fees from swap volume — the natural way to write a replay engine — overstates LP earnings by 1.515x, and that error lands on the headline APR.
Pools are deployed by a separate PancakeV3PoolDeployer
Uniswap v3
CREATE2 from the factory, address derivable offline
PancakeSwap v3
a different init-code hash, so Uniswap's computeAddress constants are wrong
Deriving a pool address offline produces a plausible address that is not the pool. Resolve through factory.getPool(), always.
The callbacks are renamed
Uniswap v3
uniswapV3MintCallback
PancakeSwap v3
pancakeV3MintCallback
A direct pool call built against the Uniswap ABI reverts. Everything here goes through the position manager instead, never the pool.
The router keeps deadline inside the params struct
Uniswap v3
SwapRouter02 dropped it from the struct
PancakeSwap v3
it is still a member, so the calldata shape differs
The wrong shape costs 23,000 gas and reverts with empty data, which looks like nothing at all. Check the selector, not the documentation.
There is no 3000 fee tier, and so no spacing of 60
Uniswap v3
3000 -> 60 is the most-used tier
PancakeSwap v3
100 -> 1 · 500 -> 10 · 2500 -> 50 · 10000 -> 200
A width copied from a Uniswap example assumes a spacing that does not exist. And MIN_TICK is not a multiple of any of these — 887272 % 10 = 2 — so clamping a bound to the extreme yields a tick the pool refuses and the mint reverts.
The Swap event is not Uniswap's
Uniswap v3
seven parameters; topic0 0xc42079f9…
PancakeSwap v3
nine — it carries protocolFeesToken0 and protocolFeesToken1; topic0 0x19b47279…
Filtering on the Uniswap signature returns zero logs from a pool doing millions in volume. The two extra fields are also why the accountant reads the protocol's actual take per swap rather than modelling it.
The pool charges one fee. The LP is not paid all of it, and a replay written from Uniswap v3’s documentation has no reason to know that.
1.515× — how much a replay that reconstructs fees from swap volume overstates what a position earned, and it lands on the headline return.
The pools we actually read
One DEX, and no constant is right for all of them — which is why every field below is read rather than defaulted.
| Pool | Fee tier · spacing | LPs keep · checked |
|---|---|---|
| PancakeSwap v3 WBNB/USDT 0.05% | 500 · 10 | 66.0% — feeProtocol 3400 · 9 checks passed |
| PancakeSwap v3 WBNB/USDT 0.25% | 2500 · 50 | 68.0% — feeProtocol 3200 · 9 checks passed |
| PancakeSwap v3 TSLAx/USDT 0.25% | 2500 · 50 | 68.0% — feeProtocol 3200 · 9 checks passed |
| PancakeSwap v3 WBNB/BUSD 0.05% (chapel mirror) | 500 · 10 | 66.0% — feeProtocol 3400 · not checked — /vetting reads chain 56 |
0x3669…2050 · 0x1401…15D2 · 0x5E12…d492 · 0xEF15…d11d · 3 of 4 through the 9 checks →
Fee tiers here, and the one that is not.
- 100→1
- 500→10
- 2500→50
- 10000→200
- 3000→60
The dashed one is Uniswap v3’s most-used tier, and it does not exist here. A position sized for it has 2 ticks of remainder that cannot be minted at any spacing this venue offers.
Which pool, and how wide
Measured over the indexed tape, as ranges rather than a ranking — two widths whose bands overlap have not been shown to differ.
| Metric | Value | Note |
|---|---|---|
| Pools examined | 3 | 3 carry a due-diligence badge |
| Ranked | 2 | 1 refused for want of evidence |
| Widths measured | 7 | ±40 to ±800 ticks, per unit of capital |
PancakeSwap v3 WBNB/USDT 0.05%
+/-80 ticks leads at the median, but its P25-P75 band overlaps +/-130 — not separated at this sample size
| Width | P25 – P75 | Median · windows |
|---|---|---|
| ±40 ticks | 8.5% – 30.9% | 15.5% · 20 windows |
| ±80 ticks | 12.7% – 28.2% | 17.0% · 20 windows · leads |
| ±130 ticks | 10.1% – 23.2% | 16.3% · 20 windows |
| ±200 ticks | 9.0% – 19.8% | 15.6% · 20 windows |
| ±244 ticks | 9.8% – 17.9% | 14.8% · 20 windows |
| ±400 ticks | 11.9% – 17.8% | 13.4% · 20 windows |
| ±800 ticks | 7.3% – 11.5% | 10.7% · 20 windows |
PancakeSwap v3 WBNB/USDT 0.25%
+/-400 ticks leads at the median, but its P25-P75 band overlaps +/-244 — not separated at this sample size
| Width | P25 – P75 | Median · windows |
|---|---|---|
| ±40 ticks | -1586.1% – 9.5% | 2.8% · 20 windows |
| ±80 ticks | -1592.6% – 16.5% | 7.1% · 20 windows |
| ±130 ticks | -1571.7% – 17.7% | 9.8% · 20 windows |
| ±200 ticks | -1380.2% – 16.5% | 12.2% · 20 windows |
| ±244 ticks | -1290.0% – 15.4% | 12.4% · 20 windows |
| ±400 ticks | -1015.6% – 16.3% | 13.8% · 20 windows · leads |
| ±800 ticks | -558.1% – 11.8% | 10.8% · 20 windows |
A P25 below −100% is an annualised rate, not a realized loss — one bad day scaled to a year lands in the hundreds.
PancakeSwap v3 TSLAx/USDT 0.25%
no width has enough evidence on this pool
No width on the ladder cleared the evidence floor on this pool, so there is no answer here rather than a small number. It saw 85 swaps across the whole tape.
Where the depth already there is being paid thinly — which is where adding liquidity would improve the venue rather than dilute it.
| Pool | Per unit of liquidity | Depth · flow |
|---|---|---|
| PancakeSwap v3 WBNB/USDT 0.05% | the busiest pool | median depth 1,292,700,124,451,397,500,000,000 · 163,090 WBNB over 252,923 swaps, 5,712 of which moved the tick |
| PancakeSwap v3 WBNB/USDT 0.25% | 3.4× it | median depth 15,390,901,016,687,716,000,000 · 1,288 WBNB over 14,016 swaps, 729 of which moved the tick |
| PancakeSwap v3 TSLAx/USDT 0.25% | 4.0× it | median depth 1,576,166,738,998,165,200 · 0 TSLAx over 85 swaps, 80 of which moved the tick |
Hold a position in a pool that is not listed? Ask directly — the answer tells you whether it was unverified or simply unrankable.