
Uniswap V4 end to end: four broken assumptions, answered structurally
V4 broke four assumptions every router rests on: pools have no addresses, arbitrary code runs inside the swap, fees can exist only at execution time, and pools can hold raw ETH. How BlazePhoenix answers each one structurally — and the measured reason native-ETH support is not optional: 62.9% of V4's ETH-denominated liquidity is native.
Known formally as The four breaks, answered in the BlazePhoenix whitepaper.
BlazePhoenix Engineering · updated 2026-08-16 · 12 min · written from the deployed bytecode
By Mitra (@Sigmacrit) — anonymous developer of the BlazePhoenix protocol. The code is the résumé.
Abstract in 15 languages · resumo · resumen · 摘要 · 要旨 · ملخص
English — Uniswap V4 broke four assumptions every router rests on: pools have no addresses, arbitrary hooks run inside the swap, fees can exist only at execution time, and pools can hold raw ETH. BlazePhoenix answers all four structurally — derive-then-prove discovery, hooks screened by address arithmetic without ever being called, read-or-refuse dynamic fees, native ETH as a first-class kind. Measured 2026-08-13: 62.9% of V4's ETH liquidity is native (Arbitrum 99.6%); a wrapped-only integration reaches only the rest.
Português — O Uniswap V4 quebrou quatro pressupostos de todos os routers: as pools não têm endereço, hooks arbitrários correm dentro do swap, as taxas podem existir só no momento da execução, e as pools podem guardar ETH nativo. A BlazePhoenix responde às quatro estruturalmente — descoberta por derivar-e-provar, hooks filtrados por aritmética de endereços sem nunca serem chamados, taxas dinâmicas lidas-ou-recusadas, ETH nativo como tipo de primeira classe. Medido a 2026-08-13: 62,9% da liquidez ETH do V4 é nativa (Arbitrum 99,6%); uma integração só-wrapped alcança apenas o resto.
Español — Uniswap V4 rompió cuatro supuestos de todos los routers: las pools no tienen dirección, hooks arbitrarios corren dentro del swap, las tarifas pueden existir solo en el momento de la ejecución, y las pools pueden contener ETH nativo. BlazePhoenix responde a los cuatro estructuralmente — descubrimiento por derivar-y-probar, hooks filtrados por aritmética de direcciones sin llamarlos jamás, tarifas dinámicas leídas-o-rechazadas, ETH nativo como tipo de primera clase. Medido el 2026-08-13: el 62,9% de la liquidez ETH de V4 es nativa (Arbitrum 99,6%); una integración solo-wrapped alcanza únicamente el resto.
Français — Uniswap V4 a brisé quatre hypothèses de tous les routeurs : les pools n'ont pas d'adresse, des hooks arbitraires s'exécutent dans le swap, les frais peuvent n'exister qu'au moment de l'exécution, et les pools peuvent détenir de l'ETH natif. BlazePhoenix répond aux quatre structurellement — découverte par dérivation-puis-preuve, hooks filtrés par arithmétique d'adresses sans jamais être appelés, frais dynamiques lus-ou-refusés, ETH natif comme type de première classe. Mesuré le 2026-08-13 : 62,9 % de la liquidité ETH de V4 est native (Arbitrum 99,6 %) ; une intégration wrapped-only n'atteint que le reste.
Deutsch — Uniswap V4 brach vier Annahmen jedes Routers: Pools haben keine Adresse, beliebige Hooks laufen im Swap, Gebühren können erst zur Ausführungszeit existieren, und Pools können natives ETH halten. BlazePhoenix beantwortet alle vier strukturell — Discovery per Ableiten-dann-Beweisen, Hooks per Adressarithmetik gesiebt ohne je aufgerufen zu werden, dynamische Gebühren gelesen-oder-verweigert, natives ETH als eigener Kind. Gemessen am 2026-08-13: 62,9 % der ETH-Liquidität in V4 ist nativ (Arbitrum 99,6 %); eine Wrapped-only-Integration erreicht nur den Rest.
Русский — Uniswap V4 сломал четыре допущения любого роутера: у пулов нет адресов, произвольные хуки исполняются внутри свопа, комиссия может существовать только в момент исполнения, а пулы могут держать нативный ETH. BlazePhoenix отвечает на все четыре структурно — обнаружение через «вывести и доказать», хуки отсеиваются арифметикой адресов без единого вызова, динамические комиссии читаются-или-отклоняются, нативный ETH — полноправный тип. Замер 2026-08-13: 62,9% ETH-ликвидности V4 — нативная (Arbitrum 99,6%); интеграция только через WETH достаёт лишь остаток.
Türkçe — Uniswap V4, her yönlendiricinin dayandığı dört varsayımı kırdı: havuzların adresi yok, swap'ın içinde keyfî hook'lar çalışıyor, ücretler yalnızca yürütme anında var olabiliyor ve havuzlar ham ETH tutabiliyor. BlazePhoenix dördüne de yapısal cevap verir — türet-sonra-kanıtla keşif, hiç çağrılmadan adres aritmetiğiyle elenen hook'lar, oku-ya-da-reddet dinamik ücretler, birinci sınıf tür olarak yerel ETH. 2026-08-13 ölçümü: V4'teki ETH likiditesinin %62,9'u yerel (Arbitrum %99,6); yalnızca-wrapped bir entegrasyon sadece kalanına ulaşır.
العربية — كسر Uniswap V4 أربعة افتراضات يقوم عليها كل موجّه: المجمّعات بلا عناوين، وأكواد hook اعتباطية تعمل داخل المبادلة، والرسوم قد لا توجد إلا لحظة التنفيذ، والمجمّعات قد تحمل ETH الأصلي. تجيب BlazePhoenix عن الأربعة بنيوياً — اكتشاف بالاشتقاق ثم الإثبات، وفحص الـhooks بحساب بتات العنوان دون استدعائها أبداً، ورسوم ديناميكية تُقرأ أو تُرفض، وETH الأصلي كنوع من الدرجة الأولى. قياس 2026-08-13: 62.9% من سيولة ETH في V4 أصلية (Arbitrum 99.6%)؛ التكامل المغلَّف فقط لا يبلغ إلا الباقي.
हिन्दी — Uniswap V4 ने हर राउटर की चार धारणाएँ तोड़ दीं: पूल के पते नहीं होते, स्वैप के भीतर मनमाने hook चलते हैं, शुल्क केवल निष्पादन के क्षण में मौजूद हो सकता है, और पूल कच्चा ETH रख सकते हैं। BlazePhoenix चारों का संरचनात्मक उत्तर देता है — निकालो-फिर-सिद्ध-करो खोज, बिना कभी कॉल किए पते की अंकगणित से छाने गए hook, पढ़ो-या-मना-करो गतिशील शुल्क, और प्रथम श्रेणी के प्रकार के रूप में नेटिव ETH। 2026-08-13 का माप: V4 की ETH तरलता का 62.9% नेटिव है (Arbitrum 99.6%); केवल-wrapped एकीकरण सिर्फ शेष तक पहुँचता है।
日本語 — Uniswap V4はすべてのルーターが依拠する四つの前提を壊しました。プールにアドレスがない、スワップの内部で任意のフックが動く、手数料が実行時にしか存在しないことがある、プールが生のETHを保有できる。BlazePhoenixは四つすべてに構造的に答えます。導出して証明する発見、一度も呼ばずアドレスのビット演算で選別するフック、読めなければ拒否する動的手数料、第一級の種別としてのネイティブETH。2026-08-13の計測では、V4のETH流動性の62.9%がネイティブ(Arbitrumは99.6%)。ラップ限定の統合では残りにしか届きません。
中文 — Uniswap V4 打破了所有路由器依赖的四个假设:池没有地址、任意 hook 在交换内部运行、费用可能只在执行瞬间存在、池可以持有原生 ETH。BlazePhoenix 对四者均作结构性回答——先推导后证明的发现机制、从不调用而用地址位运算筛选的 hook、读取否则拒绝的动态费用、作为一等类型的原生 ETH。2026-08-13 实测:V4 中 62.9% 的 ETH 流动性是原生的(Arbitrum 99.6%);仅支持包装币的集成只能触及其余部分。
한국어 — Uniswap V4는 모든 라우터가 기대던 네 가지 가정을 깨뜨렸습니다. 풀에 주소가 없고, 임의의 훅이 스왑 내부에서 실행되며, 수수료가 실행 순간에만 존재할 수 있고, 풀이 원시 ETH를 보유할 수 있습니다. BlazePhoenix는 네 가지 모두에 구조적으로 답합니다 — 유도-후-증명 탐색, 한 번도 호출하지 않고 주소 비트 연산으로 걸러내는 훅, 읽거나-거부하는 동적 수수료, 일급 종류로서의 네이티브 ETH. 2026-08-13 측정: V4의 ETH 유동성 중 62.9%가 네이티브(Arbitrum 99.6%)이며, 래핑 전용 통합은 나머지에만 닿습니다.
Bahasa Indonesia — Uniswap V4 mematahkan empat asumsi setiap router: pool tak punya alamat, hook sembarang berjalan di dalam swap, biaya bisa hanya ada saat eksekusi, dan pool dapat memegang ETH mentah. BlazePhoenix menjawab keempatnya secara struktural — penemuan turunkan-lalu-buktikan, hook disaring dengan aritmetika alamat tanpa pernah dipanggil, biaya dinamis dibaca-atau-ditolak, ETH native sebagai jenis kelas satu. Terukur 2026-08-13: 62,9% likuiditas ETH di V4 adalah native (Arbitrum 99,6%); integrasi hanya-wrapped cuma menjangkau sisanya.
বাংলা — Uniswap V4 প্রতিটি রাউটারের চারটি অনুমান ভেঙে দিয়েছে: পুলের ঠিকানা নেই, সোয়াপের ভেতরে যথেচ্ছ hook চলে, ফি কেবল নির্বাহের মুহূর্তে থাকতে পারে, আর পুল কাঁচা ETH ধরে রাখতে পারে। BlazePhoenix চারটিরই কাঠামোগত উত্তর দেয় — বের-করে-প্রমাণ-করো আবিষ্কার, কখনো কল না করে ঠিকানার গাণিতিক বিট দিয়ে ছাঁকা hook, পড়ো-নয়তো-প্রত্যাখ্যান গতিশীল ফি, প্রথম শ্রেণির ধরন হিসেবে নেটিভ ETH। ২০২৬-০৮-১৩-এর পরিমাপ: V4-এর ETH তারল্যের ৬২.৯% নেটিভ (Arbitrum ৯৯.৬%); কেবল-wrapped সংহতি শুধু বাকিটুকুতে পৌঁছায়।
Filipino — Binasag ng Uniswap V4 ang apat na palagay ng bawat router: walang address ang mga pool, tumatakbo ang arbitraryong hook sa loob ng swap, maaaring sa sandali lang ng pagpapatupad umiral ang bayarin, at maaaring humawak ng purong ETH ang mga pool. Sinasagot ng BlazePhoenix ang apat nang istruktural — pagtuklas na mag-derive-saka-patunayan, mga hook na sinasala ng aritmetika ng address nang hindi kailanman tinatawag, dinamikong bayaring binabasa-o-tinatanggihan, native ETH bilang unang-klaseng uri. Sinukat 2026-08-13: 62.9% ng ETH na likididad sa V4 ay native (Arbitrum 99.6%); ang wrapped-only na integrasyon ay umaabot lamang sa natitira.
Uniswap V4 is not a new pool contract; it is a new shape of venue, and it invalidates four assumptions that every router built between 2020 and 2024 rests on. Pools have no addresses — they are entries in one singleton's storage, keyed by a hash, so there is nothing to look up and nothing to call. Arbitrary code runs inside the swap — a hook, deployed by the pool's creator, executes at defined points of the settlement the router is performing. Fees need not be constant — a pool may declare a dynamic fee whose value exists only in live state at the moment of the trade. And pools may hold the chain's native currency — raw ETH, which has no balanceOf and no transferFrom.
Each break, taken alone, is an integration inconvenience. Taken together they explain why V4 support across the industry is so often partial: a fixed list of curated pools instead of discovery, wrapped-only pairs instead of native ones, hooks avoided entirely, dynamic fees quoted optimistically or skipped. BlazePhoenix answers all four structurally, so that a V4 leg is — to the Solver, to the floors, and to the trader — indistinguishable from any other leg. This article is the four answers, each with its enforcement site and its boundary.
Break one: pools with no addresses — derive, then prove
A V4 pool has no address to compute, but it has an identifier: the keccak hash of its PoolKey — the two sorted currencies, the fee, the tick spacing and the hook. So the Deterministic Derivation 𝒟 derives poolIds rather than addresses, and then does something no address derivation can: it proves the pool exists, by reading the PoolManager's own storage for that id and requiring a non-zero square-root price and non-zero liquidity. Nobody can forge that proof, because nobody but the manager writes that storage; a fabricated id resolves to zeros and is discarded.
The scan that produces candidate ids is a cost ladder, cheapest rung first, and it stops at eight proven pools (V4_CAP = 8). A warm pair costs a single probe; only a genuinely unknown pair pays for the cold-start grid, and even that payment is bounded at compile time — 99 fee-and-spacing combinations generated, at most 40 probed. Two safety properties fall out of the construction rather than from a check: the scan derives hookless ids only, so a hooked pool can never be emitted by discovery at all — its hookless id does not exist in the manager and fails the liveness proof before any policy question is asked — and duplicate ids arising from different tier guesses collapse to one candidate, so a single pool cannot saturate the funnel by aliasing.
rung 1 the tier pattern already learned for this pair -> one probe (steady state)
rung 2 a provenance check before paying for a cold scan -> one read
rung 3 the canonical Uniswap tiers, batched -> one extsload for the batch
rung 4 the (fee, spacing) pairs the registration declares-> bounded by the registration
rung 5 cold-start grid: 99 combinations, max 40 probed -> compile-time bound
scan stops at V4_CAP = 8 proven pools; hookless ids only; duplicates collapse.Reading a pool that answers no calls
With an id proven live, the dispatcher needs price and liquidity — and there is no slot0() to call, because there is no pool contract. The Core reads the singleton's storage directly by extsload: the pool's base slot is keccak256(poolId ‖ 6), the packed word at that slot carries the square-root price in its low 160 bits with the protocol fee and LP fee packed above it, and the active liquidity sits three words further on.
That layout is not taken from documentation. It was verified against the canonical StateView contract on a mainnet fork — read the same pool both ways, require the same numbers — because a storage layout inferred from prose is an assumption, and an assumption about where a number lives is the cheapest possible way to misprice every trade through a venue. With price and liquidity in hand, the V4 branch reduces to the same concentrated-liquidity closed form as every V3-shaped pool: same mathematics, same 512-bit mulDiv overflow discipline. The singleton changes where the state lives, not what the state means.
Break two: arbitrary code inside the swap — screened by arithmetic, never interrogation
A hook is arbitrary code running inside the settlement the Router is performing — the most dangerous primitive an aggregator must integrate, because a hostile hook's goal is to alter the accounting between the moment the Router commits to pay and the moment it is paid. The intuitive defence, asking the hook what it intends to do, is not a defence: a hostile hook lies, or re-enters. BlazePhoenix never asks a hook anything. Three independent layers stand instead, and any one of them suffices.
The address cannot lie. V4 encodes a hook's permissions in the low fourteen bits of its own address, fixed at deployment by the CREATE2 salt and physically immutable — and the PoolManager itself enforces those same bits when deciding whether to invoke the hook. Exactly two of those bits permit modifying swap accounting; the Router masks them with a single AND before any token moves. No call into untrusted code, nothing to deceive, and evasion would require an address whose bits contradict the manager's own enforcement.
The allow-list is closed by default: a V4 entry is registrable only if its hook is on the Hub's curated list, so a hostile hook never reaches the Solver's candidate set. And the anti-scam projector Ξ makes the route unrepresentable: any route touching a delta-altering or non-listed hook is valued at exactly zero in the Meta-Equation, so it cannot win a maximisation it does not participate in. The residual is stated with the mechanism: an allow-listed, delta-free hook can still revert mid-swap and waste the gas of trying — the price of refusing, on principle, to call untrusted code to find out what it would have done.
Break three: fees that exist only at execution time — read, or refuse
A static-fee V4 pool carries its fee in its key, where it is immutable and unambiguous. A dynamic-fee pool carries the sentinel 0x800000 instead, and its real fee lives in slot0 — which raises the only genuinely hard question in the integration: what should a quote do when the number it needs is not knowable with certainty until the swap runs?
The answer is a three-line policy in the Core's fee gate, pinned by a regression test against real V4 state. A static-fee key is the truth and is used as-is. A dynamic-fee key carrying a protocol-fee component that cannot be decomposed exactly returns an unquotable fee, which zeroes the leg — fail-closed, the venue declined rather than guessed at. Otherwise the live LP fee is read from slot0 and used: measured, not nominal. The alternative — quoting the sentinel at face value — prices the trade as free while execution pays the live rate, which is precisely the quote-versus-execution gap this protocol exists to close.
One residue is bounded rather than removed, because no contract can remove it: a hook with fee-override permission can set a different fee inside beforeSwap than the one standing in slot0 when the quote was taken. Three mechanisms bound the consequence — the hook must first clear the address-bit mask and the allow-list to be routable at all, the per-leg floor requires each leg to deliver 80% of its attested expectation, and the Iron-Law floor Φ is re-derived from realised output before payout. A hostile override lands as a revert or as a shortfall inside the slack the user already accepted, never as a fill below the floor.
Break four: native ETH as a kind, not a special case
The Router's working assumption everywhere is that an asset is an ERC-20 with balanceOf — an assumption that pays for itself a hundred times and fails in exactly one place: a V4 pool whose currency is the chain's native asset. The design decision worth explaining is where the exception lives. Encoding it as a distinct kind — KIND_V4_NATIVE — makes it visible in the pool record, carried in the route plan, and greppable by an auditor, instead of a condition rediscovered at each call site. The quote mathematics needs no branch at all: the pool identifier derives from the two sorted currencies, and address(0) sorts first by construction.
Execution keeps the invariant that matters. The Router stays WETH-canonical everywhere, and a native V4 leg unwraps just in time inside its own unlock frame: WETH.withdraw, then settle with value to pay the pool, with ETH received from a native take re-wrapped into WETH in the same frame. Native ETH never exists at rest in the contract, so the holds-nothing-between-transactions invariant survives contact with an asset that has no token interface. The one new surface this required is a receive() function, gated as narrowly as the requirement allows: a transient slot holds the single address permitted to send raw ETH to the Router at that instant — the canonical WETH contract during the unwrap, the PoolManager during a native take, zero at every other moment — so bare ETH from anyone else reverts exactly as it did before the function existed.
The kind earns its place empirically. Measured on 2026-08-13 across the chains served, 62.9% of the ETH-denominated liquidity inside V4 sits in native pools — Arbitrum 99.6%, Optimism 95.0%, Base 48.9%. Wrapping at the edge and routing only the wrapped side would have made all of it unreachable; the honest description of a wrapped-only V4 integration is not "supports V4" but "supports the third of V4 that happens to be wrapped."
What the integration proves
Settlement inverts the usual control flow — the Router calls unlock on the manager and performs the entire swap inside the callback it is granted: swap, settle every owed currency through sync → settle → take, release the lock, with the in-flight currencies carried across the unlock boundary in transient storage. One detail is worth recording as evidence for the fork-first validation discipline: the BalanceDelta the manager returns is packed — amount0 in the high 128 bits, amount1 in the low — and every mock written for the integration agreed with the integration, because mock and integration were written from the same mental model. Only a real fork, returning the real packed layout, disagreed. A mock can only contradict you about things you already suspected.
The deliverable, stated in one sentence: V4 pools are discovered without a directory, proven to exist against storage nobody can forge, priced by the same closed form as every other concentrated venue, fee-gated by measurement with a fail-closed refusal where measurement is not exact, screened for hostile hooks by immutable address arithmetic before a token moves, settled through the singleton's own lock protocol, and reachable in native ETH without the Router ever holding a wei of it at rest — end to end, on the same floors, with the same guarantees, as a Uniswap V2 pair from 2020.
Do not trust this page — reproduce it
Every claim above is checkable against the chain. Start here:
derive any V4 poolId as keccak256(abi.encode(currency0, currency1, fee, tickSpacing, hooks)), compute its base slot as keccak256(abi.encode(poolId, uint256(6))), read it with cast call <PoolManager> "extsload(bytes32)(bytes32)" <slot> --rpc-url https://mainnet.base.org, and compare the low 160 bits against StateView.getSlot0(poolId) — the two reads must agreeCite this article
Licensed CC BY 4.0 — quote, translate and reuse freely, including commercially, with attribution and a link. Copy a ready-made citation:
BlazePhoenix (2026). Uniswap V4 end to end: four broken assumptions, answered structurally. BlazePhoenix Engineering. https://blazephoenix.xyz/learn/uniswap-v4-end-to-end@misc{blazephoenix_uniswap_v4_end_to_end,
title = {Uniswap V4 end to end: four broken assumptions, answered structurally},
author = {BlazePhoenix},
year = {2026},
url = {https://blazephoenix.xyz/learn/uniswap-v4-end-to-end},
note = {Accessed: reproduce the claim with the command above}
}Writing an answer, a wiki entry or a paper? The claim above is reproducible against the chain before you quote it — which is the only sound basis for citing a technical source at all.
Contracts are verified on every chain we deploy to — addresses in the protocol manifest. Deeper formal treatment: the whitepaper (PDF). Standards cited: HTTPS://GITHUB.COM/UNISWAP/V4-CORE · HTTPS://DOCS.UNISWAP.ORG/CONTRACTS/V4/CONCEPTS/HOOKS · EIP-1153
Share this article · join the discussion