欢迎大家来参加技能进阶挑战!
在本帖下用回复的方式上传你的学习笔记完成打卡 ![]()
欢迎大家来参加技能进阶挑战!
在本帖下用回复的方式上传你的学习笔记完成打卡 ![]()
到 V3 为止,协议有两个独立组件:factory 和 pool。每当一个新池被创建时,factory 合约就会部署一个新的 pool 合约;然而在 V4 中,一个名为 PoolManager 的单一合约管理所有池,会使得在多个池之间的交换路由变得更便宜。在一次交易的开始和结束时,仅执行一次余额更新,而不是为每个池单独修改余额,大大简化了路由和降低成本;而且现在进入池的方式只需要调用 PoolManager 合约的一个函数,部署成本显著降低。
V4 使用 ERC-6909 代币来结算增量(由于交换或其他池交互而导致的代币余额差异)和 PoolManager 中的代币管理。这是对 ERC-1155 的一种 Gas 优化替代方案,专门针对在单个合约中管理多个代币而设计。V4 在标准的 ERC-6909 接口外提供了 mint 函数,可以为用户铸造某种代币的 ERC-6909 包装版本:
function mint(address to, uint256 id, uint256 amount) external onlyWhenUnlocked {
unchecked {
Currency currency = CurrencyLibrary.fromId(id);
// negation must be safe as amount is not negative
_accountDelta(currency, -(amount.toInt128()), msg.sender);
_mint(to, currency.toId(), amount);
}
}
V4 在交换或其他流动性操作期间追踪池和用户之间的未清余额。系统不会立即结算每一笔交易,而是确保所有未清余额仅在交易结束时才得到完全清算。
V4 使用 PoolManager 合约里特殊的 unlock 函数解锁合约内的余额修改,从而允许进行修改。unlock 函数有两个目的:防止重入攻击,即一笔交易执行两次函数;调用 Router 的回调函数,处理实际的交换逻辑。实际的交换处理发生在回调函数 unlockCallback 内,通过调用多个 PoolManager 内的函数来执行请求的操作。当 unlockCallback 结束后,unlock 函数会检查 NonzeroDeltaCount,如果没有实现平衡,就会 revert 交易。
V4 允许池创建者通过钩子自定义他们的池,添加额外逻辑和新功能。钩子合约通过其实现的函数编码到其合约地址中与 PoolManager进行通信。这一编码的关键部分是钩子地址的最后四个十六进制数字(16位),表示钩子实现了哪些函数。
beforeSwapReturnData 和 afterSwapReturnData 两个权限代表 hook 在兑换过程中修改 hook 地址对应的代币,意味着被赋予这个权限的话,hook 可以在兑换过程中掌握一部分代币。
beforeSwap 更新当前的 LP 费率、修改用户的 amountToSwap、修改 hookDelta;afterSwap 修改 hookDelta。
除了定制外,hooks 的实现也是更广泛的 V4 安全模型的一部分,通过 解锁回调系统,这是其安全架构的关键部分。任何可能应用增量的函数都可以在解锁时调用,并在再次锁定之前验证增量。
在研究 V4 時,感覺整個 DeFi 的邏輯又往前進了一大步。不得不說,V4 不只是性能提升,還增加了許多可以讓開發者發揮創意的功能,可以進一步擴大生態系:
V4 引入 Hooks,讓開發者可以在 swap、add/remove 流動性前後裝進自定義邏輯,宛如 AMM 的插件系統,開發者可以做到:
換句話說,V4 不只是讓 LP 提供流動性,同時還可以定義「這個池子行為是什麼」,非常自由。
V4 新加入 Subscribers 機制,允許你設定一個訂閱合約,當每次 LP position 變動時,它都會收到通知,這讓 staking、liquidity mining 可以不必轉移 NFT(ERC‑721),更加安全更高效 。
| 特性 | V3 | V4 |
|---|---|---|
| 資本效率 | 高(集中流動性) | 同樣高,但成本更低 |
| gas 成本 | 高,需部署 Pool 合約 | 低,採 Singleton + Flash Accounting |
| 自定義能力 | 無 | Hooks + Dynamic Fee + Subscriber 超自由 |
| ETH 支援 | 必須 wrap | 原生支援 |
| 複雜度 | 普通 | 比較高,需要懂 Hook 邏輯 |
如果說 V2 是「人人會用的自動販賣機」、V3 是「高效率版 AMM」,那 V4 就是「可編程的 AMM 工具箱」。
V4
一、架构革新:从工厂模式到单例模式(Singleton)
全局合约整合
摒弃 V2/V3 的工厂合约模式,所有流动性池统一由 Singleton 合约(PoolManager.sol) 管理,池数据通过 poolId 映射存储于合约内部。此举将创建新池的 Gas 成本降低 99% ,解决了多版本中独立合约部署的高成本问题
闪电记账(Flash Accounting)
基于 EIP-1153 的瞬时存储(Transient Storage),引入 净余额(Delta) 机制:
所有交易操作(如 Swap、添加流动性)仅更新内部 Delta 值,最终通过 settle() 与 take() 函数统一结算代币净余额,确保交易结束时 Delta 归零
优势:减少多跳交易中的冗余转账,跨池操作 Gas 消耗显著降低,同时支持原生 ETH 直接交易(无需 WETH 包装),节省约 50% Gas
二、核心创新:钩子机制(Hooks)的可编程性
生命周期钩子
Hooks 是智能合约模块,可在流动性池的 8个关键生命周期节点(如初始化、Swap前后、修改头寸前后等)插入自定义逻辑。开发者可通过继承 BaseHook 合约重写函数实现以下功能
动态费用调整:根据市场波动或交易量实时变更手续费率;
复杂订单类型:支持限价单、TWAMM(时间加权平均价格订单);
预言机扩展:集成波动率预言机或自定义价格计算模型;
流动性再分配:将闲置资金自动存入借贷协议以提升收益。
Hook 地址与 Flag 控制
Hook 合约地址的二进制位决定触发节点(如 0x01 对应 afterDonate),通过 PoolKey 结构体与池绑定。结合 beforeInitialize 和 afterInitialize 等回调,实现灵活的策略注入
三、技术优化与功能增强
ERC-6909 代币协议
引入类似 ERC-1155 的多代币管理标准,允许单一合约处理多种资产,提升资金结算效率。通过 mint() 和 burn() 函数映射外部代币与内部资产,支持闪电借贷与复杂策略的无缝集成
动态费用与捐赠功能
分级费率:支持 0.01% 至 1% 的多级手续费配置,由 Hook 或治理动态调整
donate() 函数:用户可直接向特定价格区间内的 LP 捐赠代币,激励目标流动性,优化市场深度
四、安全与治理升级
安全机制强化
采用 瞬态存储 避免重入攻击,结合 onlyWhenUnlocked 修饰符限制关键函数调用权限
发布前通过高达 1550 万美元漏洞悬赏计划 进行多重审计,确保合约安全性
治理与许可模型
协议参数(如费用开关)由 UNI 代币持有者通过 DAO 治理决定;
采用 Business Source License 1.1,四年内限制未经许可的分叉,保护核心知识产权
五、市场影响与挑战
行业意义
DEX 标准化:Hooks 的可组合性推动 Uniswap 成为 DeFi 基础设施层,吸引开发者构建创新应用(如自动复投策略、链上衍生品)
CEX 竞争:动态费用与复杂订单类型缩小与中心化交易所的功能差距,可能提高链上交易占比
潜在风险
Hook 安全风险:恶意 Hook 合约可能引入漏洞(如资金窃取),需严格审计;
LP 管理复杂度:集中流动性区间需主动调整,对散户用户不友好
六、总结与展望
Uniswap V4 通过 可编程钩子 和 单例架构 实现了协议层的范式跃迁,其核心价值在于:
开放生态:Hooks 赋予开发者无限创新空间,推动 DeFi 应用场景爆炸式增长;
效率革命:Gas 成本降低与原生 ETH 支持提升用户体验,吸引主流资金入场;
治理进化:DAO 治理与许可证模型平衡创新与生态保护。
Uniswap V4 并非简单的版本迭代,而是从 “专业化 AMM” 向 “可编程 AMM 工具箱” 的范式跃迁。它通过架构革新(单例模式)、核心创新(钩子机制)与技术优化(闪电记账),在降低 Gas 成本的同时,赋予开发者极致的自定义能力,让 DeFi 生态从 “固定功能协议” 走向 “开放插件平台”,既能满足专业 LP 的策略需求,也为创新应用(如链上衍生品、自动流动性管理)提供底层支持。
V4 彻底摒弃 V2/V3 的 “工厂 - 独立池” 模式,采用 Singleton 单例架构,所有流动性池统一由 PoolManager.sol 合约管理,这是其效率提升的核心基础。
poolId(由代币对、费率、钩子地址等参数生成)将所有池数据映射存储于 PoolManager 内部。PoolManager 的单一函数,无需跨多个合约交互。配合单例架构,V4 引入 闪电记账机制,彻底改变 V3 中 “每步操作实时结算” 的模式:
settle()(结算用户与池的净负债)和 take()(提取净收益)函数统一清算,确保最终 Delta 归零(即所有未清余额完全平衡)。为适配单例架构下的多代币管理,V4 采用 ERC-6909 协议(ERC-1155 的 Gas 优化版本):
PoolManager 在单一合约内管理多种代币,通过 mint() 和 burn() 函数实现外部代币与内部 ERC-6909 包装代币的映射;mint 函数核心逻辑):solidity
function mint(address to, uint256 id, uint256 amount) external onlyWhenUnlocked {
unchecked {
Currency currency = CurrencyLibrary.fromId(id);
// 计算用户净余额变动(负值表示负债)
_accountDelta(currency, -(amount.toInt128()), msg.sender);
// 为用户铸造 ERC-6909 包装代币
_mint(to, currency.toId(), amount);
}
}
Hooks 是 V4 最具革命性的功能,允许开发者在流动性池的 8 个关键生命周期节点 插入自定义逻辑,实现 “按需扩展”,彻底打破 V2/V3 功能固定的局限。
beforeInitialize/afterInitialize:池初始化前后(如设置初始费率、初始化预言机);beforeSwap/afterSwap:代币兑换前后(如动态调费、执行限价单);beforeModifyPosition/afterModifyPosition:添加 / 移除流动性前后(如自动复投手续费、调整区间)。afterDonate);PoolManager 通过解析地址 Flag,自动在对应节点触发 Hook 逻辑,无需额外配置。Hook 赋予开发者极致的自定义空间,典型应用场景包括:
| 应用场景 | 实现逻辑 |
|---|---|
| 动态手续费调整 | 在 beforeSwap 中接入波动率预言机,当资产波动超过阈值(如 ETH 价格 10 分钟涨 5%),自动将费率从 0.3% 上调至 0.5%,补偿 LP 风险。 |
| 链上限价单(Range Order) | 在 beforeSwap 中设置价格触发条件,当市场价格触及目标价(如 ETH 跌至 1800 美元),自动触发单边流动性参与交易,实现 “低价买入”。 |
| 自动流动性管理 | 在 afterModifyPosition 中添加逻辑,当 LP 头寸的手续费累积超过阈值(如 100 USDC),自动将手续费复投为流动性,提升复利收益。 |
| 自定义交易曲线 | 突破 V3 集中流动性的 L=√(x×y) 模型,在 beforeSwap 中植入新公式(如线性曲线、阶梯曲线),适配稳定币兑换、衍生品定价等场景。 |
| 预言机扩展 | 在 afterSwap 中同步更新自定义预言机数据(如记录实时交易量、波动率),为外部 DeFi 协议(如借贷、清算)提供更丰富的链上数据。 |
unlock() 函数控制合约状态 —— 仅在 unlock 期间允许修改余额,且 unlockCallback(实际交易逻辑执行处)结束后,PoolManager 会检查 NonzeroDeltaCount(未清余额计数),若未平衡则回滚交易,防止重入攻击;beforeSwapReturnData,允许修改代币余额)需明确授权,避免恶意 Hook 窃取资金;针对 V3 中 LP 头寸(NFT)参与质押 / 流动性挖矿时需转移 NFT 的风险,V4 新增订阅者机制:
| 维度 | Uniswap V3 | Uniswap V4 |
|---|---|---|
| 架构模式 | 工厂 - 独立池(每交易对一个 Pool 合约) | 单例模式(所有池由 PoolManager 统一管理) |
| Gas 成本 | 高(部署、跨池交易需多次合约交互) | 低(单例 + 闪电记账,成本降 99%,原生支持 ETH) |
| 自定义能力 | 固定(仅多费率、集中流动性) | 极致灵活(Hooks 支持 8 个节点自定义逻辑) |
| 费率机制 | 固定三档(0.05%/0.3%/1%) | 动态可调(0.01%~1%,支持多频率调整) |
| 流动性头寸管理 | ERC-721 NFT(需转移参与挖矿) | ERC-721 NFT + 订阅者机制(无需转移) |
| 安全机制 | 基础重入防护 | 瞬态存储 + 解锁回调 + 高额漏洞悬赏 |
| 开发门槛 | 普通(无需理解复杂扩展逻辑) | 较高(需掌握 Hook 编程与安全审计) |
Uniswap V4 的核心价值在于 “用架构效率换生态开放,用可编程性换创新空间”:
它不仅是 Uniswap 自身的迭代,更标志着 DeFi 进入 “可编程金融” 的新阶段。
Uniswap V4 不再仅仅是一个自动化做市商(AMM),而是一个高度可定制、可扩展的去中心化金融基础设施。如果说 V2 是“人人可用的 DEX”,V3 是“专业化的 DEX”,那么 V4 的定位则是“人人可构建自定义 AMM 的平台”或“链上流动性的应用商店”。
它的核心思想是将交易逻辑与池子管理分离,通过引入“Hooks”机制,允许开发者像安装插件一样,为流动性池添加任意自定义功能,从而将创新的权利完全开放给社区。
这是 V4 最具革命性的创新。Hooks 是外部智能合约,可以在流动性池生命周期的关键节点被触发执行,类似于软件开发中的“中间件”或“插件”。
机制:在创建流动性池时,可以“挂载”一个 Hook 合约。当池子发生特定行为时(如交易前、交易后、增删流动性前后),主合约会**回调(Callback)**并执行 Hook 合约中的自定义逻辑。
关键触发点包括:
beforeInitialize / afterInitialize (池子初始化前后)
beforeModifyPosition / afterModifyPosition (增删流动性前后)
beforeSwap / afterSwap (交易前后)
beforeDonate / afterDonate (捐赠前后)
应用场景(无限可能):
动态费用:创建一个 Hook,根据市场波动率或其他指标自动调整交易手续费。
链上限价单:通过 Hook 实现当价格达到某个 Tick 时,自动执行限价单逻辑。
时间加权平均做市商 (TWAMM):将大额订单通过 Hook 拆分成无数个小订单,在一段时间内平滑执行,以减少价格冲击。
自定义预言机:集成更复杂的链上预言机,如中位数或波动率预言机。
合规与风控:实现 KYC/AML 检查,只允许白名单地址进行交易。
V4 颠覆了 V2/V3 的“工厂-交易对”模式,引入了**单例合约(Singleton)**架构。
机制:所有流动性池不再是独立的合约实例,而是全部存在于一个巨大的主合约(PoolManager.sol)中。这个主合约通过内部的账本(State)来管理和隔离数以万计的不同池子。
优势:
极大的 Gas 节省:创建新池子不再需要部署一个完整的合约,只是在主合约中增加几行状态记录,成本降低了约 99%。
路由优化:多跳交易(如 A→B→C)可以在同一个合约内部完成,无需在多个合约地址之间进行资产转移,从而节省了大量 Gas。
这是对 Singleton 架构的补充,进一步优化了 Gas 效率。
V4 重新引入了对原生 ETH 的支持(而不是强制使用 WETH)。这意味着用户可以直接用 ETH 进行交易,省去了打包和解包 WETH 的步骤和 Gas 费用。
| 特性维度 | Uniswap V3 (专业化产品) | Uniswap V4 (可编程平台) |
|---|---|---|
| 核心架构 | 工厂-交易对:每个池子都是独立合约 | 单例合约:所有池子存在于一个主合约中 |
| 交易逻辑 | 硬编码:逻辑固定在核心合约中,不可更改 | 模块化:核心逻辑极简,复杂功能通过 Hooks 外部实现 |
| 定制化 | 有限:只能选择固定的费率等级 (0.05%, 0.3%, 1%) | 无限:通过 Hooks 可实现动态费用、限价单等任意功能 |
| Gas 效率 | 较高 | 更高:通过 Singleton 和闪电记账系统大幅优化 |
| 创新模式 | 自上而下:由 Uniswap Labs 主导协议升级 | 自下而上:任何开发者都可以通过 Hooks 进行无需许可的创新 |
| 安全性 | 风险集中在核心协议 | 风险分散,池子的安全 = 核心协议安全 + Hook 合约安全 |
Uniswap V4 是一次大胆的范式转移,它放弃了对协议功能的绝对控制,转而为整个 DeFi 生态提供了一个极其强大的底层基础设施。它不再仅仅追求自身的优化,而是致力于赋能社区进行无需许可的创新。虽然 V4 带来了新的安全和复杂性挑战,但它也为自动化做市商乃至整个去中心化金融的未来,开启了前所未有的想象空间。
V4 的代码框架,比 V3 更像一个开放战场。运营视角看,它把工具箱彻底拆开,扔给所有人 —— 没有预设规则,只有基础协议和钩子接口。
V4 最核心的钩子函数,允许在交易前、中、后插入自定义逻辑。这不是优化,是革命。比如,我可以写一个钩子,让某个池子只允许持仓超过 30 天的 NFT 持有者交易;也可以设计动态费率,当池内资产偏离锚定价格 5% 时,手续费自动从 0.3% 跳到 1%。
传统做市商的风控策略,现在能直接嵌进交易池。测试时试过一个简单逻辑:当 ETH 价格暴跌 10%,自动暂停 ETH-USDC 池的大额交易(单笔超 100 万刀),给 LP 缓冲时间。这在 V3 里得靠外部机器人盯盘,V4 里一行钩子代码就能实现。
但钩子是把双刃剑。社群里有人上传了一个恶意钩子,能在用户添加流动性时偷偷抽走 0.1% 资产。这意味着运营不能再只信 Uniswap 官方,必须建立钩子审计机制 —— 要么平台自己审,要么引入第三方审计标签,让用户能筛选 “已验证钩子”。
V4 允许资金池共享一个全局资金库,不同池子的资产可以交叉调用。这直接解决了 V3 里 “资金分散” 的死结。比如,我在 ETH-USDC 池的资产,闲置时可以自动划到 ETH-DAI 池临时做市,赚两份手续费。
对运营来说,这意味着 “流动性利用率” 成了新 KPI。以前看锁仓量(TVL)就行,现在得算 “实际参与交易的资金占比”。测试数据显示,共享资金库能让闲置资金减少 40% 以上,这部分增量收益必须让 LP 看到 —— 可以在仪表盘加一个 “资金活化率” 指标,实时显示用户资产的利用效率。
但跨池调用会增加清算风险。如果 ETH 价格急跌,多个池子同时需要平仓,资金库可能出现挤兑。这时候,钩子又能派上用场 —— 写一个优先级钩子,规定极端行情下,先满足稳定币池的清算需求。
V4 彻底放开了费率限制,0.01% 到 10% 随便设。这会引发新的内卷。稳定币池可能卷到 0.005%,而新上线的风险代币池可能敢收 20%。
运营要做的不是干预定价,而是提供比价工具。在代币搜索页加一个 “费率热力图”,用颜色标注不同池子的费率和近 7 天收益,让用户自己权衡。还可以开发 “费率预警” 功能,当某个池子费率突然提高 50% 以上,自动推送给持仓用户 —— 这比发公告有效。
另外,自定义费率会催生 “做市策略即服务”。有人会专门设计最优费率模型,按交易量抽成。运营可以开放 API,让这些第三方策略直接接入,抽成的一部分返给平台,形成生态分成。
V4 支持批量操作,一个交易里能同时调整 10 个池子的流动性参数。这是给专业做市商准备的武器。测试时用脚本批量调整 5 个 ETH 相关池子的价格区间,gas 费比 V3 单独操作节省 67%。
这意味着散户和机构的差距会拉大。运营必须推出 “策略模板市场”,让散户能一键复制专业 LP 的参数设置 —— 比如 “稳健型 BTC 策略” 预设在 3 万 - 4 万美元区间,“激进型山寨币策略” 设 50% 费率和宽区间。模板设计者可以收订阅费,平台抽成 10%。
但批量操作也可能放大风险。如果某个策略模板出错,会导致所有追随者同时亏损。所以必须加 “回测数据” 强制展示,每个模板都要显示过去 3 个月的模拟收益和最大回撤,且不允许隐藏亏损记录。
学 V4 最大的体会是,它不再是一个 DEX,而是一个 “去中心化金融操作系统”。运营的核心任务从 “维护规则” 变成 “维护生态秩序”—— 就像菜市场管理员,不用规定菜价,但必须确保秤准、无假货、通道畅通。剩下的,交给交易者和做市商自己厮杀。
PoolManager.sol 採用單例架構,所有交易池由單一合約管理。相比 V3 的獨立池合約設計,這種架構帶來以下變化:
Lock.sol 實現的解鎖模式:
modifier onlyWhenUnlocked() {
if (!Lock.isUnlocked()) ManagerLocked.selector.revertWith();
_;
}
解鎖模式的特點:
Hooks.sol 使用合約地址的位標誌決定鉤子功能:
uint160 internal constant BEFORE_INITIALIZE_FLAG = 1 << 13;
uint160 internal constant AFTER_INITIALIZE_FLAG = 1 << 12;
uint160 internal constant BEFORE_ADD_LIQUIDITY_FLAG = 1 << 11;
uint160 internal constant AFTER_ADD_LIQUIDITY_FLAG = 1 << 10;
實現邏輯:
function validateHookPermissions(IHooks self, Permissions memory permissions) internal pure {
if (permissions.beforeInitialize != self.hasPermission(BEFORE_INITIALIZE_FLAG)
|| permissions.afterInitialize != self.hasPermission(AFTER_INITIALIZE_FLAG)) {
HookAddressNotValid.selector.revertWith(address(self));
}
}
驗證特點:
BalanceDelta.sol 實現高效的餘額變化表示:
function toBalanceDelta(int128 _amount0, int128 _amount1) pure returns (BalanceDelta balanceDelta) {
assembly ("memory-safe") {
balanceDelta := or(shl(128, _amount0), and(sub(shl(128, 1), 1), _amount1))
}
}
function amount0(BalanceDelta balanceDelta) internal pure returns (int128 _amount0) {
assembly ("memory-safe") {
_amount0 := sar(128, balanceDelta)
}
}
技術特點:
SwapMath.sol 的核心計算函數:
function computeSwapStep(
uint160 sqrtPriceCurrentX96,
uint160 sqrtPriceTargetX96,
uint128 liquidity,
int256 amountRemaining,
uint24 feePips
) internal pure returns (
uint160 sqrtPriceNextX96,
uint256 amountIn,
uint256 amountOut,
uint256 feeAmount
) {
bool zeroForOne = sqrtPriceCurrentX96 >= sqrtPriceTargetX96;
bool exactIn = amountRemaining >= 0;
// 根據交換方向和精確輸入/輸出模式進行計算
if (exactIn) {
uint256 amountRemainingLessFee = FullMath.mulDiv(
uint256(amountRemaining),
1e6 - feePips,
1e6
);
// 計算可能的輸入量...
}
// 費用計算和價格更新邏輯...
}
計算特點:
Pool.sol 中的狀態管理:
struct State {
Slot0 slot0;
uint256 feeGrowthGlobal0X128;
uint256 feeGrowthGlobal1X128;
uint128 liquidity;
mapping(int24 => TickInfo) ticks;
mapping(int16 => uint256) tickBitmap;
mapping(bytes32 => Position.State) positions;
}
狀態設計特點:
struct Slot0 {
uint160 sqrtPriceX96; // 當前價格平方根
int24 tick; // 當前 tick
uint24 protocolFee; // 協議費用
uint24 lpFee; // LP 費用
}
優化效果:
ERC6909.sol 支援單合約多代幣管理:
mapping(address owner => mapping(uint256 id => uint256 balance)) public balanceOf;
function transfer(address receiver, uint256 id, uint256 amount) public virtual returns (bool) {
balanceOf[msg.sender][id] -= amount;
balanceOf[receiver][id] += amount;
emit Transfer(msg.sender, receiver, id, amount);
return true;
}
技術優勢:
ERC6909Claims.sol 添加聲明功能:
mapping(address owner => mapping(uint256 id => uint256 amount)) public claims;
function claim(uint256 id, uint256 amount) external {
claims[msg.sender][id] -= amount;
balanceOf[msg.sender][id] += amount;
emit Claim(msg.sender, id, amount);
}
Claims 機制用途:
type Currency is address;
library CurrencyLibrary {
Currency public constant NATIVE = Currency.wrap(address(0));
function isNative(Currency currency) internal pure returns (bool) {
return Currency.unwrap(currency) == address(0);
}
}
抽象設計的作用:
struct PoolKey {
Currency currency0;
Currency currency1;
uint24 fee;
int24 tickSpacing;
IHooks hooks;
}
function toId(PoolKey memory poolKey) internal pure returns (PoolId poolId) {
assembly ("memory-safe") {
poolId := keccak256(poolKey, 0xa0)
}
}
設計考量:
modifier noDelegateCall() {
if (address(this) != original) revert DelegateCallNotAllowed();
_;
}
library CustomRevert {
function revertWith(bytes4 selector) internal pure {
assembly ("memory-safe") {
mstore(0, selector)
revert(0, 4)
}
}
}
安全特點:
// UnsafeMath:在已知安全的情況下跳過溢出檢查
library UnsafeMath {
function add(uint256 x, uint256 y) internal pure returns (uint256) {
unchecked { return x + y; }
}
}
優化策略:
| 特性 | V3 | V4 | 改進說明 |
|---|---|---|---|
| 池管理 | 獨立合約 | 單例管理 | Gas 效率提升 |
| 擴展性 | 固定邏輯 | 鉤子系統 | 可編程性增強 |
| 代幣標準 | ERC20 | ERC6909 | 多代幣統一管理 |
| 費用結構 | 固定費率 | 動態費率 | 更靈活的費用機制 |
V3 多池操作:
V4 多池操作:
鉤子系統支援的創新功能:
技術標準建立:
核心理念:讓每個人都能客製化交易所
主要特色:
實際應用場景: