至此,我们就讲解完了 UniswapV3 的工厂合约。
从直观上来说,UniswapV3 中,用户添加流动性的时候,需要设置一个价格区间,如下图所示: 默认时这个价格区间是全范围,即 **(0, ∞)**。 因为在 UniswapV3 中,LP 提供的流动性是分为多个不同区间的,那为了方便计算不同区间的流动性和手续费分配,UniswapV3 就将整个价格范围划分为了多个离散的价格点,这些价格点就称为 tick 但在 UniswapV3 中则不是,我们以下图为例进行说明: 上图中,ETH/USDC 当前价格为 1806.97,待添加的流动性价格区间为 (1699, 1900)。 但 UniswapV3 可以为同个交易对创建不同费率的池子,即 token0、token1 加上 fee 三个字段组成了一个 Pool 的唯一性。 价格预言机也做了升级,之前讲区块链预言机章节中已经介绍过 UniswapV2 和 UniswapV3 的预言机。
observationCardinality 和 observationCardinalityNext 是跟 observations 数组有关的,也是计算预言机价格时需要的,这在之前的文章《价格预言机的使用总结(三):UniswapV3 篇》讲解 UniswapV3 预言机时已经介绍过,这里不再赘述。 具体用法在《价格预言机的使用总结(三):UniswapV3篇》一文中已经介绍过,这里也不再赘述。 UniswapV3 的处理方式并不是移除流动性时直接把两种 token 资产转给用户,而是先累加到 tokensOwed0 和 tokensOwed1,代表这是欠用户的资产,其中也包括该头寸已赚取到的手续费 另外,UniswapV3 的闪电贷可以两种 token 都借。
UniswapV3 的 TWAP 则解决了这个缺陷问题,本文就来聊聊 UniswapV3 的 TWAP 机制,以及如何正式使用。 UniswapV3 UniswapV3 的实现机制和 UniswapV2 有很大不同,在计算 TWAP 的数据源方面,UniswapV2 只存储了最新的 price0CumulativeLast、price1CumulativeLast 需要注意的是,在 UniswapV2 中,存储的是价格累计值 priceCumulative,而 UniswapV3 并不直接计算价格累计值,而是计算 tick 累计值。 tick 是 UniswapV3 引入的新概念,因为在 UniswapV3 中,LP 提供的流动性是分为多个不同区间的,那为了方便计算不同区间的流动性和手续费分配,UniswapV3 就将整个价格范围划分为了多个离散的价格点 但在 UniswapV3 中,每个池子的唯一性组成,除了 token0 和 token1,还多了一个手续费率,不同费率的币对分开为了不同的池子。
SwapRouter 合约封装了面向用户的交易接口,但不再像 UniswapV2Router 一样根据不同交易场景拆分为了那么多函数,UniswapV3 的 SwapRouter 核心就只有 4 个交易函数
前面我们说过,UniswapV3 的 LP Token 其实是不可互换的 NFT,是 ERC721 Token。 提取手续费收益和流动性移除的代币 UniswapV2 的手续费收益是在移除流动性时一起提取走的,但 UniswapV3 的手续费收益是单独提取的,通过 collect 函数进行提取。
tickSpacing 和 UniswapV3 的一样,就不再解释了。hooks 是自定义的地址,具体如何实现后面再细说。 fee 则和之前的版本不一样了。 UniswapV3 的 fee 只指定了固定的交易费率,但 UniswapV4 的 fee 其实还包含了动态费用、hook 交易费用、hook 提现费用等标志。 那么要设置 0.3% 的费率的话那就是 3000,这个精度和 UniswapV3 是一致的。 另外,UniswapV3 的费率只能在指定支持的几个费率中选择一个,而 UniswapV4 取消了这个限制,费率完全放开了,由池子的创建者自己去决定要设置多少费率。 ; mapping(int16 => uint256) tickBitmap; mapping(bytes32 => Position.Info) positions; } 如果和 UniswapV3
UniswapV4 与 UniswapV3 相比,算法上并没有什么改变,依然还是采用集中流动性模型,但架构上变化很大,包括功能架构,也包括技术架构。 引入了 Hooks 机制之后,像 UniswapV2 和 UniswapV3 内嵌的价格预言机也变得不再必要了,因此,在 PoolManager 中再见不到价格预言机相关的数据存储和逻辑处理了。
bond 的时候,还需要获取 APEX 的价格,这是从 BondPriceOracle 获取的,而 BondPriceOracle 的价格源则取自 UniswapV3。 但为了避免通过闪电贷进行价格操控,所以 BondPriceOracle 不会直接使用 UniswapV3 的市价,而是会计算出 24 小时内的 TWAP(时间加权平均价格),以 TWAP 作为 bonding 提供的流动性 token esApeX:这是参与 ApeX Staking 时所奖励的 token ApeX:ApeX 协议 token,即 $APEX 支持质押的第一种 token,初期时主要还是在 UniswapV3
PoolKey 相比 UniswapV3 时多了一个 hooks,这其实就是要指定的 Hooks 合约地址。 NoDelegateCall 和 UniswapV3 中使用的 NoDelegateCall 一样的,是为了防止代理调用。 Owned 则是用于设置和检查 owner 权限的。
最后,我们将重点放在UniswapV3协议上,该协议引入了集中流动性范围的概念,并表明可以通过利用经典的UniswapV2池来复制这种头寸,同时对冲部分基础代币价格。 因此,本文描述的非永久性损失动态也适用于UniswapV3池。 We finally focus on the UniswapV3 protocol, which introduced the notion of concentrated liquidity ranges As such, the herein described Impermanent Loss dynamics also apply to UniswapV3 pools. 【7】 From bid-ask
这时候就需要考虑其它价格预言机了,而 UniswapV2 和 UniswapV3 都是不错的选择。 本篇先来聊聊如何使用 UniswapV2 作为价格预言机。 UniswapV3 的 TWAP 则解决了这个问题,下一篇会来聊聊其具体是如何实现的。
总结 虽然这个 DEX 交易聚合器功能很简单,只有查询和兑换功能,但扩展起来很简单,后续还会接入 UniswapV3、Bancor、DODO 等,功能上也还可以再加入添加流动性、移除流动性等功能。
其中包括 Uniswap TWAP 价格预言机,包括 UniswapV2 的,也包括 UniswapV3 的。
因此,在调用者合约里,还需要对用户级别的头寸进行管理的,即类似 UniswapV3 的 NonfungiblePositionManager 合约还是需要的。
如果之前已经了解过 UniswapV3,那对这几个字段应该不陌生。 两个函数修饰器 noDelegateCall 和 onlyByLocker,和之前文章介绍的一样,就不赘述了。
3.3 V3的核心问题是市场竞争 为了解决上述V2的资金效率问题,uniswapV3设计了限定区间的Concentrated Liquidity(集中式流动性),属于在局部减少了资金无效存放的情况,如下图所示
目前最主流的价格预言机主要有 Chainlink、UniswapV2、UniswapV3,这几种价格预言机的接入方式和适用场景都不太一样,可以单独使用,也可以结合使用。
解码一个 Multicall 的 Calldata 我们将从这个[4]交易中得到一个 UniswapV3 multicall 的输入 calldata,在这里,用户从 multicall 函数中调用 3
金融和 NFT 的结合,主要就是将 NFT 应用到 DeFi 中,比如 UniswapV3 中的流动性仓位就是 NFT。