学习如何将UniswapV3集成到你的智能合约中

  • BuildBear
  • 发布于 2023-12-16 19:58
  • 阅读 28

本文详细介绍了如何将Uniswap V3集成到智能合约中,首先解释了Uniswap的运作原理及主要合约(UniswapV3Factory、UniswapV3Pool和SmartRouter)的功能。随后,提供了具体的代码实现示例,包括如何使用不同的函数进行代币交换,以及如何创建和部署智能合约,还有在本地测试网络上的步骤,结构清晰且包含丰富的内容。

了解如何将 UniswapV3 集成到智能合约中。

本文最初发表于 BuildBear 教程

什么是 Uniswap?

Uniswap 是第一个通过自动化做市商 (AMM) 将去中心化交易所 (DEX) 推向新阶段的协议。AMM 消除了在传统股票市场中进行交易时需要对方的需求。相反,AMM 算法收集由流动性提供者存入的流动性,他们将资产放置在此并允许交易者使用这些流动性。

Uniswap 协议如何工作?

在 Uniswap 中,交易者可以通过 交易他们的 ERC-20 代币。这些池由代币 (例如 USDC/WETH) 和 池费 (0.05%、0.30% 或 1%) 组成。池会收集一小部分费用以支持系统。你可以创建和部署自己的池,包含你选择的代币对和你选择的池费。

让我们分析参与 Uniswap V3 的三个主要合同:UniswapV3Factory、UniswapV3Pool 和 SmartRouter。

UniswapV3Factory:

◦ UniswapV3Factory 合同负责创建 UniswapV3Pool 合同的实例。

◦ 它跟踪合同所有者,并控制池协议费用的所有权和控制权。

◦ 它维护费用金额与 tick 间距的映射,确定价格范围的粒度。

◦ createPool 函数用于部署新的 UniswapV3Pool 合同。它接受两个代币地址和一个费用金额作为输入,并为指定的代币对部署新的池合同。

◦ 它强制执行某些条件,例如确保代币地址不相同,以及费用金额的 tick 间距有效。

◦ 它更新 getPool 映射,以将新池合同与相应的代币对和费用金额关联。

UniswapV3Pool:

◦ UniswapV3Pool 合同代表特定代币对和费用金额的单个流动性池。

◦ 它实现与流动性提供、费用计算和交易相关的核心功能。

◦ 流动性提供者可以将他们的代币存入池中,并以此获得流动性提供者 (LP) 代币。这些 LP 代币代表他们在流动性池中的份额。

◦ UniswapV3Pool 合同使用流动性位置的概念,定义特定价格范围和相应的流动性提供量。

◦ 流动性位置通过唯一的 tick 值表示,定义上限和下限价格边界。合同根据这些位置计算费用并将其分配给流动性提供者。

◦ 在 Uniswap V3 中进行交易涉及在不同价格范围之间交换代币,优化滑点并减少资金需求。

◦ 合同实现用于交换、铸造/燃烧 LP 代币和从池中提取代币的功能。

SmartRouter:

智能路由器合同负责处理代币交换和流动性管理。它与 Uniswap V3 Pool 合同互动以执行这些操作。

该合同使用 Uniswap V3 的定价机制计算交换的最佳数量,并将交换通过一个或多个 Uniswap V3 Pool 合同路由。

在将 UniSwap 协议集成到我们的合同中时,我们可以选择从多个合同中集成 UniswapV3Pool、SmartRouter 和 UniswapV3Factory。然而,出于简化考虑,为了处理计算最佳交换数量的复杂性,我们将使用 SmartRouter。

实施示例

让我们来分解一下:

  1. 导入语句:合同从 Uniswap V3 Periphery 导入必要的外部合同,包括 TransferHelperISwapRouter 的接口。这些外部合同用于安全转移代币和与 Uniswap V3 交易所进行交互。

  2. 状态变量

swapRouter:这是一个类型为 ISwapRouter 的状态变量,设置为公共和不可变。它存储对 Uniswap V3 路由器合同的引用,该引用用于执行代币交换。

  1. 构造函数:合同具有一个构造函数,接受一个 ISwapRouter 实例作为参数,并使用它初始化 swapRouter 状态变量。这确保合同与指定的 Uniswap V3 路由器进行交互。

  2. swapExactInputSingle 函数

  • 此函数用于将确切数量的输入代币交换为输出代币。
  • 它接受三个参数:token0(输入代币地址),token1(输出代币地址)和 amountIn(确切数量的输入代币)。
  • 在函数内部,它将输入代币从调用者转移到合同,批准路由器花费这些代币,并设置交换参数。
  • 然后调用 swapRouter.exactInputSingle 函数执行交换并返回输出数量。

5. swapExactOutputSingle 函数

  • 此函数用于以最大数量的输入代币交换确切数量的输出代币。
  • 它接受四个参数:token0(输入代币地址),token1(输出代币地址),amountOut(确切数量的输出代币)和 amountInMaximum(最大数量的输入代币)。
  • 与上一个功能类似,它转移输入代币,批准路由器,并设置交换参数。
  • 然后调用 swapRouter.exactOutputSingle 函数执行交换。如果使用的输入代币数量少于允许的最大值,则将未使用的输入代币退还给调用者。

为了让你快速入门,我们已在 BuildBear Labs Uniswap 上设置了所有内容。

  • 克隆/分叉 UniSwap:
git clone https://github.com/BuildBearLabs/UniswapV3.git
  • 安装依赖项
cd UniSwap
npm install
  • 创建你的私有测试网络(从以太坊主网分叉)我们选择从以太坊进行分叉是因为我们将使用 Aave V3 协议
npm run createTestnet

一旦测试网启动,其 RPC、Explorer 和 Faucet 详细信息会添加到 testnet.json 文件中。

  • 要部署 Swapexample.sol 智能合约,运行以下命令:
npx hardhat run scripts/deploy-Swapexample.js

你可以使用提供的脚本 Swap-token.js 进行代币交换

要运行这些脚本,请执行以下命令,一旦交换成功,请导航到合约浏览器页面。点击顶部交易以查看交换交易和收到的 USDC 数量,如下图所示:

npx hardhat run scripts/Swap-tokens.js

总之,我们了解了 Uniswap v3 中不同合约的角色,以及将 Uniswap v3 集成到我们的协议的最佳方式,以及如何使用脚本进行代币交换,从而不需要前端界面。

关于 BuildBear:

BuildBear 是一个专为 DApp 开发和测试量身定制的平台。开发人员可以在多种区块链网络上自由构建个性化的私有测试网络沙箱。允许铸造无限的 Native 和 ERC20 代币,加上 BuildBear 上快速的交易时间(少于 3 秒!),大大提升了 DApp 开发周期。该平台配备了旨在实时测试和调试的工具,确保开发人员能够以无与伦比的便利性跟踪复杂的区块链交易。

关注我们 Twitter | LinkedIn | Telegram | GitHub

  • 原文链接: medium.com/buildbear/lea...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
BuildBear
BuildBear
https://medium.com/buildbear