如何对接 Uniswap V2 兑换代币

对接 Uniswap V2 兑换代币,并测试验证。

如何对接 Uniswap V2 兑换代币

img

在上一篇文章中,我们通过 大概 100 行代码,了解了 Uniswap 的运行原理。

在本文中,我们将和正式的 Uniswap V2 交互,实现使用Uniswap进行代币兑换,并通过测试验证兑换功能,通过测试验证智能合约的行为是一个很好的粉丝,测试让你相信代码以我们想要的方式执行,而不是以它不应该的方式执行。

在本文中,我们还将学习到如何 fork 主网,并冒充(模拟)一个链上账号进行交易,并编写测试。

关于Uniswap V2

但在深入研究之前,为了本文完整,让我们再次介绍一下 Uniswap,Uniswap是一个去中心化的交易所(DEX),运行在以太坊区块链上(主网和其他一些网络)。顾名思义,Uniswap是用来交易ERC20代币的。

Uniswap有3个主要功能:

  1. 在不同的代币之间进行兑换
  2. 添加代币对流动性,获得LP ERC-20流动性代币
  3. 销毁 LP ERC-20流动性代币,取回配对的ERC-20代币

在这篇文章中,我们将重点讨论使用fork 主网在不同的代币之间进行兑换。

所以让我们开始吧! 🥳🥳🥳

1. 创建一个项目并初始化

在命令行(CLI)上使用以下命令来初始化项目。

mkdir uni_swap && cd uni_swap
npm init -y

安装项目所需的依赖项,运行:

npm install --save hardhat @nomiclabs/hardhat-ethers @nomiclabs/hardhat-waffle ethers @uniswap/v2-core dotenv

2. 初始化Hardhat项目

要初始化你的Hardhat项目,在CLI中运行npx hardhat命令,并创建一个空的config.js文件。

并定制你的Hardhat配置,因为我们要fork主网来与Uniswap交互。因此,Hardhat配置应该看起来类似于这样:

img

注意:用你的自己AlchemyAPI密钥替换URL中的<key>部分。

3. 编写合约实现兑换

为合约、脚本和测试创建目录,以便更好地组织代码。

在你的CLI中使用以下代码创建目录:

mkdir contracts && mkdir scripts && mkdir tests

为了编写兑换合约,在合约目录内创建一个文件,命名为testSwap.sol

在你的 testSwap.sol中导入Uniswap 等接口,并创建一个名为testSwap的合约。

它应该看起来像这样:

img

现在,在testSwap中,我们需要包括Uniswap Router的地址,我们使用它来完成代币兑换。

使用下面的代码:

//address of the uniswap v2 router
address private constant UNISWAP_V2_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

现在,定义要用来兑换的函数:

// 兑换函数
    function swap(
        address _tokenIn,
        address _tokenOut,
        uint256 _amountIn,
        address _to,
        uint256 _deadline
    ) external {}

函数命名为swap,里面有

  • _tokenIn: 是我们要兑换的代币的地址。
  • _tokenOut:是我们想从这次交易中获得的代币的地址。
  • _amountIn: 是我们要交易的代币的数量。
  • _to:交易兑换出的代币发送到这个地址。
  • _deadline:是交易应该被执行的时间期限。如果超过了最后期限,交易就会失败。

在兑换函数里面,我们要做的第一件事是在合约里面把所需数量的_tokenIn 转移到合约里,使用msg.sender

// 把 token 从用户转移到合约
IERC20(_tokenIn).transferFrom(msg.sender, address(this), _amountIn);

一旦调用执行,_amountIn 数量的 _tokenIn就会转入到testSwap合约中

接下来,通过调用IERC20 授权,允许Uniswap合约花费testSwap合约中_amountIn数量的代币。

//by calling IERC20 approve you allow the uniswap contract to spend the tokens in this contract
IERC20(_tokenIn).approve(UNISWAP_V2_ROUTER, _amountIn);

在使用 Uniswap Router 兑换,需要为兑换...

剩余50%的内容订阅专栏后可查看

0 条评论

请先 登录 后评论
翻译小组
翻译小组

首席翻译官

121 篇文章, 21097 学分