比特派钱包官方入口|uniswap v3 地址

作者: 比特派钱包官方入口
2024-03-13 21:42:13

Introducing Uniswap v3

oducing Uniswap v3 Uniswap Labs BlogLaunch AppBackIntroducing Uniswap v3 March 23, 2021# ProtocolsUniswap v1 was launched in November 2018 as a proof of concept for automated market makers (AMMs), a type of exchange where anyone can pool assets into shared market making strategies.

In May 2020, Uniswap v2 introduced new features and optimizations, setting the stage for exponential growth in AMM adoption. Less than one year since its launch, v2 has facilitated over $135bn in trading volume, ranking as one of the largest cryptocurrency spot exchanges in the world.

Uniswap now serves as critical infrastructure for decentralized finance, empowering developers, traders, and liquidity providers to participate in a secure and robust financial marketplace.

Today, we are excited to present an overview of Uniswap v3. We are targeting an L1 Ethereum mainnet launch on May 5, with an L2 deployment on Optimism set to follow shortly after.

Uniswap v3 introduces:

Concentrated liquidity, giving individual LPs granular control over what price ranges their capital is allocated to. Individual positions are aggregated together into a single pool, forming one combined curve for users to trade against

Multiple fee tiers, allowing LPs to be appropriately compensated for taking on varying degrees of risk

These features make Uniswap v3 the most flexible and efficient AMM ever designed:

LPs can provide liquidity with up to 4000x capital efficiency relative to Uniswap v2, earning higher returns on their capital

Capital efficiency paves the way for low-slippage trade execution that can surpass both centralized exchanges and stablecoin-focused AMMs

LPs can significantly increase their exposure to preferred assets and reduce their downside risk

LPs can sell one asset for another by adding liquidity to a price range entirely above or below the market price, approximating a fee-earning limit order that executes along a smooth curve

Uniswap's oracles are now far easier and cheaper to integrate. V3 oracles are capable of providing time-weighted average prices (TWAPs) on demand for any period within the last ~9 days. This removes the need for integrators to checkpoint historical values.

Even with these groundbreaking design improvements, the gas cost of v3 swaps on Ethereum mainnet is slightly cheaper than v2. Transactions made on the Optimism deployment will likely be significantly cheaper!

Read on for more details on Uniswap v3. For a deeper technical overview check out the Uniswap v3 Core whitepaper, the Uniswap v3 Core smart contracts.

Concentrated Liquidity

In Uniswap v2, liquidity is distributed evenly along an x*y=k price curve, with assets reserved for all prices between 0 and infinity. For most pools, a majority of this liquidity is never put to use. As an example, the v2 DAI/USDC pair reserves just ~0.50% of capital for trading between $0.99 and $1.01 , the price range in which LPs would expect to see the most volume and consequently earn the most fees.

V2 LPs only earn fees on a small portion of their capital, which can fail to appropriately compensate for the price risk ("impermanent loss") they take by holding large inventories in both tokens. Additionally, traders are often subject to high degrees of slippage as liquidity is spread thin across all price ranges.

In Uniswap v3, LP's can concentrate their capital within custom price ranges, providing greater amounts of liquidity at desired prices. In doing so, LPs construct individualized price curves that reflect their own preferences.

LPs can combine any number of distinct concentrated positions within a single pool. For example, an LP in the ETH/DAI pool may choose to allocate $100 to the price ranges $1,000-$2,000 and an additional $50 to the ranges $1,500-$1,750.

By doing so, an LP can approximate the shape of any automated market maker or active order book.

Users trade against the combined liquidity of all individual curves with no gas cost increase per liquidity provider. Trading fees collected at a given price range are split pro-rata by LPs proportional to the amount of liquidity they contributed to that range.

Capital Efficiency

By concentrating their liquidity, LPs can provide the same liquidity depth as v2 within specified price ranges while putting far less capital at risk. The capital saved can be held externally, invested in different assets, deposited elsewhere in DeFi, or used to increase exposure within the specified price range to earn more trading fees.

Let's illustrate with an example:

Alice and Bob both want to provide liquidity in an ETH/DAI pool on Uniswap v3. They each have $1m. The current price of ETH is 1,500 DAI.

Alice decides to deploy her capital across the entire price range (as she would have in Uniswap v2). She deposits 500,000 DAI and 333.33 ETH (worth a total of $1m).

Bob instead creates a concentrated position, depositing only within the price range from 1,000 to 2,250. He deposits 91,751 DAI and 61.17 ETH, worth a total of about $183,500. He keeps the other $816,500 himself, investing it however he prefers.

While Alice has put down 5.44x as much capital as Bob, they earn the same amount of fees, as long as the ETH/DAI price stays within the 1,000 to 2,250 range.

Bob's custom position also acts as a kind of stop-loss for his liquidity. Both Alice and Bob's liquidity will be entirely denominated in ETH if the price of ETH falls to $0. However, Bob will have lost just $159,000, versus Alice's $1m. Bob can use his additional $816,500 to hedge against downside exposure or to invest in any other conceivable strategy.

Instead of providing equivalent liquidity depth as a v2 LPs with less capital, v3 LPs can choose to provide greater depth with the same amount of capital as their v2 counterparts. This requires taking on more price risk ("impermanent loss") while supporting greater amounts of trading and earning higher fees.

LPs in more stable pools will likely provide liquidity in particularly narrow ranges. If the ~$25m currently held in the Uniswap v2 DAI/USDC pair was instead concentrated between 0.99 — 1.01 in v3, it would provide the same depth as $5bn in Uniswap v2 as long as the price stayed within that range. If the ~$25m was concentrated into the 0.999 - 1.001 range it would provide the same depth as $50b in Uniswap v2.

The tool below calculates the capital efficiency gains of a concentrated liquidity position (centered around the current price) relative to allocating capital across the entire price curve.

Liquidity Deposit ValueValue of paired tokens$Select ETH price rangeCurrent Price: $1,820V3 Range PositionCapital Required$150,000Fees per $ vs. V25.24xV2 PositionCapital Required$785,779These two positions will earn equal fees and perform idenitcally while the price remains between $1200 and $2800.

At launch, capital efficiency gains will max out at 4000x for LPs providing liquidity within a single 0.10% price range. The v3 pool factory is technically capable of supporting ranges as granular as 0.02%, translating to a maximum 20,000x capital efficiency gains relative to v2. However, more granular pools can increase swap gas costs and might be more useful on Layer 2.

Active Liquidity

If market prices move outside an LP's specified price range, their liquidity is effectively removed from the pool and is no longer earning fees. In this state, an LP's liquidity is composed entirely of the less valuable of the two assets, until the market price moves back into their specified price range or they decide to update their range to account for current prices.

In v3, it is theoretically possible for no liquidity to exist in a given price range. However, we expect rational LPs to continuously update their price ranges to cover the current market price.

Range Orders

v3's LP customizability opens up a novel order feature to complement market orders, which we are calling "range orders".

LPs can deposit a single token in a custom price range above or below the current price: if the market price enters into their specified range, they sell one asset for another along a smooth curve while earning swap fees in the process.

Depositing to a narrow range feels similar to a traditional limit order. For example, if the current price of DAI is below 1.001 USDC, Alice could add $10m worth of DAI to the range of 1.001 — 1.002 DAI/USDC.

Once DAI trades above 1.002 DAI/USDC, Alice's liquidity will have fully converted into USDC. Alice must withdraw her liquidity (or use a third-party service to withdraw on her behalf) to avoid automatically converting back into DAI if DAI/USDC starts trading below 1.002.

The average execution price of a fully executed range order is the geometric average of the minimum and maximum price: in Alice's case, the execution price equals 1.001499 DAI/USDC for a total of $1,001,499. This execution price does not account for additional swap fees earned during the period in which prices trade within the 1.001 — 1.002 DAI/USDC range.

Range orders within wider ranges may prove particularly useful for profit-taking, buying the dip, and primary issuance events: in the later use case, issuers are now able to deposit liquidity in a single asset and specify the exact range of prices across which they wish to sell their tokens.

Non-Fungible Liquidity

As a byproduct of per-LP custom price curves, liquidity positions are no longer fungible and are not represented as ERC20 tokens in the core protocol.

Instead, LP positions will be represented by non-fungible tokens (NFTs). However, common shared positions can be made fungible (ERC20) via peripheral contracts or through other partner protocols. Additionally, trading fees are no longer automatically reinvested back into the pool on LPs' behalf.

Over time we expect increasingly sophisticated strategies to be tokenized, making it possible for LPs to participate while maintaining a passive user experience. This could include multi-positions, auto-rebalancing to concentrate around the market price, fee reinvestment, lending, and more.

Flexible Fees

Uniswap v3 offers LPs three separate fee tiers per pair — 0.05%, 0.30%, and 1.00%. This array of options ensures that LPs tailor their margins according to expected pair volatility: LPs take on more risk in non-correlated pairs like ETH/DAI and, conversely, take on minimal risk in correlated pairs like USDC/DAI.

Although distinct fee tiers may lead to some degree of liquidity fragmentation, we believe that most pairs will calibrate to an obvious fee tier, which then serves as the canonical market. We expect like-kind asset pairs to congregate around the 0.05% fee tier and pairs like ETH/DAI to use 0.30%, while exotic assets might find 1.00% swap fees more appropriate. governance can add additional fee tiers as needed.

Uniswap v2 introduced a protocol fee switch, which allowed a flat 5 basis point (16.66% of LP fees) fee to be turned on by governance. Uniswap v3 protocol fees are far more flexible. Fees will be off by default, but can be turned on by governance on a per-pool basis and set between 10% and 25% of LP fees.

Advanced Oracles

Uniswap v2 introduced time weighted average price (TWAP) oracles. These oracles serve as a critical piece of DeFi infrastructure, and have been integrated into dozens of projects, including Compound and Reflexer.

V2 oracles work by storing cumulative sums of Uniswap pair prices on a per-second basis. These price sums can be checked once at the beginning of a period and once at the end to calculate an accurate TWAP over that period.

Uniswap v3 offers significant improvements to the TWAP oracle, making it possible to calculate any recent TWAP within the past ~9 days in a single on-chain call. This is achieved by storing an array of cumulative sums instead of just one.

This array of historical price accumulators makes it far easier and cheaper to create more advanced oracles that include simple-moving averages (SMA), exponential moving averages (EMA), outlier filtering, and more.

Despite this major improvement, the gas cost to Uniswap traders for keeping oracles up to date has been reduced by ~50% relative to v2. The costs for calculating TWAPs in external smart contracts is significantly cheaper as well.

License

We strongly believe decentralized financial infrastructure should ultimately be free, open-source software. At the same time, we think the Uniswap community should be the first to build an ecosystem around the Uniswap v3 Core codebase.

With this in mind, Uniswap v3 Core will launch under the Business Source License 1.1—effectively a time-delayed GPL-2.0-or-later license. The license limits use of the v3 source code in a commercial or production setting for up to two years, at which point it will convert to a GPL license into perpetuity.

Uniswap governance can accelerate the change to GPL or grant exemptions to the license at any time by updating the files at _ v3-core-license-date.uniswap.eth _ and _ v3-core-license-grants.uniswap.eth _.

Note that the BUSL 1.1 license does not affect integrations. All code that may be needed for external integrations has been licensed under GPL or MIT , including math libraries, peripheral contracts, interfaces, and the developer sdk. Any wallet, interface, mobile app, protocol, or other project will be able to integrate with v3 as expected.

For more information on this license, see this FAQ.

Audits and Bug Bounty

Our team believes security is of the utmost importance — it took hundreds of hours of testing for us to feel comfortable with launching Uniswap v3.

Our security process for v3 included:

A full-length audit from Trail of Bits

A full-length audit from ABDK

A full audit from samczsun (no report)

An auditing and review process from our engineering team

A comprehensive test suite, including the automated tools Echidna and Manticore

Major bugs discovered as part of the testing and auditing process were fixed. However, we would like to note that Uniswap v3 is an extremely complex protocol and we cannot guarantee all bugs have already been discovered and resolved.

To help find any open vulnerabilities, a public bug bounty will run over the next 30 days, with up to $500,000 offered for critical bugs. More detail on the public bug bounty can be found here.

Launch Details

The Uniswap v3 smart contracts will be deployed to the Ropsten, Rinkeby, Kovan, and Görli testnets in the coming days, giving developers time to begin experimenting with the protocol before the official launch.

The Uniswap v3 Core repository contains the essential, low-level smart contracts that power the protocol.

The Uniswap v3 Periphery repository contains a collection of smart contracts designed to ease user interaction with core contracts.

A liquidity provider migration portal will be available at launch, allowing v2 LPs to seamlessly transfer their liquidity to the new protocol.

In the meantime, there are few outstanding items to complete:

Partners and integrations can begin building on Uniswap v3 immediately, in preparation for mainnet launch!

The interface, analytics site, API, and developer SDK are being redesigned to work with Uniswap v3.

The initial Uniswap v3 router and position manager contracts are almost complete. While still subject to change, they are available here.

Documentation, guides, and further examples are in progress.

Additional infrastructure to support fungibile positions, liquidity mining, more complex strategies, and various other use cases will be built by Uniswap Labs together with the Uniswap community after mainnet launch

Reach out

On Friday, March 26 at 2pm ET we will host an AMA on the official Uniswap Discord, where we hope to answer any outstanding questions you may have around Uniswap v3. Questions can be submitted ahead of time here.

We will be releasing further updates, additional information, and initial documentation over the coming days and welcome all feedback and involvement from our community.

If you are integrating and wish to get in touch, please fill out this form and we will try to respond as soon as possible. Alternatively, reach out in the #v3-integrations channel in the community Discord

To get involved and stay up to date:

Join the Uniswap community discord

Follow Uniswap on Twitter

Subscribe to the Uniswap blog

Register as a delegate Sybil

Participate in Uniswap governance

Uniswap Team

Concentrated LiquidityCapital EfficiencyActive LiquidityRange OrdersNon-Fungible LiquidityFlexible FeesAdvanced OraclesLicenseAudits and Bug BountyLaunch DetailsReach outRelated posts May 05, 2021Uniswap v3 Mainnet launch March 23, 2020Uniswap v2 Overview June 01, 2023Uniswap 101: What is Uniswap? | Uniswap L

Home | Uniswap Protocol

| Uniswap ProtocolEcosystemCommunityGovernanceDevelopersBlogFAQJobsLaunch AppMenuUNISWAP PROTOCOLSwap, earn, and build on the leading decentralized crypto trading protocol.Launch App$489B+Trade Volume71M+All Time Trades300+Integrations4,400+Community DelegatesUNISWAP ECOSYSTEM →A growing network of DeFi Apps.Developers, traders, and liquidity providers participate together in a financial marketplace that is open and accessible to all.300+IntegrationsExplore all ↗DEVELOPERS →Superpowers for DeFi developers.Build Defi apps and tools on the largest crypto project on Ethereum. Get started with quick start guides, protocol documentation, a Javascript SDK, and fully open source code.Documentation ↗V3 WhitepaperGithubApply for funding from the Uniswap Grants ProgramGet paid to build the future of finance. Uniswap Governance offers grant funding for people building apps, tools, and activities on the Uniswap Protocol.Learn more ↗PROTOCOL GOVERNANCE ->Governed by the community.The Uniswap Protocol is managed by a global community of UNI token holders and delegates.Read more ↗Governance Forum Participate by proposing upgrades and discussing the future of the protocol with the Uniswap community.Sybil Vote on offchain proposals with the Snapshot interface. Votes are weighted by the number of UNI delegates.Governance Portal Vote on official Uniswap governance proposals and view past proposals. EcosystemCommunityGovernanceDevelopersBlogFAQPrivacy PolicyTrademark PolicySecurityMedia inquires for Uniswap Labs - Contact [email protect

Uniswap V3 介绍 | 登链社区 | 区块链技术社区

Uniswap V3 介绍 | 登链社区 | 区块链技术社区

文章

问答

讲堂

专栏

集市

更多

提问

发表文章

活动

文档

招聘

发现

Toggle navigation

首页 (current)

文章

问答

讲堂

专栏

活动

招聘

文档

集市

搜索

登录/注册

Uniswap V3 介绍

翻译小组

更新于 2021-03-24 11:43

阅读 13277

Uniswap V3 主要更新点:1. 分不同价格阶段提供流动性, 2. 提供多个收费层级 3. 单边提供流动性 4. 高级预言机

> * 原文 https://uniswap.org/blog/uniswap-v3/

> * 译文出自:[登链翻译计划](https://github.com/lbc-team/Pioneer)

> * 译者:[翻译小组](https://learnblockchain.cn/people/412)

> * 校对:[Tiny 熊](https://learnblockchain.cn/people/15)

> * 本文永久链接:[learnblockchain.cn/article…](https://learnblockchain.cn/article/2302)

Uniswap v1于2018年11月推出,主要是验证自动做市商(AMM)的概念,是一种任何人都可以将资产汇集到资金池做市策略的去中心化交易所。

2020年5月,Uniswap v2引入了新的功能和优化,为AMM的应用指数级增长奠定了基础。 v2上线不到一年,就促成了超过1350亿美元的交易量,是全球最大的加密货币现货交易所之一。

Uniswap现在作为去中心化金融的关键基础设施,赋予开发者、交易者和流动性提供者参与安全稳健的金融市场的能力。

今天,我们很高兴地介绍Uniswap v3的概况。 我们的目标是在5月5日在以太坊主网**发布**,并在之后的不久部署到Optimism L2上。

Uniswap v3 介绍:

- **集中流动性**,使个人LP (流动性提供者)对其资本分配到什么价格范围有细微的控制。 个别仓位汇总到一个资金池里,形成一条组合曲线,供用户交易时对照。

- **多个收费层级**,使LP能够因承担不同程度的风险而得到适当补偿。

这些特点使Uniswap v3成为**设计最灵活、最高效的AMM**。

- 相对于Uniswap v2,LP可以**提高4000倍的资本效率**提供流动性,以获得**更高的资本回报**。

- 资本效率为低滑点的**交易执行铺平了道路,可以超越中心化交易所和专注于稳定币的AMM**。

- LP可以显著**增加对优先资产的敞口**,并**降低其下行风险**。

- LP可以通过在完全高于或低于市场价格的价格区间内增加流动性,类似于**沿平滑曲线执行的收费限价单来卖出另一种资产**。

Uniswap**预言机可以更简单和更低成本的集成**。 V3预言机能够根据需求提供过去约9天内任何时期的时间加权平均价格(TWAP)。 这样一来,集成项目就不需要检查历史价格值了。

即使有这些突破性的设计改进,在以太坊主网上使用 V3 兑换的**Gas成本也比V2**略微便宜。 在Optimism部署上进行的交易将可能会更大程度地便宜!

请继续阅读Uniswap v3的详细信息。 更深层次的技术概述请查看[Uniswap v3 Core白皮书](https://uniswap.org/whitepaper-v3.pdf)、[Uniswap v3 Core智能合约](https://github.com/Uniswap/uniswap-v3-core/)。

## 关于集中流动性

在Uniswap v2中,流动性沿着 x*y=k 的价格曲线均匀分布,资产保留在0到无穷大之间的所有价格。 对于大多数池子来说,这些流动池资金的大部分其实未被利用。 例如,**v2 DAI/USDC货币仅用了约 0.50%的资本 在0.99美元至1.01美元**之间进行交易,在这个价格区间内,LP们预期会看到最多的交易量,从而赚取最多的费用。

V2 LP只赚取一小部分资本的费用,这可能无法适当补偿他们因持有两种代币的大量库存而承担的价格风险(`无常损失`)。 此外,由于流动性摊薄在所有价格区间,交易者往往会出现很高的价格滑点。

在Uniswap v3中,LP可以**将资本集中在自定义的价格范围内,以理想的价格提供更多的流动性**,这样一来,**LP就构建了反映自己偏好的个性化价格曲线**。

https://uniswap.org/images/CYL.mp4

V3 LP可以将其流动性集中在自定义价格范围内。

LP可以将任何数量的不同的集中持仓组合存入一个池子里。 例如,ETH/DAI池中的LP可以选择将100美元分配给1,000-2,000美元的价格区间,并将另外50美元分配给1,500-1,750美元的区间。

通过这种方式,LP可以近似于任何自动做市商或主动订单簿的形态作市。

**用户针对所有单个曲线的综合流动性进行交易**,每个流动性提供者的Gas成本不增加。 在某一价格区间收取的交易费由LP按其对该区间贡献的流动性按比例分成。

https://uniswap.org/images/IS.mp4

LP可以将多个仓位组合起来,然后高效地汇总到一个订单簿上。

## 资本效率

通过集中流动性,LP可以在指定的价格区间内提供**与v2相同的流动性深度,同时将远低于v2的资本风险**,节省下来的资本可以对外持有,投资于不同的资产,存放在DeFi的其他地方,或者用于增加指定价格区间内的风险敞口,赚取更多的交易费用。

https://uniswap.org/images/MFFL.mp4

集中的流动性使LPs能够提供更深入的收费价格范围。

我们用一个例子来说明。

Alice和Bob都想在Uniswap v3上的ETH/DAI池中提供流动性,他们每人有100万美元。 目前ETH的价格是1500DAI。

Alice决定在整个价格范围内部署她的资本(就像她在Uniswap v2中一样)。 她存入50万DAI和333.33ETH(共值100万美元)。

Bob则建立了一个集中的仓位,只在1000到2250的价格范围内存款。 他存入了91751DAI和61.17ETH,总价值约18.35万美元。 他自己保留了另外的81.65万美元,按照自己的喜好进行投资。

虽然Alice投入的资金是Bob的5.44倍,但只要ETH/DAI价格保持在1000到2250的区间内,*他们赚取的费用是一样的。

![1.png](https://img.learnblockchain.cn/attachments/2022/06/FP1awLpb62bba7074e7c3.png)

Bob的定制仓位也是他流动资金的一种止损。 如果ETH价格跌至0美元,Alice和Bob的流动资金都将完全以ETH计价。 然而,Bob将只损失15.9万美元,而Alice则损失100万美元。 Bob可以用他额外的816,500美元来对冲下行风险,或者投资于任何其他可以想象的策略。

![2.png](https://img.learnblockchain.cn/attachments/2022/06/QlxfzpoE62bba72ad6fb2.png)

v3 LP不需要像v2 LP那样以较少的资本提供同等的流动性深度,而是可以选择与v2 LP一样以相同的资本量提供更大的深度。 这就需要**承担更多的价格风险**(`无常损失`),同时支持更多的交易量,赚取更高的费用。

较稳定的资金池中的LP可能会在特别狭窄的范围内提供流动性。 如果目前在Uniswap v2 DAI/USDC对中持有的约2500万美元改成在v3中集中在0.99-1.01之间,只要价格保持在这个范围内,就能提供与Uniswap v2中50亿美元相同的深度。 **如果约2500万美元集中在0.999-1.001的范围内,它将提供与Uniswap v2中50亿美元相同的深度**。

下面的工具可以计算集中流动性头寸(以当前价格为中心)相对于在整个价格曲线上配置资本的资本效率收益。

![i集中流动性头寸](https://img.learnblockchain.cn/pics/20210324101023.png)

> 价格保持在1200元至2800元之间,在 V3 提供$15000 和 V2 提供$78599 获得相同的收益

>

> 以上为计算器截图,计算器 链接:**https://uniswap.org/blog/uniswap-v3/**

在V3 发布后,对于在0.10%的单一价格区间内提供流动性的LP来说,资本效率收益最高将达到4000倍。 v3 资金池工厂在技术上能够支持0.02%的颗粒度,相对于v2来说,最高可获得20000倍的资本效率收益。然而,更多颗粒度的资金池会增加兑换时的 Gas成本,因此在2层网络上可能更有用。

## 活跃流动性

如果市场价格在LP指定的价格区间之外变动,其流动性就会被有效地从资金池中移除,不再赚取费用。 在这种状态下,LP的流动性完全由两种资产中价值较低的一种组成,直到市场价格回到他们指定的价格区间,或者他们决定更新他们的区间,以考虑到当前的价格。

https://uniswap.org/images/AL.mp4

LP只有在市场在其指定的价格区间内交易时才会赚取费用。

在v3中,理论上在某个的价格区间内是可以不存在流动性的。 不过,我们期望理性的LP能不断更新价格区间,以覆盖当前的市场价格。

## 范围订单

V3的LP定制性开辟了一种新颖的订单功能,作为市场订单的补充,我们称之为 `范围订单`。

LP可以在高于或低于当前价格的自定义价格区间内存入单一代币:如果市场价格进入他们指定的价格区间,他们就会沿着平滑的曲线卖出存入的资产换取另一种资产,同时在这个过程中赚取手续费。

存款到一个狭窄的价格范围,感觉类似于传统的限价单(Limit Order)。 例如,如果DAI的当前价格低于1.001 USDC,Alice可以在1.001 - 1.002 DAI/USDC的范围内增加价值1000万美元的DAI。

一旦价格在1.002 DAI/USDC 之上,Alice的DAI将全部卖出换为USDC。 Alice需要赎回自己的流动性(或使用第三方服务代为赎回),以避免在DAI/USDC开始交易低于1.002时又转换回DAI。

![3.png](https://img.learnblockchain.cn/attachments/2022/06/xoNMzpzk62bba79618e3d.png)

一个完全执行的范围订单的平均执行价格是最低价和最高价的几何平均值:在Alice的案例中,执行价格等于1.001499 DAI/USDC,共计1,001,499美元。 该执行价格不计入价格在1.001-1.002 DAI/USDC范围内交易期间赚取的额外手续费用。

更大价格范围的订单可能被证明对**获利套现( profit-taking)、抄底(buying the dip)**,和**新币发行**中特别有用:在后一种使用场景中,发行人现在能够存入单一资产作为流动性,并指定他们希望出售其代币的确切价格范围。

## 不可替代流动性资产

作为按LP定制价格曲线的副产品,流动性头寸不再是可互换的,在核心协议中不再以ERC20代币的形式表示。

取而代之的是,LP仓位将由不可替换代币(NFT)代表。 然而,公共共享的头寸可以通过外围合约或通过其他伙伴协议进行互换(ERC20)。 此外,交易费不再代表LP自动重新投资到资金池中。

随着时间的推移,我们期望越来越复杂的策略能够被代币化,使得LP在保持被动的用户体验的同时也能参与其中。 这可能包括多仓位、自动再平衡以让价格保持在市场价格周围、费用再投资、借贷等。

## 弹性费用

Uniswap v3为每对LP提供三个独立的费用等级--0.05%、0.30%和1.00%。 这些选择可确保LP根据预期的货币对波动率来调整其保证金: LP在ETH/DAI等非相关货币对中承担更多的风险,反之,在USDC/DAI等相关货币对中承担最小的风险。

虽然不同的收费层级可能会导致一定程度的流动性分化,但我们相信大多数交易对都会按照 `显而易见 `的收费层级进行校准,然后作为标准市场。 我们预计同类相关资产对会在集中在0.05%的费率附近,ETH/DAI等资产对会使用0.30%,而外来(exotic)资产可能会发现1.00%的交换费用更合适。可以根据需要通过治理增加额外的收费层。

Uniswap v2引入了协议费开关,允许治理层开启统一的5个基点(LP费用的16.66%)费用。 Uniswap v3协议的收费要灵活得多。 费用默认为关闭,但可由治理层按每个资金池开启,并设定在LP费用的10%至25%之间。

## 高级预言机

Uniswap v2引入了时间加权平均价格(TWAP)预言机。 这些预言机是DeFi基础设施的重要组成部分,已被集成到数十个项目中,包括Compound和Reflexer。

V2 预言机的工作原理是以每秒钟为单位存储Uniswap对价格的累加。 这些价格和可以在(计价周期)开始和结束各检查一次,以计算出该周期的准确时间加权平均价格(TWAP)。

Uniswap v3对TWAP预言机进行了重大改进,使其可以在一次链上调用中计算过去约9天内的任何最近TWAP。 这是通过存储一组的累计和而不是只存储一个累加来实现。

![4.png](https://img.learnblockchain.cn/attachments/2022/06/usvumIoI62bba7b42db4f.png)

这一系列的历史价格累积器使得创建更高级的预言机变得更加容易和便宜,包括简单移动平均线(SMA)、指数移动平均线(EMA)、异常值过滤等。

尽管有这一重大改进,但Uniswap交易商保持预言机更新的Gas成本相对v2减少了约50%。`外部智能合约 `中计算TWAP的成本也明显便宜了。

## 源码许可

我们坚信,去中心化的金融基础设施最终应该是自由的、开源的软件。 同时,我们认为Uniswap社区应该率先围绕Uniswap v3核心代码库建立一个生态系统。

考虑到这一点,Uniswap v3 Core将在[BUSL(商业源码许可证)1.1](https://github.com/Uniswap/uniswap-v3-core/blob/main/LICENSE)下推出,实际上是**一个延时的GPL-2.0或更高版本的许可证**。 该许可证将V3源代码在商业或生产环境中的使用限制为两年,届时它将永久转换为GPL许可证。

Uniswap治理层可以通过更新***v3-core-license-date.uniswap.eth***和***v3-core-license-grants.uniswap.eth***的文件,随时加速向GPL的转变或授予许可证豁免。

请注意,BUSL 1.1许可不影响集成。 **外部集成可能需要的所有代码都已获得GPL或MIT**授权,包括数学库、外围合约、接口和开发者SDK。 任何钱包、接口、移动应用、协议或其他项目都能按预期与v3集成。

有关该许可证的更多信息,请参见[常见问题](https://mariadb.com/bsl-faq-adopting/)。

## 审计和赏金

我们的团队认为安全是最重要的--我们花了数百个小时的测试,才放心地推出Uniswap v3。

我们的V3安全流程包括:

- [来自Bits of Bits审计](https://github.com/Uniswap/uniswap-v3-core/blob/main/audits/tob/audit.pdf)

- [ABDK的全面审计](https://github.com/Uniswap/uniswap-v3-core/blob/main/audits/abdk/audit.pdf)

- [samczsun](https://samczsun.com/)的全面审计(无报告)

- 来自我们工程团队的审计和审查过程

- 全面的测试,包括自动化工具Echidna和Manticore。

在测试和审计过程中发现的重大错误已得到修复。 然而,我们要指出的是,Uniswap v3是一个极其复杂的协议,我们不能保证所有的bug都已经被发现和解决。

为了帮助找到任何开放的漏洞,公共错误赏金将在未来30天内进行,为关键错误提供最高50万美元。 更多关于公共bug赏金的细节可以在[这里](https://github.com/Uniswap/uniswap-v3-core/blob/main/bug-bounty.md)找到。

## 发布细节

Uniswap v3智能合约将在未来几天部署到Ropsten、Rinkeby、Kovan和Görli试验网,让开发者有时间在正式发布前开始试验该协议。

- [Uniswap v3 Core 代码库](https://github.com/Uniswap/uniswap-v3-core)包含了为协议提供动力的基本的底层智能合约。

- [Uniswap v3 外围代码库](https://github.com/Uniswap/uniswap-v3-periphery)包含了一个智能合约的集合,旨在方便用户与核心合约的交互。

流动性提供者迁移门户站将在Uniswap v3 发布提供,允许 v2 LP将其流动性无缝转移到新协议。

同时,还有一些未完成的项目。

- 合作伙伴和集成商可以立即开始在Uniswap v3的基础上进行构建,为主网的推出做准备。

- 界面、分析网站、API和开发者SDK正在重新设计,以配合Uniswap v3使用。

- 最初的Uniswap v3路由器和仓位管理器合约几乎已经完成。 虽然仍有可能发生变化,但可在[此处](https://github.com/Uniswap/uniswap-v3-periphery)查阅。

- 文件、指南和更多的例子正在编写中。

- **主网启动后**, Uniswap实验室将与Uniswap社区一起建立更多的基础设施,以支持可替换仓位、流动性挖矿、更复杂的战略和各种其他使用场景。

Uniswap团队 。

---

本翻译由 [Cell Network](https://www.cellnetwork.io/?utm_souce=learnblockchain) 赞助支持。

原文 https://uniswap.org/blog/uniswap-v3/

译文出自:登链翻译计划

译者:翻译小组

校对:Tiny 熊

本文永久链接:learnblockchain.cn/article…

Uniswap v1于2018年11月推出,主要是验证自动做市商(AMM)的概念,是一种任何人都可以将资产汇集到资金池做市策略的去中心化交易所。

2020年5月,Uniswap v2引入了新的功能和优化,为AMM的应用指数级增长奠定了基础。 v2上线不到一年,就促成了超过1350亿美元的交易量,是全球最大的加密货币现货交易所之一。

Uniswap现在作为去中心化金融的关键基础设施,赋予开发者、交易者和流动性提供者参与安全稳健的金融市场的能力。

今天,我们很高兴地介绍Uniswap v3的概况。 我们的目标是在5月5日在以太坊主网发布,并在之后的不久部署到Optimism L2上。

Uniswap v3 介绍:

集中流动性,使个人LP (流动性提供者)对其资本分配到什么价格范围有细微的控制。 个别仓位汇总到一个资金池里,形成一条组合曲线,供用户交易时对照。

多个收费层级,使LP能够因承担不同程度的风险而得到适当补偿。

这些特点使Uniswap v3成为设计最灵活、最高效的AMM。

相对于Uniswap v2,LP可以提高4000倍的资本效率提供流动性,以获得更高的资本回报。

资本效率为低滑点的交易执行铺平了道路,可以超越中心化交易所和专注于稳定币的AMM。

LP可以显著增加对优先资产的敞口,并降低其下行风险。

LP可以通过在完全高于或低于市场价格的价格区间内增加流动性,类似于沿平滑曲线执行的收费限价单来卖出另一种资产。

Uniswap预言机可以更简单和更低成本的集成。 V3预言机能够根据需求提供过去约9天内任何时期的时间加权平均价格(TWAP)。 这样一来,集成项目就不需要检查历史价格值了。

即使有这些突破性的设计改进,在以太坊主网上使用 V3 兑换的Gas成本也比V2略微便宜。 在Optimism部署上进行的交易将可能会更大程度地便宜!

请继续阅读Uniswap v3的详细信息。 更深层次的技术概述请查看Uniswap v3 Core白皮书、Uniswap v3 Core智能合约。

关于集中流动性

在Uniswap v2中,流动性沿着 x*y=k 的价格曲线均匀分布,资产保留在0到无穷大之间的所有价格。 对于大多数池子来说,这些流动池资金的大部分其实未被利用。 例如,v2 DAI/USDC货币仅用了约 0.50%的资本 在0.99美元至1.01美元之间进行交易,在这个价格区间内,LP们预期会看到最多的交易量,从而赚取最多的费用。

V2 LP只赚取一小部分资本的费用,这可能无法适当补偿他们因持有两种代币的大量库存而承担的价格风险(无常损失)。 此外,由于流动性摊薄在所有价格区间,交易者往往会出现很高的价格滑点。

在Uniswap v3中,LP可以将资本集中在自定义的价格范围内,以理想的价格提供更多的流动性,这样一来,LP就构建了反映自己偏好的个性化价格曲线。

https://uniswap.org/images/CYL.mp4

V3 LP可以将其流动性集中在自定义价格范围内。

LP可以将任何数量的不同的集中持仓组合存入一个池子里。 例如,ETH/DAI池中的LP可以选择将100美元分配给1,000-2,000美元的价格区间,并将另外50美元分配给1,500-1,750美元的区间。

通过这种方式,LP可以近似于任何自动做市商或主动订单簿的形态作市。

用户针对所有单个曲线的综合流动性进行交易,每个流动性提供者的Gas成本不增加。 在某一价格区间收取的交易费由LP按其对该区间贡献的流动性按比例分成。

https://uniswap.org/images/IS.mp4

LP可以将多个仓位组合起来,然后高效地汇总到一个订单簿上。

资本效率

通过集中流动性,LP可以在指定的价格区间内提供与v2相同的流动性深度,同时将远低于v2的资本风险,节省下来的资本可以对外持有,投资于不同的资产,存放在DeFi的其他地方,或者用于增加指定价格区间内的风险敞口,赚取更多的交易费用。

https://uniswap.org/images/MFFL.mp4

集中的流动性使LPs能够提供更深入的收费价格范围。

我们用一个例子来说明。

Alice和Bob都想在Uniswap v3上的ETH/DAI池中提供流动性,他们每人有100万美元。 目前ETH的价格是1500DAI。

Alice决定在整个价格范围内部署她的资本(就像她在Uniswap v2中一样)。 她存入50万DAI和333.33ETH(共值100万美元)。

Bob则建立了一个集中的仓位,只在1000到2250的价格范围内存款。 他存入了91751DAI和61.17ETH,总价值约18.35万美元。 他自己保留了另外的81.65万美元,按照自己的喜好进行投资。

虽然Alice投入的资金是Bob的5.44倍,但只要ETH/DAI价格保持在1000到2250的区间内,*他们赚取的费用是一样的。

Bob的定制仓位也是他流动资金的一种止损。 如果ETH价格跌至0美元,Alice和Bob的流动资金都将完全以ETH计价。 然而,Bob将只损失15.9万美元,而Alice则损失100万美元。 Bob可以用他额外的816,500美元来对冲下行风险,或者投资于任何其他可以想象的策略。

v3 LP不需要像v2 LP那样以较少的资本提供同等的流动性深度,而是可以选择与v2 LP一样以相同的资本量提供更大的深度。 这就需要承担更多的价格风险(无常损失),同时支持更多的交易量,赚取更高的费用。

较稳定的资金池中的LP可能会在特别狭窄的范围内提供流动性。 如果目前在Uniswap v2 DAI/USDC对中持有的约2500万美元改成在v3中集中在0.99-1.01之间,只要价格保持在这个范围内,就能提供与Uniswap v2中50亿美元相同的深度。 如果约2500万美元集中在0.999-1.001的范围内,它将提供与Uniswap v2中50亿美元相同的深度。

下面的工具可以计算集中流动性头寸(以当前价格为中心)相对于在整个价格曲线上配置资本的资本效率收益。

价格保持在1200元至2800元之间,在 V3 提供$15000 和 V2 提供$78599 获得相同的收益

以上为计算器截图,计算器 链接:https://uniswap.org/blog/uniswap-v3/

在V3 发布后,对于在0.10%的单一价格区间内提供流动性的LP来说,资本效率收益最高将达到4000倍。 v3 资金池工厂在技术上能够支持0.02%的颗粒度,相对于v2来说,最高可获得20000倍的资本效率收益。然而,更多颗粒度的资金池会增加兑换时的 Gas成本,因此在2层网络上可能更有用。

活跃流动性

如果市场价格在LP指定的价格区间之外变动,其流动性就会被有效地从资金池中移除,不再赚取费用。 在这种状态下,LP的流动性完全由两种资产中价值较低的一种组成,直到市场价格回到他们指定的价格区间,或者他们决定更新他们的区间,以考虑到当前的价格。

https://uniswap.org/images/AL.mp4

LP只有在市场在其指定的价格区间内交易时才会赚取费用。

在v3中,理论上在某个的价格区间内是可以不存在流动性的。 不过,我们期望理性的LP能不断更新价格区间,以覆盖当前的市场价格。

范围订单

V3的LP定制性开辟了一种新颖的订单功能,作为市场订单的补充,我们称之为 范围订单。

LP可以在高于或低于当前价格的自定义价格区间内存入单一代币:如果市场价格进入他们指定的价格区间,他们就会沿着平滑的曲线卖出存入的资产换取另一种资产,同时在这个过程中赚取手续费。

存款到一个狭窄的价格范围,感觉类似于传统的限价单(Limit Order)。 例如,如果DAI的当前价格低于1.001 USDC,Alice可以在1.001 - 1.002 DAI/USDC的范围内增加价值1000万美元的DAI。

一旦价格在1.002 DAI/USDC 之上,Alice的DAI将全部卖出换为USDC。 Alice需要赎回自己的流动性(或使用第三方服务代为赎回),以避免在DAI/USDC开始交易低于1.002时又转换回DAI。

一个完全执行的范围订单的平均执行价格是最低价和最高价的几何平均值:在Alice的案例中,执行价格等于1.001499 DAI/USDC,共计1,001,499美元。 该执行价格不计入价格在1.001-1.002 DAI/USDC范围内交易期间赚取的额外手续费用。

更大价格范围的订单可能被证明对获利套现( profit-taking)、抄底(buying the dip),和新币发行中特别有用:在后一种使用场景中,发行人现在能够存入单一资产作为流动性,并指定他们希望出售其代币的确切价格范围。

不可替代流动性资产

作为按LP定制价格曲线的副产品,流动性头寸不再是可互换的,在核心协议中不再以ERC20代币的形式表示。

取而代之的是,LP仓位将由不可替换代币(NFT)代表。 然而,公共共享的头寸可以通过外围合约或通过其他伙伴协议进行互换(ERC20)。 此外,交易费不再代表LP自动重新投资到资金池中。

随着时间的推移,我们期望越来越复杂的策略能够被代币化,使得LP在保持被动的用户体验的同时也能参与其中。 这可能包括多仓位、自动再平衡以让价格保持在市场价格周围、费用再投资、借贷等。

弹性费用

Uniswap v3为每对LP提供三个独立的费用等级--0.05%、0.30%和1.00%。 这些选择可确保LP根据预期的货币对波动率来调整其保证金: LP在ETH/DAI等非相关货币对中承担更多的风险,反之,在USDC/DAI等相关货币对中承担最小的风险。

虽然不同的收费层级可能会导致一定程度的流动性分化,但我们相信大多数交易对都会按照 显而易见的收费层级进行校准,然后作为标准市场。 我们预计同类相关资产对会在集中在0.05%的费率附近,ETH/DAI等资产对会使用0.30%,而外来(exotic)资产可能会发现1.00%的交换费用更合适。可以根据需要通过治理增加额外的收费层。

Uniswap v2引入了协议费开关,允许治理层开启统一的5个基点(LP费用的16.66%)费用。 Uniswap v3协议的收费要灵活得多。 费用默认为关闭,但可由治理层按每个资金池开启,并设定在LP费用的10%至25%之间。

高级预言机

Uniswap v2引入了时间加权平均价格(TWAP)预言机。 这些预言机是DeFi基础设施的重要组成部分,已被集成到数十个项目中,包括Compound和Reflexer。

V2 预言机的工作原理是以每秒钟为单位存储Uniswap对价格的累加。 这些价格和可以在(计价周期)开始和结束各检查一次,以计算出该周期的准确时间加权平均价格(TWAP)。

Uniswap v3对TWAP预言机进行了重大改进,使其可以在一次链上调用中计算过去约9天内的任何最近TWAP。 这是通过存储一组的累计和而不是只存储一个累加来实现。

这一系列的历史价格累积器使得创建更高级的预言机变得更加容易和便宜,包括简单移动平均线(SMA)、指数移动平均线(EMA)、异常值过滤等。

尽管有这一重大改进,但Uniswap交易商保持预言机更新的Gas成本相对v2减少了约50%。外部智能合约中计算TWAP的成本也明显便宜了。

源码许可

我们坚信,去中心化的金融基础设施最终应该是自由的、开源的软件。 同时,我们认为Uniswap社区应该率先围绕Uniswap v3核心代码库建立一个生态系统。

考虑到这一点,Uniswap v3 Core将在BUSL(商业源码许可证)1.1下推出,实际上是一个延时的GPL-2.0或更高版本的许可证。 该许可证将V3源代码在商业或生产环境中的使用限制为两年,届时它将永久转换为GPL许可证。

Uniswap治理层可以通过更新v3-core-license-date.uniswap.eth和v3-core-license-grants.uniswap.eth的文件,随时加速向GPL的转变或授予许可证豁免。

请注意,BUSL 1.1许可不影响集成。 外部集成可能需要的所有代码都已获得GPL或MIT授权,包括数学库、外围合约、接口和开发者SDK。 任何钱包、接口、移动应用、协议或其他项目都能按预期与v3集成。

有关该许可证的更多信息,请参见常见问题。

审计和赏金

我们的团队认为安全是最重要的--我们花了数百个小时的测试,才放心地推出Uniswap v3。

我们的V3安全流程包括:

来自Bits of Bits审计

ABDK的全面审计

samczsun的全面审计(无报告)

来自我们工程团队的审计和审查过程

全面的测试,包括自动化工具Echidna和Manticore。

在测试和审计过程中发现的重大错误已得到修复。 然而,我们要指出的是,Uniswap v3是一个极其复杂的协议,我们不能保证所有的bug都已经被发现和解决。

为了帮助找到任何开放的漏洞,公共错误赏金将在未来30天内进行,为关键错误提供最高50万美元。 更多关于公共bug赏金的细节可以在这里找到。

发布细节

Uniswap v3智能合约将在未来几天部署到Ropsten、Rinkeby、Kovan和Görli试验网,让开发者有时间在正式发布前开始试验该协议。

Uniswap v3 Core 代码库包含了为协议提供动力的基本的底层智能合约。

Uniswap v3 外围代码库包含了一个智能合约的集合,旨在方便用户与核心合约的交互。

流动性提供者迁移门户站将在Uniswap v3 发布提供,允许 v2 LP将其流动性无缝转移到新协议。

同时,还有一些未完成的项目。

合作伙伴和集成商可以立即开始在Uniswap v3的基础上进行构建,为主网的推出做准备。

界面、分析网站、API和开发者SDK正在重新设计,以配合Uniswap v3使用。

最初的Uniswap v3路由器和仓位管理器合约几乎已经完成。 虽然仍有可能发生变化,但可在此处查阅。

文件、指南和更多的例子正在编写中。

主网启动后, Uniswap实验室将与Uniswap社区一起建立更多的基础设施,以支持可替换仓位、流动性挖矿、更复杂的战略和各种其他使用场景。

Uniswap团队 。

本翻译由 Cell Network 赞助支持。

学分: 81

分类: Uniswap

标签:

Uniswap 

点赞 8

收藏 4

分享

Twitter分享

微信扫码分享

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

该文章收录于

DEFI 协议解析

471 订阅

20 篇文章

订阅专栏

你可能感兴趣的文章

UniswapV3 部署 - - Foundry Edition

216 浏览

uniswap v2

300 浏览

#DEFI# 从 BitShares 到 Uniswap:Dex 发展亲历者的去中心化交易所之旅

544 浏览

对比 Uniswap,一种新的去中心化交易所的流动性算法

963 浏览

以太坊合并一年后的MEV格局

947 浏览

EIP-1153 除了赋能 Uniswap-v4 还能做什么

890 浏览

相关问题

有没有已经部署的合约去查询Uniswap V3 NFT仓位的价值

1 回答

一般在编写套利合约中通过什么能直接读取给定交易对uniswap v2中的价格?

4 回答

uniswap 多跳路由寻找相关

1 回答

Uniswap中的LP token的数值是如何计算出来的(需要详细计算过程)

2 回答

如何获取 Uniswap 代币价格,v2 v3 是否不同

1 回答

复制以太坊钱包地址在 Uniswap 上发生交易的机器人

2 回答

4 条评论

请先 登录 后评论

翻译小组

0x9e64...7c84

关注

贡献值: 2706

学分: 51472

大家看到好的文章可以在 GitHub 提 Issue: https://github.com/lbc-team/Pioneer/issues

欢迎关注我的 Twitter: https://twitter.com/UpchainDAO

专栏: DEFI 协议解析

文章目录

关于

关于我们

社区公约

学分规则

Github

伙伴们

DeCert

ChainTool

GCC

合作

广告投放

发布课程

联系我们

友情链接

关注社区

Discord

Twitter

Youtube

B 站

公众号

关注不错过动态

微信群

加入技术圈子

©2024 登链社区 版权所有 |

Powered By Tipask3.5|

粤公网安备 44049102496617号

粤ICP备17140514号

粤B2-20230927

增值电信业务经营许可证

×

发送私信

请将文档链接发给晓娜,我们会尽快安排上架,感谢您的推荐!

发给:

内容:

取消

发送

×

举报此文章

垃圾广告信息:

广告、推广、测试等内容

违规内容:

色情、暴力、血腥、敏感信息等内容

不友善内容:

人身攻击、挑衅辱骂、恶意行为

其他原因:

请补充说明

举报原因:

取消

举报

×

如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!

如何在合约中集成 Uniswap v3 - 知乎

如何在合约中集成 Uniswap v3 - 知乎切换模式写文章登录/注册如何在合约中集成 Uniswap v3登链社区区块链技术爱好者的家园原文:https://soliditydeveloper.com/uniswap3译文出自:登链翻译计划译者:翻译小组校对:Tiny 熊本文永久链接:learnblockchain.cn/article…Uniswap v3的新内容及集成如果你还不熟悉Uniswap,它是一个去中心化的交易所(DEX),依靠外部流动性提供者将代币添加到流动池配对中,用户可以直接交易这些代币。由于它在以太坊上运行,可以交易的是以太坊ERC-20代币。每种代币都有自己的智能合约和流动资金池。Uniswap--作为完全的去中心化--对哪些代币可以添加没有限制。如果一个代币对还没有流动池合约存在,任何人都可以Uniswap的工厂创建一个,任何人都可以向池子提供流动性。每笔交易有0.3%的费用给流动性提供者作为奖励。代币的价格是由池中的流动性决定的。例如,如果一个用户用TOKEN2购买TOKEN1,池中TOKEN1的供应将减少,而TOKEN2的供应将增加,TOKEN1的价格将增加。同样地,如果一个用户正在出售TOKEN1,TOKEN1的价格将下降。因此,代币价格总是反映了供需关系。当然,用户不一定是人,也可以是一个智能合约。这使得可以将Uniswap添加到我们自己的合约中,为我们合约的用户增加额外的支付选项。Uniswap使这个过程非常方便,请看下面的整合方法。UniSwap v3 中有什么新内容?之前有一篇文章讨论了Uniswap v2的新内容,现在让我们看看Uniswap v3的新内容。为流动性提供者提供的一个新功能,允许设置有效的价格范围。每当资金池价格在该范围之外时,他们的流动性就会被忽略。这不仅减少了流动性提供者的无常损失的风险,提高了资本效率...提供了不同的收费等级,由资金池的风险水平决定收费等级。有三个不同的级别:稳定币交易对:费率0.05%,针对像USDT/DAI这样波动风险低的货币对。由于两者都是稳定币,这些潜在的无常损失是非常低的。这对交易者来说特别有趣,因为它将允许在稳定币之间进行非常便宜的兑换。中度风险对:费率0.30%, 中等风险被认为是任何具有高交易量/主流的非相关货币对,主流货币对往往在波动性方面具有稍低的风险。高风险货币对:费率1.00%,其他独特的货币对可以被视为流动性提供者的高风险,并产生最高的交易费用1%。改进了Uniswap v2 TWAP预言机机制,一个链上调用就可以检索到过去9天的TWAP价格。为了实现这一点,不是只存储一个累积价格总和,而是将所有相关的价格存储在一个固定大小的数组中。这可以说稍微增加了Gas成本,但总的来说,对于大型预言机的增强是值得的。 进一步的Uniswap v3资源 v3自2021年5月5日起在主网上运行文件白皮书整合UniSwap v3Uniswap如此受欢迎的原因之一可能是将它们整合到自己的智能合约中的非常简单。比方说,你有一个系统,用户用DAI支付。有了Uniswap,只需几行代码,你就可以增加他们也可以用ETH支付的选项。ETH可以在实际逻辑之前自动转换为DAI。它看起来像这样:function pay(uint paymentAmountInDai) public payable {

if (msg.value > 0) {

convertEthToExactDai(paymentAmountInDai);

} else {

require(daiToken.transferFrom(msg.sender, address(this), paymentAmountInDai);

}

// do something with that DAI

...

}

在你的函数的开头做一个简单的检查就足够了。现在,对于convertEthToExactDai函数,它将看起来像这样的东西。function convertEthToExactDai(uint256 daiAmount) external payable {

require(daiAmount > 0, "Must pass non 0 DAI amount");

require(msg.value > 0, "Must pass non 0 ETH amount");

uint256 deadline = block.timestamp + 15; // using 'now' for convenience, for mainnet pass deadline from frontend!

address tokenIn = WETH9;

address tokenOut = multiDaiKovan;

uint24 fee = 3000;

address recipient = msg.sender;

uint256 amountOut = daiAmount;

uint256 amountInMaximum = msg.value;

uint160 sqrtPriceLimitX96 = 0;

ISwapRouter.ExactOutputSingleParams memory params = ISwapRouter.ExactOutputSingleParams(

tokenIn,

tokenOut,

fee,

recipient,

deadline,

amountOut,

amountInMaximum,

sqrtPriceLimitX96

);

uniswapRouter.exactOutputSingle{ value: msg.value }(params);

uniswapRouter.refundETH();

// refund leftover ETH to user

(bool success,) = msg.sender.call{ value: address(this).balance }("");

require(success, "refund failed");

}

这里有几件事情需要解读。Swap Router:SwapRouter将是一个由Uniswap提供的包装合约,它有几个安全机制和便利功能。你可以使用 ISwapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564)为任何主网或测试网实例化它。接口代码可以在这里找到。WETH: 你可能注意到,我们在这里使用ETH。在Uniswap中,不再有直接的ETH对,所有的ETH必须首先转换为WETH(这是ETH包裹的ERC-20)。在我们的案例中,这是由SwapRouter完成的。exactOutputSingle: 该函数可用于使用ETH并接收准确的代币数量。任何剩余的ETH将被退还,但不是自动! 我自己没有第一时间意识到这一点,ETH最后在路由器合约中。所以不要忘记在兑换后调用uniswapRouter.refundETH()! 并确保你的合约中有一个回退函数来接收ETH:receive() payable external {}。deadline参数控制交易有效期。确保从你的前端传递这个UNIX时间戳,不要在合约内使用now。Refund(退款):一旦交易完成,我们可以将任何剩余的ETH返还给用户。这里将发送合约中的所有ETH,所以如果你的合约可能因为其他原因有ETH余额,请确保改变这一点。Fee(费用):这是一个不稳定的,但很受欢迎的货币对,所以我们在这里使用的费用是0.3%(见上面的费用部分)。sqrtPriceLimitX96。可用于确定互换不能超过的池子价格的限制。如果你把它设置为0,它就被忽略了。在前台使用V3我们现在遇到的一个问题是,当用户调用支付函数并想用ETH支付时,不知道他需要多少ETH。我们可以使用quoteExactOutputSingle函数来精确计算:function getEstimatedETHforDAI(uint daiAmount) external payable returns (uint256) {

address tokenIn = WETH9;

address tokenOut = multiDaiKovan;

uint24 fee = 500;

uint160 sqrtPriceLimitX96 = 0;

return quoter.quoteExactOutputSingle(

tokenIn,

tokenOut,

fee,

daiAmount,

sqrtPriceLimitX96

);

}

但是请注意,我们没有把它声明为视图函数,但是不要在链上调用这个函数。尽管它可以作为一个视图函数来调用的,但它会采用非视图方式(底层)来获得计算结果。由于 Solidity 的特性,所以这里也不可能将它本身声明为一个视图函数,仅能使用场景如 Web3 的 call() 功能来读取前端的结果。现在我们可以在前端调用getEstimatedETHforDAI。为了确保我们发送了足够的ETH,并且交易不会被退回,我们可以将估计的ETH数量增加一点。const requiredEth = (await myContract.getEstimatedETHforDAI(daiAmount).call())[0];

const sendEth = requiredEth * 1.1;

如果没有直接兑换流动池怎么办?在这种情况下,你可以使用exactInput和exactOutput函数,它以path为参数。这个路径是代币地址的字节编码数据(为了Gas效率而编码)。任何兑换都需要有一个开始和结束的路径。虽然在Uniswap中,你可以有代币1到代币2的兑换,但不一定能保证这样一个池子真的存在。但是,只要你能找到一条路径,你仍然可以交易它们,例如,Token1 → Token2 → WETH → Token3。在这种情况下,你仍然可以用Token1换Token3,只是比直接兑换要多花一点gas。在下边你可以看到[Uniswap示例代码](https://soliditydeveloper.com/path frontend: https://github.com/Uniswap/uniswap-v3-periphery/blob/9ca9575d09b0b8d985cc4d9a0f689f7a4470ecb7/test/shared/path.ts),了解如何在前端计算这个路径:function encodePath(tokenAddresses, fees) {

const FEE_SIZE = 3

if (path.length != fees.length + 1) {

throw new Error('path/fee lengths do not match')

}

let encoded = '0x'

for (let i = 0; i < fees.length; i++) {

// 20 byte encoding of the address

encoded += path[i].slice(2)

// 3 byte encoding of the fee

encoded += fees[i].toString(16).padStart(2 * FEE_SIZE, '0')

}

// encode the final token

encoded += path[path.length - 1].slice(2)

return encoded.toLowerCase()

}

为Remix提供完整的工作实例这里有一个完全可用的例子,你可以直接在Remix上使用。它允许你用ETH交易Multi-collaterized Kovan DAI,它还包括exactOutputSingle的替代方案,即exactInputSingle,允许你用ETH换取多少DAI,你就能得到多少。// SPDX-License-Identifier: MIT

pragma solidity =0.7.6;

pragma abicoder v2;

import "https://github.com/Uniswap/uniswap-v3-periphery/blob/main/contracts/interfaces/ISwapRouter.sol";

import "https://github.com/Uniswap/uniswap-v3-periphery/blob/main/contracts/interfaces/IQuoter.sol";

interface IUniswapRouter is ISwapRouter {

function refundETH() external payable;

}

contract Uniswap3 {

IUniswapRouter public constant uniswapRouter = IUniswapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564);

IQuoter public constant quoter = IQuoter(0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6);

address private constant multiDaiKovan = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa;

address private constant WETH9 = 0xd0A1E359811322d97991E03f863a0C30C2cF029C;

function convertExactEthToDai() external payable {

require(msg.value > 0, "Must pass non 0 ETH amount");

uint256 deadline = block.timestamp + 15; // using 'now' for convenience, for mainnet pass deadline from frontend!

address tokenIn = WETH9;

address tokenOut = multiDaiKovan;

uint24 fee = 3000;

address recipient = msg.sender;

uint256 amountIn = msg.value;

uint256 amountOutMinimum = 1;

uint160 sqrtPriceLimitX96 = 0;

ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams(

tokenIn,

tokenOut,

fee,

recipient,

deadline,

amountIn,

amountOutMinimum,

sqrtPriceLimitX96

);

uniswapRouter.exactInputSingle{ value: msg.value }(params);

uniswapRouter.refundETH();

// refund leftover ETH to user

(bool success,) = msg.sender.call{ value: address(this).balance }("");

require(success, "refund failed");

}

function convertEthToExactDai(uint256 daiAmount) external payable {

require(daiAmount > 0, "Must pass non 0 DAI amount");

require(msg.value > 0, "Must pass non 0 ETH amount");

uint256 deadline = block.timestamp + 15; // using 'now' for convenience, for mainnet pass deadline from frontend!

address tokenIn = WETH9;

address tokenOut = multiDaiKovan;

uint24 fee = 3000;

address recipient = msg.sender;

uint256 amountOut = daiAmount;

uint256 amountInMaximum = msg.value;

uint160 sqrtPriceLimitX96 = 0;

ISwapRouter.ExactOutputSingleParams memory params = ISwapRouter.ExactOutputSingleParams(

tokenIn,

tokenOut,

fee,

recipient,

deadline,

amountOut,

amountInMaximum,

sqrtPriceLimitX96

);

uniswapRouter.exactOutputSingle{ value: msg.value }(params);

uniswapRouter.refundETH();

// refund leftover ETH to user

(bool success,) = msg.sender.call{ value: address(this).balance }("");

require(success, "refund failed");

}

// do not used on-chain, gas inefficient!

function getEstimatedETHforDAI(uint daiAmount) external payable returns (uint256) {

address tokenIn = WETH9;

address tokenOut = multiDaiKovan;

uint24 fee = 3000;

uint160 sqrtPriceLimitX96 = 0;

return quoter.quoteExactOutputSingle(

tokenIn,

tokenOut,

fee,

daiAmount,

sqrtPriceLimitX96

);

}

// important to receive ETH

receive() payable external {}

}

ExactInput和ExactOutput的区别一旦你执行这些函数并在Etherscan中查看它们,区别就会立即变得很明显。这里我们是用exactOutput进行交易。我们提供1个ETH,希望收到100个DAI作为回报。任何多余的ETH都会退还给我们。而下面,我们正在使用exactInput进行交易。我们提供1个ETH,并希望得到多少DAI,而这恰好是196个DAI。请注意,如果你困惑为什么价格会如此不同,这是测试网的一个小池子,第一个交易严重影响了池子里的价格。没有多少人在测试网中进行套利交易 :)本翻译由 Cell Network 赞助支持。本文首发于登链社区:如何在合约中集成 Uniswap v3登链社区 - 区块链技术爱好者的家园编辑于 2021-10-14 09:40Uniswap智能合约去中心化交易所(DEX)​赞同 2​​添加评论​分享​喜欢​收藏​申请

部署合约 | Uniswap V3 Book 中文版

| Uniswap V3 Book 中文版

Uniswap V3 Book 中文版Milestone 0. 简介交易市场简介恒定函数做市商(CFMM)Uniswap V3开发环境Milestone 1. 第一笔交易简介计算流动性提供流动性第一笔交易管理合约部署合约用户界面Milestone 2. 第二笔交易简介输出金额计算Solidity中的数学运算Tick Bitmap Index通用mint通用swap报价合约用户界面Milestone 3. 跨tick交易简介不同价格区间跨tick交易滑点保护流动性计算关于定点数的拓展闪电贷用户界面Milestone 4. 多池子交易简介工厂合约交易路径多池子交易用户界面Tick 舍入Milestone 5. 费率和价格预言机简介交易费率闪电贷费率协议费率价格预言机用户界面Milestone 6: NFT positions简介ERC721 概述NFT 管理员合约NFT 渲染器补充资料中英名词对照

部署合约

部署选择本地网络运行本地区块链第一次部署与合约交互,ABIToken余额现在的 tick 和价格ABI

\[ \]部署

#我们的第一版合约已经完成了。现在,让我们来看看如何把它部署在一个本地以太坊网络上,方便我们之后用前端 app 交互。选择本地网络

#智能合约的开发需要运行一个本地的网络来在开发过程中进行部署和测试。这样的网络需要具有以下特点:真实的区块链。它必须是一个真实的区块链网络而不是一个模拟器,我们希望我们的合约如果能够在这样的网络上正常工作,那也一定能在主网上正常工作;速度。我们希望我们的交易能够快速被执行,这样我们能快速迭代;以太币。为了支付gas费,我们需要一些eth,因此我们希望这个网络能够允许我们生成任意数量的eth;cheat code。除了提供标准的 API,我们还希望这个网络能让我们做更多的事,例如:在任何地址上部署合约,以任何地址执行交易,直接修改合约状态等等。今天,有许多的工具能够提供这样的功能:Truffle套件中的GanacheHardhat,一套智能合约开发环境,除了包含本地网络节点以外还有很多有用的工具Foundry中的Anvil所有这些解决方案都能够满足我们的需求。尽管如此,项目现在都逐渐从 Ganache(最早的解决方案)迁移到 Hardhat(目前使用最广的方案),而 Foundry 也成为开发者的新宠。Foundry 也是上述三个方案中唯一使用 Solidity 来编写测试的框架(其他框架都使用 JavaScript)。除此以外,Foundry 还允许使用 Solidity 来编写部署脚本。因此,由于我们想一直使用 Solidity,我们会使用 Anvil 来运行一个本地区块链,并且使用 Solidity 编写部署脚本。运行本地区块链

#Anvil 不需要进行配置,我们可以直接在命令行运行:$ anvil

_ _

(_) | |

__ _ _ __ __ __ _ | |

/ _` | | '_ \ \ \ / / | | | |

| (_| | | | | | \ V / | | | |

\__,_| |_| |_| \_/ |_| |_|

0.1.0 (d89f6af 2022-06-24T00:15:17.897682Z)

https://github.com/foundry-rs/foundry

...

Listening on 127.0.0.1:8545

Anvil运行一个以太坊节点,所以它实际上并不是个网络,但也没什么问题。默认配置下它会创建 10 个账户,每个有 10000 ETH。它会把这些账户和对应私钥打印在命令行,我们会使用其中一个来部署合约和与其交互。Anvil在 127.0.0.1:8545 开放了 JSON-RPC API 接口——这个接口是与以太坊节点交互的主要方式。你可以在这里找到完整的 API 文档。在这里,你可以用 curl 与其交互:$ curl -X POST -H 'Content-Type: application/json' \

--data '{"id":1,"jsonrpc":"2.0","method":"eth_chainId"}' \

http://127.0.0.1:8545

{"jsonrpc":"2.0","id":1,"result":"0x7a69"}

$ curl -X POST -H 'Content-Type: application/json' \

--data '{"id":1,"jsonrpc":"2.0","method":"eth_getBalance","params":["0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","latest"]}' \

http://127.0.0.1:8545

{"jsonrpc":"2.0","id":1,"result":"0x21e19e0c9bab2400000"}

你也可以使用 cast(foundry 中的另一个组件)来访问:$ cast chain-id

31337

$ cast balance 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266

10000000000000000000000

现在,我们来将池子合约和管理合约都部署在本地网络上。第一次部署

#根本上来讲,部署一个合约意味着:将源代码编译成 EVM 字节码发送一个包含这些字节码的交易新建一个地址,执行字节码中构造函数的部分,将初始化的字节码存放在该地址。这一步是由以太坊节点自动完成的,在这笔交易被打包上链时。部署通常包含很多个步骤:准备参数,部署辅助合约,部署主合约,初始化合约等等。脚本能帮助我们自动化完成这些步骤,并且我们现在能用 Solidity 来编写脚本!创建 scripts/DeployDevelopment.sol 文件,写入以下内容:// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.14;

import "forge-std/Script.sol";

contract DeployDevelopment is Script {

function run() public {

...

}

}

它看起来与测试合约十分相似,唯一的差别在于它继承自 Script 合约而不是 Test。并且按照惯例,我们需要定义一个 run 函数作为部署脚本的主体。在 run 函数中,我们首先定义部署需要的参数:uint256 wethBalance = 1 ether;

uint256 usdcBalance = 5042 ether;

int24 currentTick = 85176;

uint160 currentSqrtP = 5602277097478614198912276234240;

这些正是我们之前用过的值。这里我们需要铸造 5042 个 USDC——其中 5000 个用来提供流动性,42 个用来交易。接下来,我们定义一系列在部署过程中需要执行的交易(每一步都是独立的交易)。我们使用startBroadcast/endBroadcast这个 cheat code:vm.startBroadcast();

...

vm.stopBroadcast();

这些 cheat code 可以在 forge的文档中找到,我们是从继承的 forge-std/Script.sol 里面得到这些功能的。在 broadcast() cheat code后面,或者 startBroadcast()/stopBroadcast() 之间的所有语句都会被转化成交易,这些交易会被发送到执行这个脚本的节点。在这两个 cheat code 之间,我们开始真正的部署步骤。首先需要部署两种 token:ERC20Mintable token0 = new ERC20Mintable("Wrapped Ether", "WETH", 18);

ERC20Mintable token1 = new ERC20Mintable("USD Coin", "USDC", 18);

没有 token 我们就无法部署池子,因此需要先部署 token 合约。

(译者注:由于原生代币 ETH 没有 approve 功能,因此在这里使用的是 WETH。在各种金融协议中,原生 ETH 通常都被单独拿出来处理)由于我们是在本地网络上进行部署,我们需要自行部署对应的 token。在主网上和公开测试网上(Ropsten, Goerli, Sepolia),这些 token 已经被部署。因此,如果想要在这些网络上进行部署,我们需要写网络特定的部署脚本。接下来就是部署池子合约:UniswapV3Pool pool = new UniswapV3Pool(

address(token0),

address(token1),

currentSqrtP,

currentTick

);

然后部署管理合约:UniswapV3Manager manager = new UniswapV3Manager();

最后,我们给我们自己的地址铸造一些token用来之后交易:token0.mint(msg.sender, wethBalance);

token1.mint(msg.sender, usdcBalance);

在Foundry脚本中,msg.sender 是在 broadcast 块中发送交易的地址。我们可以在运行脚本的时候对其进行设置。在脚本的最后,使用 console.log 打印出对应的地址信息:console.log("WETH address", address(token0));

console.log("USDC address", address(token1));

console.log("Pool address", address(pool));

console.log("Manager address", address(manager));

现在我们来运行这个脚本(确保 Anvil 在另一个窗口中正在运行):$ forge script scripts/DeployDevelopment.s.sol --broadcast --fork-url http://localhost:8545 --private-key $PRIVATE_KEY

--broadcast 启动交易的广播。它并不是默认开启的因为并不是每一个脚本都需要发送交易。--fork-url 设置我们要发送交易的节点地址。--private-key 设置调用者的钱包:需要私钥来签名交易。我们可以选择之前 Anvil 启动时在命令行打印出来的任何一个私钥。作者选择了第一个地址和私钥。部署需要消耗几秒钟。最后,你会看到它发送了一系列的交易。它同时也将交易收据存在了 broadcast 文件夹。在 Anvil 运行的窗口里,你也能看到很多行例如 eth_sendRawTransaction, eth_getTransactionByHash,

和 eth_getTransactionReceipt 这样的信息——在你向 Anvil 发送交易后,Forge 使用 JSON-RPC API 来检查它们的状态并且获得交易执行的结果(收据)。恭喜!你刚刚成功部署了一个智能合约!与合约交互,ABI

#现在,让我们来看看我们如何与已经部署的合约交互。每个合约都由一系列的public函数开放。以池子合约为例,包含 mint(...) 和 swap(...)。除此之外,Solidity 为每一个 public 的变量创建了 getter,所以我们也可以调用 token0(),token1(),positions() 等等,来访问对应变量的值。然而,由于合约都被编译成字节码,函数名在编译过程中丢失并且不存储在区块链上。在链上,每个函数都用一个函数选择器(selector)来表示,即函数签名哈希的前 4 字节。伪代码为:hash("transfer(address,address,uint256)")[0:4]

EVM 使用的是 Keccak 哈希算法,标准化名字为 SHA-3。特别地,Solidity 中的哈希函数名字为keccak256。根据以上信息,我们展示两种对于部署的合约进行调用的方法:一种使用 curl 来进行底层的调用,一种使用 cast。Token余额

#我们来检查一下部署者地址种的WETH余额。这个函数的签名是 balanceOf(address)(在 ERC-20 标准中定义),为了计算这个函数的 ID(即选择器),我们计算哈希并取前 4 字节:$ cast keccak "balanceOf(address)"| cut -b 1-10

0x70a08231

要把地址作为参数传递进去,我们把它附在函数选择器的后面(在左边 padding 到 32 个字节,因为地址在函数调用中占 32 字节):0x70a08231000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb922660xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 是我们要查看余额的地址。这是本书选择的部署者的地址,也是 Anvil 创建时的第一个地址。接下来,我们会使用 eth_call JSON-RPC 方法来进行这个调用。注意到,这一步不需要发送一个交易——我们仅仅是从合约中读取数据。$ params='{"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","to":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","data":"0x70a08231000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266"}'

$ curl -X POST -H 'Content-Type: application/json' \

--data '{"id":1,"jsonrpc":"2.0","method":"eth_call","params":['"$params"',"latest"]}' \

http://127.0.0.1:8545

{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000011153ce5e56cf880000"}

“to” 地址是 USDC token 的地址,它是在上一步部署脚本运行时打印出的日志里面的地址。以太坊节点返回的结果是字节流,为了理解结果我们需要知道返回值的类型。在 balanceOf 函数中,返回值的类型是 uint256。用 cast 可以把结果转换成十进制然后转换成 ethers 单位:$ cast --to-dec 0x00000000000000000000000000000000000000000000011153ce5e56cf880000| cast --from-wei

5042.000000000000000000

余额是正确的,我们在自己的地址中有 5042 USDC。现在的 tick 和价格

#上述例子展示了底层的合约调用。通常来说,你永远不会使用 curl 来发起调用,而是使用某个更友好的工具或库。cast 在这里也能够帮助我们简化这一过程。我们来使用 cast 获得当前合约的 tick 和 price:$ cast call POOL_ADDRESS "slot0()"| xargs cast --abi-decode "a()(uint160,int24)"

5602277097478614198912276234240

85176

如此容易!第一个值就是我们的 $\sqrt{P}$,第二个值就是现在的 tick。由于 --abi-decode 需要完整的函数签名,我们必须声明一个函数名 “a()",尽管我们只是为了解码函数的输出。ABI

#为了简化与合约的交易,Solidity 编译器可以输出 ABI,Application Binary Interface(应用二进制接口)。ABI 是一个包含了合约中所有 public 方法和事件的 JSON 文件。文件的目的在于使得编码函数参数和解码函数输出都更加容易。我们可以通过 Forge 来获取 ABI:$ forge inspect UniswapV3Pool abi

可以看一看生成的文件,来更好地理解 ABI 意味着什么。部署选择本地网络运行本地区块链第一次部署与合约交互,ABIToken余额现在的 tick 和价格

交易路径 | Uniswap V3 Book 中文版

| Uniswap V3 Book 中文版

Uniswap V3 Book 中文版Milestone 0. 简介交易市场简介恒定函数做市商(CFMM)Uniswap V3开发环境Milestone 1. 第一笔交易简介计算流动性提供流动性第一笔交易管理合约部署合约用户界面Milestone 2. 第二笔交易简介输出金额计算Solidity中的数学运算Tick Bitmap Index通用mint通用swap报价合约用户界面Milestone 3. 跨tick交易简介不同价格区间跨tick交易滑点保护流动性计算关于定点数的拓展闪电贷用户界面Milestone 4. 多池子交易简介工厂合约交易路径多池子交易用户界面Tick 舍入Milestone 5. 费率和价格预言机简介交易费率闪电贷费率协议费率价格预言机用户界面Milestone 6: NFT positions简介ERC721 概述NFT 管理员合约NFT 渲染器补充资料中英名词对照

交易路径

交易路径Path 库计算路径中池子的数量判断一个路径是否有多个池子提取路径中第一个池子的参数前往路径中下一个 token 对解码第一个池子的参数交易路径

#假设我们只有以下几个池子:WETH/USDC, USDC/USDT, WBTC/USDT。如果我们想要把 WETH 换成 WBTC,我们需要进行多步交换(WETH→USDC→USDT→WBTC),因为没有直接的 WETH/WBTC 池子。我们可以手动进行这一步,或者我们可以改进我们的合约来支持这样链式的,或者叫多池子的交易。当然,我们要选择后者!当进行多池子交易时,我们会把上一笔交易的输出作为下一笔交易的输入。例如:在 WETH/USDC 池子,我们卖出 WETH 买入 USDC;在 USDC/USDT 池子,我们卖出前一笔交易得到的 USDC 买入 USDT;在 WBTC/USDT 池子,我们卖出前一笔交易得到的 USDT 买入 WBTC。我们可以把这样一个序列转换成如下路径:WETH/USDC,USDC/USDT,WBTC/USDT

并在合约中沿着这个路径进行遍历来在同一笔交易中实现多笔交易。然而,回顾一下在前一小节中我们提到我们不再需要知道池子地址,而可以通过池子参数计算出地址。因此,上述的路径可以被转换成一系列的 token:WETH, USDC, USDT, WBTC

并且由于 tick 间隔也是一个标识池子的参数,我们也需要把它包含在路径里:WETH, 60, USDC, 10, USDT, 60, WBTC

其中的 60 和 10 都是 tick 间隔。我们在波动性较大的池子(例如 ETH/USDC, WBTC, USDT)中使用 60 的间隔,在稳定币池子中(例如 USDC/USDT)使用 10 的间隔。现在,有了这样的路径,我们可以遍历这条路径来获取每个池子的参数:WETH, 60, USDC;USDC, 10, USDT;USDT, 60, WBTC.知道了这些参数,我们可以使用我们前一章实现的 PoolAddress.computeAddress 来算出池子地址。在一个池子内交易的时候我们也可以使用这个概念:路径仅包含一个池子的参数。因此,交易路径可以适用于所有类型的交易。让我们搭建一个库来进行路径相关操作。Path 库

#在代码中,一个交易路径是一个字节序列。在 Solidity 中,一个路径可以这样构建:bytes.concat(

bytes20(address(weth)),

bytes3(uint24(60)),

bytes20(address(usdc)),

bytes3(uint24(10)),

bytes20(address(usdt)),

bytes3(uint24(60)),

bytes20(address(wbtc))

);

它长这样:0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 # weth address

00003c # 60

A0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 # usdc address

00000a # 10

dAC17F958D2ee523a2206206994597C13D831ec7 # usdt address

00003c # 60

2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 # wbtc address

以下是我们需要实现的函数:计算路径中池子的数量;看一个路径是否包含多个池子;提取路径中第一个池子的参数;进入路径中的下一个 token 对;解码池子参数计算路径中池子的数量

#让我们首先实现计算路径中池子的数量:// src/lib/Path.sol

library Path {

/// @dev The length the bytes encoded address

uint256 private constant ADDR_SIZE = 20;

/// @dev The length the bytes encoded tick spacing

uint256 private constant TICKSPACING_SIZE = 3;

/// @dev The offset of a single token address + tick spacing

uint256 private constant NEXT_OFFSET = ADDR_SIZE + TICKSPACING_SIZE;

/// @dev The offset of an encoded pool key (tokenIn + tick spacing + tokenOut)

uint256 private constant POP_OFFSET = NEXT_OFFSET + ADDR_SIZE;

/// @dev The minimum length of a path that contains 2 or more pools;

uint256 private constant MULTIPLE_POOLS_MIN_LENGTH =

POP_OFFSET + NEXT_OFFSET;

...

我们首先定义一系列常量:ADDR_SIZE 是地址的大小,20字节;TICKSPACING_SIZE 是 tick 间隔的大小,3字节(uint24);NEXT_OFFSET 是到下一个 token 地址的偏移——为了获取这个地址,我们要跳过当前地址和 tick 间隔;POP_OFFSET 是编码的池子参数的偏移 (token address + tick spacing + token address);MULTIPLE_POOLS_MIN_LENGTH 是包含两个或以上池子的路径长度 (一个池子的参数 + tick

spacing + token address 的集合)。为了计算路径中的池子数量,我们减去一个地址的大小(路径中的第一个或最后一个 token)并且用剩下的值除以 NEXT_OFFSET 即可:function numPools(bytes memory path) internal pure returns (uint256) {

return (path.length - ADDR_SIZE) / NEXT_OFFSET;

}

判断一个路径是否有多个池子

#为了判断一个路径中是否有多个池子,我们只需要将路径长度与 MULTIPLE_POOLS_MIN_LENGTH 比较即可:function hasMultiplePools(bytes memory path) internal pure returns (bool) {

return path.length >= MULTIPLE_POOLS_MIN_LENGTH;

}

提取路径中第一个池子的参数

#为了实现其他的函数,我们需要一个辅助的库,因为 Solidity 没有原生的 bytes 操作函数。我们需要能够从一个字节数组中提取出一个子数组的函数,以及将 address 和 uint24 转换成字节的函数。幸运的是,已经有一个叫做 solidity-bytes-utils 的开源库实现了这些。为了使用这个库,我们需要扩展 Path 库里面的 bytes 类型:library Path {

using BytesLib for bytes;

...

}

现在我们可以实现 getFirstPool 了:function getFirstPool(bytes memory path)

internal

pure

returns (bytes memory)

{

return path.slice(0, POP_OFFSET);

}

这个函数仅仅返回了 “token address + tick spacing + token address” 这一段字节。前往路径中下一个 token 对

#我们将会在遍历路径的时候使用下面这个函数,来扔掉已经处理过的池子。注意到我们移除的是"token address + tick spacing",而不是完整的池子参数,因为我们还需要另一个 token 地址来计算下一个池子的地址。function skipToken(bytes memory path) internal pure returns (bytes memory) {

return path.slice(NEXT_OFFSET, path.length - NEXT_OFFSET);

}

解码第一个池子的参数

#最后,我们需要解码路径中第一个池子的参数:function decodeFirstPool(bytes memory path)

internal

pure

returns (

address tokenIn,

address tokenOut,

uint24 tickSpacing

)

{

tokenIn = path.toAddress(0);

tickSpacing = path.toUint24(ADDR_SIZE);

tokenOut = path.toAddress(NEXT_OFFSET);

}

遗憾的是,BytesLib 没有实现 toUint24 这个函数,但我们可以自己实现它!在 BytesLib 中有很多 toUintXX 这样的函数,我们可以把其中一个转换成 uint24 类型的:library BytesLibExt {

function toUint24(bytes memory _bytes, uint256 _start)

internal

pure

returns (uint24)

{

require(_bytes.length >= _start + 3, "toUint24_outOfBounds");

uint24 tempUint;

assembly {

tempUint := mload(add(add(_bytes, 0x3), _start))

}

return tempUint;

}

}

我们是在一个新的库合约中实现这个函数,可以直接在 Path 库中使用它:library Path {

using BytesLib for bytes;

using BytesLibExt for bytes;

...

}

交易路径Path 库计算路径中池子的数量判断一个路径是否有多个池子提取路径中第一个池子的参数前往路径中下一个 token 对解码第一个池子

Uniswap V3,ENS注册教程,FTM跨链钱包地址 - 知乎

Uniswap V3,ENS注册教程,FTM跨链钱包地址 - 知乎首发于blockchain切换模式写文章登录/注册Uniswap V3,ENS注册教程,FTM跨链钱包地址CryptoFlowcoder ₿ 同名公众号微博PART1. Uniswap V3上线传播已久的Uniswap V3在5月5号正式上线了。相对V2也做出了不少的改动。1. 流动性可以进行颗粒度的控制。之前的添加流动性会在所有的价格上进行提供,V3之后,用户可以选择在某一段价格区间才进行流动性的提供。比如稳定币之间的兑换波动一直不大,可以选择0.99-1.01的范围进行流动性提供。相对的来说,用户也更容易控制自己的无常损失。2. 多阶梯费用。不同的风险程度的池子,获取的手续费不再一致,分为0.05%,0.3%,1%。类似的资产主要是0.05%,比如不同稳定币之间的兑换。3. LP Token变为NFT。在用户添加流动性之后获得的LP将变成NFT资产。不过同时可以会对LP挖矿带来影响,需要解决兼容性问题。其他的还有不少功能,类似范围内的限价订单,更新预言机等。PART2.ENS注册教程ENS是类似于一个互联网的域名解析服务,目前用于ETH等地质的解析。目前在其官方的Meduim中发布了DAO类似职位的招牌(https://medium.com/the-ethereum-name-service/ens-is-hiring-come-build-a-new-decentralized-internet-with-us-24398dea3ac )引发了后续发币的猜想。先附上一份教程,花一点eth买个域名,万一发个大羊腿呢。。。(使用metamask为例)进入https://app.ens.domains/ ,在输入框中输入你想注册的域名,注意和域名类似,域名越短,越有特殊意义的,价格也越贵,我使用自己的名字注册了一个一年就0.001eth。选择主要注册的时长,最少为1年,因为gas fee存在,我选择了3年,按自己需求选择。之后点击请求注册,在metamask中确认交易。在下个页面中需要等待几分钟,以确保你请求的域名没有别人也在申请。等待完成之后,注册按钮亮起,点击注册。再次发起一笔交易确认,等待交易完成。就完成了注册过程,进入了管理界面,不想设置别的地址绑定可以不用再操作。最后查看一下整个过程的花费,我大概一共花费了0.01x的ETH。后面也不要执念于这个空投,目前只是猜测。PART3.FTM的跨链钱包地址,新矿最近的FTM提币都比较曲折,币安的FTM链不定时开放然后被提完,接着就是只能继续等待,很多人应该第一次因为这个去接触了跨链,但是跨链也会出现币转出去了,但是迟迟收不到的情况。之前已经找官方确认了是跨链桥钱包没币了,但是那天忘记加贴了2个地址,2个钱包地址对应bnbridge和multichain,从官方discord找来还未对应,不过按自己的跨链记录来看应该没错。0xE3e0C14bbCBF86b3Ff60E8666C070d34b84F3f73 (multichain)0xd6a37423be930019b8cfea57be049329f3119a3d (bnbridge)0x8800528F6b9480DBbffD65Fe6d8cC075bac7C1A8 (币安钱包)跨链之前最好确认下跨链桥的币是否足够。今晚ftm开放了新矿 https://app.ester.finance/ 。但是只有单币池和一个项目方的二池LP,估算了下风险和收益,还是没动,继续在spirit挖着,虽然spirit的收益也是下降了非常多了。被知乎搞怕了,删除部分内容,其他平台发布的都是全文。本文所有观点,仅代表个人立场以及个人操作,不具有任何指导作用,据此操作,风险自负!发布于 2021-05-06 22:34域名域名解析token​赞同 1​​3 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录blockchain分享区块链,defi基础知识,项

Uniswap Interface

wap InterfaceYou need to enable JavaScript to run this ap

Uniswap V3 到底是什么鬼?一文带你了解V3新特性 - 知乎

Uniswap V3 到底是什么鬼?一文带你了解V3新特性 - 知乎切换模式写文章登录/注册Uniswap V3 到底是什么鬼?一文带你了解V3新特性一路向北在未来1年掌握的DeFi使你财富指数增长原文转自巴比特撰文: jakub编译:屏风万众期待已久的 Uniswap V3 到底是怎么回事呢?它与 V2 有什么不同?在自动做市商领域,它是否会成为一个改变游戏规则的产品?又是否会直接在 Layer 2 上推出?你会在本文中找到这些问题的答案。Uniswap虽然 Uniswap 作为 DeFi 的核心项目之一,不需要过多的介绍,但在进入 V3 之前,我们还是先快速了解一下几个要点。Uniswap,本质上是一个在以太坊区块链上进行去中心化、无需许可的代币交换的协议。Uniswap 的初始版本于 2018 年 11 月推出,并慢慢开始引起用户的兴趣。2020 年 5 月,在 DeFi 夏季之初,Uniswap 推出了该协议的第二个版本,名为 Uniswap V2。主要特点是在 V1 中存在的 ERC20-ETH 池的基础上,增加了 ERC20/ERC20 流动性池。在 2020 年下半年,Uniswap V2 经历了一个抛物线式的增长,并迅速成为 Ethereum 上最受欢迎的应用。它也几乎成为了自动做市商(AMMs)的标准,成为整个 DeFi 领域被分叉最多的项目之一。自推出以来不到一年的时间,V2 已经促成了超过 1350 亿美元的交易量——这是一个惊人的数字,可与顶级中心化加密货币交易所相媲美。你可以在这篇文章中了解更多关于 Uniswap V1 和 V2 背后的完整故事。V3就在发布 V2 之前,Uniswap 背后的团队已经开始研发新版本的协议,其细节在 2021 年 3 月底刚刚公布。团队决定在 Ethereum 主网和 Optimism (一个 Ethereum 第二层扩展解决方案)上同时推出 Uniswap V3,目标是 5 月初发布。这显然是 DeFi 历史上最令人期待的公告之一,看起来 V3 可以彻底改变 AMM 领域。那么主要的变化是什么呢?与 V2 相比,Uniswap V3 注重资本效率的最大化。这不仅可以让 LP 赚取更高的资本回报,而且还大幅提高了交易执行力,现在可以与中心化交易所和专注于稳定币的 AMM 相媲美,甚至超过它们。除此之外,由于更高的资本效率,LP 们可以创建整体投资组合,大幅增加对优先资产的敞口,降低其下行风险。他们还可以在高于或低于当前市场价格的价格区间内增加单一资产作为流动性,这基本上可以创建一个沿着平滑曲线执行的收费限价单。这一切都可以通过引入集中流动性(concentrated liquidity)的新概念来实现。除此之外,V3 还引入了多个收费层级,并改进了 Uniswap Oracles。现在,让我们来逐一了解一下 Uniswap V3 的一些功能,以便更好地理解它们。集中的流动性(Concentrated Liquidity)集中的流动性是 V3 的主要概念。当 LP 向 V2 池提供流动性时,流动性沿着价格曲线均匀分布。虽然这样可以处理 0 到无穷之间的所有价格区间,但这使得资本的效率相当低下。这是因为大多数资产通常在一定的价格范围内交易。这在具有稳定资产的池子中尤其明显,这些资产的交易范围非常狭窄。举个例子,Uniswap 的 DAI/USDC 池只花了 0.5% 左右的资金用于 0.99 美元到 1.01 美元之间的交易——绝大多数交易量都在这个价格区间内进行。这也是为 LP 们赚取大部分交易费用的交易量。这意味着,在这个特殊的例子中,99.5% 的剩余资本几乎从未被使用。在 V3 中,LP 在提供流动性时可以选择一个自定义的价格范围,允许将资金集中在大部分交易活动发生的范围内。为了实现这一目标,V3 为每个流动性提供者创建个性化的价格曲线。在 V3 之前,允许 LP 拥有个人曲线的唯一方法是为每条曲线创建一个单独的池子。这些池子如果不汇总在一起,一笔交易必须在多个池子中进行,就会导致高昂的 gas 成本。重要的是,用户要针对某个价位的组合流动性进行交易,这种组合流动性来自于这个特定价位上所有重叠的价格曲线。LP 赚取的交易费用与其在特定范围内的流动性贡献成正比。资本效率集中流动性为 LP 提供了更好的资本效率。让我们快速通过一个例子更好地理解它:Alice 和 Bob 都决定在 Uniswap V3 的 ETH/DAI 池中提供流动性,他们每个人都有 10,000 美元,ETH 的当前价格是 1,750 美元。Alice 将她的全部资本在 ETH 和 DAI 之间分配,并在任意价格范围内存入资金(类似于 V2),她存入 5,000 DAI 和 2.85 ETH。Bob 没有使用他的全部资本,而是把他的流动性集中起来,并在 1,500 到 2,500 的价格范围内提供这些资本。他存入 600 DAI 和 0.37 ETH,共计 1200 美元,并将剩余的 8800 美元留作其他用途。有趣的是,只要 ETH/DAI 价格保持在 1500 到 2500 的范围内,他们都能赚取相同的交易费用。这意味着 Bob 只需提供 Alice 的 12% 的资金,就能获得同样的回报,这使得他的资金效率是 Alice 资金的 8.34 倍。最重要的是,Bob 将其整体资本的风险降低了。ETH 掉到 0 美元的可能性很小,假设真的是这样,Bob 和 Alice 的流动资金会全部变成 ETH。虽然他们都会损失全部资本,但 Bob 承担的风险要小得多。更稳定的池子里的 LP,最有可能在狭窄范围内提供流动性。如果目前在 Uniswap v2 价值 2500 万美元的 DAI/USDC 池集中放在 v3 的 0.99 - 1.01 价格区间,只要价格保持在这个区间内,它将提供与 Uniswap v2 中 50 亿美元相同的深度。当 V3 推出时,与 V2 相比,最大资本效率将达到 4000 倍。当在单一 0.1% 的价格范围内提供流动性时,这是可以实现的。除此之外,V3 池 factory 将能够支持 0.02% 的颗粒度范围——相对于 V2,这相当于最高 20000 倍的资本效率。活跃的流动性V3 还引入了活跃流动性(active liquidity)的概念。如果在特定流动性池中交易的资产价格变动到 LP 的价格范围之外,LP 的流动性就会被有效地从池中移除,停止赚取费用。当这种情况发生时,LP 的流动性完全转向其中一种资产,他们最终只持有其中一种资产。此时,LP 可以等待市场价格回到他们指定的价格区间,或者他们可以以当前价格为考虑,决定更新他们的区间。虽然在特定的价格区间有可能没有流动性,但实际上,这将为 LP 创造一个巨大的机会,使其真实地为该价格区间提供流动性,并开始收取所有的交易费用。从博弈论的角度来看,我们应该能够看到资本的合理分配,一些 LP 专注于狭窄的价格区间,另一些 LP 专注于相对不那么狭窄但更有利可图的区间,还有一些 LP 选择在价格脱离之前的区间时,更新其价格区间。范围限价订单(Range Limit Orders)范围限价订单是集中流动性启用的下一个功能。这允许 LP 在高于或低于当前市场自定义价格范围内提供单一代币作为流动性。当市场价格进入指定范围时,一种资产将沿着平滑曲线出售给另一种资产——同时在此过程中仍可赚取掉期费用。这个功能与狭窄范围一起使用时,可以实现与标准限价单类似的目标(设置特定价格)。例如,我们假设 DAI/USDC 的交易价格低于 1.001。LP 可以决定将其 DAI 存入 1.001 和 1.002 之间的狭窄范围。一旦 DAI 交易高于 1.002 DAI/USDC,整个 LP 的流动资金就会被转换成 USDC。这时,LP 必须撤回他们的流动资金,以避免一旦 DAI/USDC 回到 1.002 以下,交易自动转换回 DAI。多头寸LP 也可以决定在多个价格区间提供流动性,这些价格区间可能会或不会重叠。例如,LP 可以为 ETH/DAI 池的以下价格区间提供流动性:2000 美元的流动性放在(1500 美元—2500 美元)的价格区间1000 美元的流动性放在(2000 美元—3000 美元)的价格区间500 美元的流动性放在(3500 美元—5000 美元)的价格区间能够在不同的价格区间内输入多个 LP 头寸,这近似于任何价格曲线甚至是订单簿,这可以创建更复杂的做市策略。非同质化流动性由于每个 LP 基本上都可以创建自己的价格曲线,因此流动性头寸不再是可互换的,不能用知名的 ERC20 LP 代币来表示。取而代之的是,提供的流动性由非同质化的 ERC721 代币来追踪。尽管如此,看起来属于同一价格区间的 LP 仓位将可以由 ERC20 代币通过外围合约或通过其他合作协议来表示。除此之外,交易费用不再代表 LP 自动重新投入到流动性池中。相反,可以创建外围合约来提供这样的功能。弹性费用下一个新功能是交易费用方面的灵活性。V3 没有提供 Uniswap V2 中的标准 0.3% 交易费,而是初步提供了 3 个独立的费用等级——0.05%、0.3% 和 1%。这使得 LPs 可以根据他们愿意承担的风险来选择资金池。Uniswap 背后的团队预计,0.05% 的费用主要用于资产类似的池子,比如不同的稳定币,0.3% 用于 ETH/DAI 等其他标准货币对,1% 用于更多的不同领域的货 币对。与 V2 类似,V3 也可以实现协议费切换,部分交易费将从 LP 转到 UNI 代币持有者手中。V3 不像 V2 那样有一个固定的百分比,而是在每个池子的基础上提供 10 到 25% 的 LP 费用。这将在推出时关闭,尽管根据 Uniswap 的管理,它可以在任何时候打开。先进的预言机最后是对 Uniswap V2 引入的 TWAP 预言机的重大改进。V3 可以在一次链上调用中计算出过去约 9 天内的所有最近的 TWAP。除此之外,与 V2 相比,保持预言机更新的成本降低了 50% 左右。这些几乎就是 Uniswap V3 的所有主要功能。有趣的是,所有这些功能并没有造成 gas 费的增加。相反,最常见的功能——简单的交易将比其 V2 的同等功能便宜 30% 左右。总结看起来 Uniswap V3 在 AMM 方面可以改变游戏规则。它基本上结合了标准 AMM 和稳定资产 AMM 的好处,使资本更有效率。这使得 V3 成为一个超级灵活的协议,能够适应一系列不同的资产。看看 V3 将会如何影响其他 AMM?尤其是 V2 早期无法与其竞争的,比如像 Curve 这样的稳定币 AMM,这个观察将会很有趣。V3 在 Optimism 上同步推出也很关键。Optimism 是一个基于 Optimistic Rollup 的第 2 层扩展方案,它可以在不牺牲第 1 层安全性的前提下,实现快速和费用低的交易。目前,Optimism 已经部分推出,并已经开始与 Synthetix 等少数选定的合作伙伴进行整合。Layer 2 的 Uniswap 应该能够吸引更多被 Layer 1 高额 gas 费劝退的用户。交易所允许提取资产到 Optimism 的功能,将是在 Layer2 快速采用 V3 的另一大步。在 V3 推出的基础上,即将全面推出的 Optimism 是另一个值得期待的事件。除此之外,V2 到 V3 的迁移将在完全自愿的基础上进行。在 V1 向 V2 迁移的情况下,V2 只用了 2 周多时间就超过了 V1 的流动性。如果 Uniswap 的治理层决定进一步鼓励 LP,通过投票加入某种只有 V3 才有的激励措施——也许是另一个流动性挖矿计划,这也很有意思。凭借 V3 的超高资本效率,即使现有的流动性被 V2、V3 和 V3 的 Optimism 所瓜分,它也应该足以促进这 3 个协议的低滑点交易。V3 面临的一个挑战是,提供流动性可能会变得有点困难,特别是对于不太成熟的用户。选择一个错误的价格区间可能会放大无常损失的影响。也许未来会有第三方服务,它可以帮助用户选择分配流动性的最佳策略。那么你对 Uniswap V3 有什么看法?这会是 AMM 领域的游戏规则改变者吗?Optimism 的 Uniswap 会给 DeFi 带来更多的用户吗?发布于 2021-03-25 09:52比特币 (Bitcoin)去中心化交易所(DEX)​赞同 10​​添加评论​分享​喜欢​收藏​申请

Uniswap V3第一时间上手教程:全新的做市体验_腾讯新闻

Uniswap V3第一时间上手教程:全新的做市体验_腾讯新闻

Uniswap V3第一时间上手教程:全新的做市体验

Uniswap V3 版本已经于北京时间 5 月 6 日凌晨正式上线。由于新版本的用户界面与做市逻辑都较 V2 版本发生了很大改变,许多用户反映在 V3 中提供流动性的操作复杂度大大提升。为了更好的帮助用户理解新版本的交互逻辑,律动 BlockBeats 将在本文中带你逐步体验,为用户献上第一时间的上手教程。

如何在 V3 中交易

打开官网链接地址,首先跳出的依然是熟悉兑换界面:

可以看出,对于仅仅想要执行交易的用户来说,新版用户界面在前端方面,相对以前几乎没有任何变化。但是通过左下角箭头处的提示可以知道,此时用户再进行交易,背后使用的资金池已经被默认切换为了新的 V3 版本。

当然,由于许多 V3 版本的资金池刚刚建立,部分交易对提供的交易价格及滑点,尚不如 V2 版本有优势。所以在这种情况发生时,界面会在左下方自动提供切换按钮,用户可一键切换到 V2 版本的资金池,以获取最优的交易价格。

如何在 V3 中提供流动性

(1)如何选择不同的交易费率资金池

我们先从用户界面开始介绍,点击界面上方的 Pool 按钮,切换到资金池界面。

左上方为官方介绍文档的链接,这里不做过多介绍。

右侧为目前排名前 200 位的资金池详细信息,可以浏览主流交易对的及时数据信息。

点开后进入如下界面:

界面最左侧显示的是资金池的具体交易对。在交易对名称的后边,显示的是这个交易对资金池对应的交易手续费率。这里要注意,由于 V3 版本中提供了 0.05%、0.3%、1% 三挡不同的费率,导致同一个交易对,可以在 V3 中分别建立三个不同费率的资金池。

那么,用户应该如何选择不同的资金池,来提供流动性呢?

举个例子,从下图中可以看出,USDC/USDT 交易对至少已经在 V3 中被创建了两个资金池,一个的手续费率为 0.05%,另一个为 1%。可以看出,由于 USDC/USDT 是稳定币交易对,LP 基本不需要承担太多的无常损失风险,导致交易用户会更倾向于选择手续费率低的资金池进行交易,而 LP 为了赚取更多的手续费,则会更倾向于在交易者更集中的资金池中提供流动性。

因此我们看到,费率为 0.05% 的资金池,无论是 TVL 还是 24 小时交易量,都远远好于费率为 1% 的资金池。在这里提醒广大用户,在提供流动性的时候,务必选择 TVL 与交易量更大的资金池,以免自己提供的流动性在不活跃的资金池被闲置,错失取得收益的机会。

那么,对于不同的交易对,应该如何选择费率,才能有效避免资金被闲置呢?

我们再看一下这个按照 TVL 提供的及时排行榜。

可以看出,凡是两边都是稳定币的交易对,排行靠前的无疑都是 0.05% 最低费率的资金池。而只要交易对中涉及一个价格波动较大的币种,则排行靠前的都是 0.3% 手续费的中间费率档。由此可见,对于波动币交易对,LP 需要取得较高的手续费收入用于弥补自己在做市中遭受的无常损失。而稳定币交易对由于价格相对稳定,LP 遭受的无常损失较小,导致费率更低的交易对更有竞争优势。(1% 的最高费率等级主要应用于某些新币或山寨币等,由于价格波动极大,需要给做市的 LP 更高的手续费率,才能弥补其做市带来的无常损失。)

(2)如何添加流动性

回到刚才的 Pool 界面,点击右上方 New Position 按钮,进入添加流动性的界面。

第一步:在最上方选择你要添加流动性的交易对。

我们这里选择添加 USDC/ETH 交易对的资金池。

第二步:选择资金池的费率

在这里,我们按照下方的提示,对于非稳定币交易对,一般选择中间档,费率 0.3% 的资金池添加流动性就可以了。

第三步:选择做市的价格区间

这里我们要注意,V3 版的系统并不支持 LP 在选择价格区间时输入任意价格。

V3 版本由于提供了流动性聚合功能,导致计算量较 V2 版本大为增加。所以为了尽量减少交易中的计算过程,降低交易者需要支付的 gas 费用,V3 版本将原本可选的完整的价格范围,人为的切分成了不同的价格点。

以 0.3% 费率的资金池为例,价格的最小变动单位以临近价格点的 0.6% 作为最小变动区间。如在 3401.6USDC 的价格点后,就是 3422.1USDC(3401.6*(1+0.6%))。不同费率的资金池会对应不同的最小变动比例。比如 0.05% 费率的资金池,价格的最小变动比例是 0.1%,而 1% 费率的资金池,价格的最小变动比例是 2%。

但是这里用户不需要担心,我们只要在其中输入自己想要的价格,系统就会自动帮你将你输入的价格调整为最近的一个可选价格点。如果认为不满意,只需要点按下方的粉色按钮进行微调即可。我们在这里选择输入 3165.3USDC 与 3590.3USDC,作为我们的做市范围。

第四步:选择做市币种的存入金额

注意,这里是最容易让人产生困惑的地方,因为在 Uniswap V3 版本中,LP 做市需要提供的两个代币的市值比例,已经不再是简单的 50/50 比例了。那么,LP 做市需要提供多少 USDC,以及多少 ETH,将由什么来决定的?

这里,我们要关注以下三个重要的参数:

1. 做市区间的下限(Min Price)

2. 做市区间的上限(Max Price)

3. 交易对当前的市场价格(Current Price)

最终 LP 需要提供的 ETH 与 USDC 占比各是多少,完全由以上三个参数决定。用专业一点的话说,LP 最终提供的 ETH 与 USDC 的比值,是做市区间的下限、做市区间的上限、现货价格这三个变量的函数。其中,由于现货价格完全由市场决定,用户无法调整。所以对于 LP 来说,只能通过调整价格区间的范围,来影响最终提供币种的比例。

为了更直观的展示,我们通过实验说明这个问题。

当前 ETH 市场价格为 3490USDC,价格区间的下限我们选定为 3165.3USDC,上限为 3590.3USDC。这时,如果我们手中有 1 个 ETH 准备做市,那么应该同时提供多少的 USDC?

我们只需要在下方的 ETH 存入数量中输入 1,系统便会自动帮我们计算出对应需要提供的 USDC 的数量(见下图)。可以看出,两个币种的市值,一个是 3,491 美元,一个是 11,252 美元,已经不是原来 V2 版本中 1:1 的比例了。

当然,我们也可以输入 USDC 的数量,让系统自动算出 ETH 的数量。可以看出,虽然两个币种的数量都放生了变化,但是相对比例并没有改变。所以,一旦我们确定了之前提到的做市区间的下限、做市区间的上限、现货价格三个关键参数。那么 ETH 与 USDC 的相对比例便已经固定下来。如果用户想要调整这个比例,只能通过调整做市价格范围区间实现。

(3)特殊情况:在现货价格以外的价格区间做市

在上文所举的例子中,我们选择的价格区间正好位于现货价格的两侧。但如果 LP 选择的做市价格范围完全高于当前现货价格,会发生什么情况?

我们将做市价格区间的下限设为 4023.8USDC,上限设为 5024USDC,而现货价格依然是 3490USDC。

这时我们看到,上图中现货价格的下方出现了一行黄色的小字,提示用户在这个区间内做市,可能无法赚取手续费收入。但是不要紧,LP 依然可以在这个价格区间提供流动性,没准明天 ETH 就能涨到 4000 多美元呢。

这里需要注意的是,在这种情况下,我们提供的做市资金不再由两个币种组成。

先看下方截图,我们还是输入要提供的 1 个 ETH。这时可以看到,在原来会自动返回 USDC 数量的地方,已经变成了一把小锁。这时用户千万不要认为是自己做错了什么,也并不是因为你没有对交易对授权。这里仅仅是因为做市价格区间完全高于现货价格,导致用户只需要提供单一币种就可以完成做市。

是的,当做市价格区间的下限已经完全高于现货市场价格的时候,LP 只需要提供单一币种 ETH 就可以做市。而当做市的价格区间完全低于现货市场价格的时候,LP 同样只需要提供单一的 USDC 就可以完成做市。

具体见下图。这时,只要你的钱包中有足够多的 USDC 代币,就可以输入任意数量的 USDC 做市,而不必再关心 ETH 数量。

如何构建范围订单

范围订单(Range Order)是在 V3 版本中引入的一项新功能。新的范围订单可以一定程度上模拟传统订单簿交易平台中的限价单功能。假设用户手中有 10 个 ETH,计划在价格上涨到 4000 美元时售出为 USDC 止盈,那么他应该这样操作:

1. 选择在 ETH/USDC 资金池提供流动性,费率就选择资金规模最大的 0.3% 即可。

2. 将做市价格范围的上限与下限都尽量保持在 4000USDC 附近。

(由于在 3999.8 之上最近的一个可选价格点就是 4023.8(3999.8*1.006=4023.8),这里便选择 3999.8-4023.8 作为做市价格区间)

3. 在下方 Deposit Amounts 处输入存入的金额为:10ETH。

4. 点击最下方的按钮,执行交易即可

(由于律动 BlockBeats 的账户中并没有这么多 ETH,这里就没法给大家亲自演示截图了。。。)

如果用户成功完成了以上的步骤,那么当 ETH 的价格上涨到 3999.8 美元时,他存入的 10 个 ETH 头寸便会开始被兑换为 USDC,当价格上涨超过 4023.8 美元时,这时用户的头寸将全部转换为 USDC,这时如果用户即时的撤回流动性,那么便相当于通过 Uniswap V3 自动执行了一个价格大概等于 4011.78 美元的止盈卖单。

关于范围订单的详细解析,可以参见律动之前发布的文章:《范围订单是限价单吗?| Uniswap V3 新特性解析系列二》

LP Token NFT

为了帮助用户更好的理解新的 NFT Token 形式。律动尝试向 ETH/USDC 资金池提供一些流动性,Gas 近 100 刀。由于账户中已经没有 USDC 的代币了,所以我们便选择了高于现货市场价格的做市范围区间,下限为 4000USDC,上限为 4994USDC。这时,我们可以以 ETH 单一币种进行做市。

NFT 的展示界面也非常酷炫,界面最上方显示了交易对的名称:ETH/USDC,下面是资金池的费率:0.3%。NFT 卡片左下角显示的 ID 编号为 3045,律动猜测是按用户提供流动性的时间进行的排名。据说向每一个新的资金池提供流动性的前 100 位用户,有可能在卡片的右下角获得一个小太阳的稀有标志,这里律动还没能体验到。

界面右侧上方显示的是这部分做市头寸中包含的代币数量,可以看出 USDC 的数量为 0,目前头寸全部由 ETH 组成。界面正上方用橙色字体提示了,当前的 ETH 现货价格并不在律动选择的做市价格区间之内。由此右下方显示的未申领手续费金额也同样是 0。

但是不必担心,只要 ETH 的价格继续上涨并超过 4000 美元,律动的这个 NFT 头寸就可以开始赚取手续费了。

如何浏览 V3 中的资金池数据

还是以 USDC/ETH(0.3% 手续费)交易对为例。可以看出,界面详细的展示了这个资金池的最新交易量、锁仓数据以及最近的交易记录,这些都与 V2 版本中差异不大,这里不再做详细解释。用户需要注意的是界面右上角中箭头指出的 Liquidity 部分。

我们点开链接,可以见到下方的流动性分布情况展示页面。

这个页面展示了资金池的流动性,在不同价格区间的分布情况。我们将鼠标移到箭头处的曲线最高点位置。可以看出,目前在 3463.3623USDC/ETH 的价格点内,流动性最为集中。这与当天的 ETH 价格也高度相关,可以看出,LP 在当天的现货价格附近提供了最多的流动性,也意味着交易者在这个价格点附近交易,可以享受到更低的滑点。

以上便是我们对 Uniswap V3 版本的第一时间上手教程,如果想要继续了解 V3 背后更深层的运作原理,可以参见律动研究院之前发布的两篇相关文章