昨日,Uniswap 发布了未来即将推出的 Uniswap V4 版本代码草稿,相比 V3 出现了很多创新点。其中,最引人瞩目的一点就是 V4 版本出现了限价单交易。大家对于 Uniswap V4 如何实现限价单交易比较好奇,接下来为大家深入分析一下 Uni V4 版本如何实现限价单交易。
相关阅读:《关于 Uniswap V4,你需要知道的一切》
根据 Uniswap 官方白皮书,限价单交易隶属于其新功能的 Hooks 之下,所以是依靠 Hooks 机制来实现链上限价单交易。
Hooks 是 Uniswap V4 的核心机制,指的是在资金池生命周期的某个特定时刻运行的代码片段。与之前的 Uniswap 版本相比,新版本资金池的可定制程度更高,因此无论是创建池子,还是 LP(流动性提供者)添加/移除流动性,抑或是在 swap 之前/后,Hooks 起到的作用都非常重要。
在 DeFi 中,Hooks 是一种编程概念,指的是一组用于在智能合约执行特定操作时自动触发的函数或代码片段,可用于在特定事件发生前、后或期间执行自定义逻辑。Hooks 为开发者提供了一种在智能合约的不同阶段执行自定义逻辑的方式。通过使用 Hooks,开发人员可以实现更灵活、可定制和可扩展的 DeFi 应用程序。
例如,Hooks 可以用来创建具有根据市场条件变动的动态交换费用的资金池,而不是预先设置和静态的交换费用。同时,Hooks 还使交易者能够下更复杂的订单,例如限价订单或 TWAP(时间加权平均价格)订单,这些订单会在一定时间内买入/卖出一定数量的 Token。
不仅如此,Hooks 还允许以不同的方式使用 Uniswap 的流动性。这类似于 Balancer 的 Boosted Pools,超出范围的流动性可以存入其他协议,例如借贷者,以获得额外的收益。
通过GPT分析 Uniswap V4 的限价单 LimitOrder.sol 的示例合约代码,得出的限价单运行流程大概如下:
通过 LimitOrder 合约,Uniswap 实现了限价单的创建(place)、执行(fill)和撤销(kill)等操作:
用户可以调用 place 函数来创建一个限价单。这个函数需要接收一个 PoolKey(包含交易对的信息),一个 tickLower(价格区间下限),一个 zeroForOne 标志(表示交易方向)和预期添加的流动性 liquidity。这个函数会创建一个新的 Epoch(时间段),并将相关信息存储在 epochInfos 中,然后触发 Place 事件。
在每一次交易结束后,都会调用 afterSwap 函数。这个函数会检查当前的价格是否穿过了任何限价单的价格区间,如果有,就会调用 lockAcquiredFill 来执行限价单。执行限价单的过程中会从池子中提取相应的资金,并触发 Fill 事件。
用户可以调用 kill 函数来撤销一个限价单。这个函数会接收一个 PoolKey,一个 tickLower,一个 zeroForOne 标志和一个接收者地址 to。这个函数会从 epochInfos 中删除相关信息,并将限价单中的资金退回给接收者,然后触发 Kill 事件。
在限价单执行后,用户可以调用 withdraw 函数来提取他们的资金。这个函数会接收一个 Epoch 和一个接收者地址 to,然后将用户在那个时间段内执行的所有限价单的资金提取出来,并触发 Withdraw 事件。
有了 Hooks,限价单的运行机制就很明显了:
-在 Hooks 合约上下订单;
-Hooks 合约将你的订单添加到其 V4 交易上;
-根据自定义或托管预言机,当价格到限价单价格时,会触发 Hooks 自动执行 Swap 操作,并调整流动性;
-Hooks 自动 remove order
-订单取消或完成。
BlockBeats 提醒,以上的解释是基于这个智能合约代码的表面行为。实际的行为可能会受到其他因素(比如其他智能合约的交互、链上数据的变化等)的影响,因此在使用这个合约时应该注意审查其代码并理解其工作原理。
欢迎加入律动 BlockBeats 官方社群:
Telegram 订阅群:https://t.me/theblockbeats
Telegram 交流群:https://t.me/BlockBeats_App
Twitter 官方账号:https://twitter.com/BlockBeatsAsia