Uniswap V1(一):实现DEX智能合约

Uniswap是以太坊上的去中心化交易所DEX,它在以太坊区块链上运行并且完全自动化:没有管理员、经理或具有特权访问权限的用户。
本系列开始解读Uniswap智能合约,以及它背后的经济机制和算法,仅作为学习智能合约以及web3技术的参考。

到目前为止,Uniswap有三个版本:

  • V1在2018年11月推出,它只允许在以太币和代币之间进行交换,以及通过链式交换来实现代币交换。
  • V2于2020年3月推出,它允许任何ERC20代币之间的直接交换,以及任何对之间的链式交换。
  • V3于2021年5月推出,它显着提高了资本效率,这使得流动性提供者能够从池中移除更大一部分的流动性,并且仍然继续获得相同的回报。

本系列是V1版本。

在去中心化交易所中,有两种角色:

  • 流动性提供者:DEX必须有足够的资金才能有流动性,进行代币交易,任何人都可以成为流动性提供者,并通过向DEX提供流动性来获取回报。
  • 普通交易者:在DEX上进行代币的交易。

流动性是指交易所中,代币对的资金池。这个资金池由一对代币组成,在V1版本中,其中一个代币是ETH,另一个是普通代币(一般代币发行后,想要交易的话,项目方就会启动一个资金池,也就是该代币对ETH的资金池,并注入原始流动性)。

Uniswap的核心,是常数乘积函数:

$$X * Y = k$$

\(X\) 是ETH的数量,\(Y\) 是代币数量,\(k\)是一个常数,不管是用ETH换取代币,还是用代币换取ETH,Uniswap确保在每次交易后 \(k\) 保持不变,当然这个其实是近似不变,会在后续具体代码中看到。

本系列中,不仅会讲uniswap原理,还会用solidity编写一个简易版本的智能合约,所以我们先设置好项目:

我们使用hardhat框架,新建一个文件夹,并运行如下命令,初始化node项目,安装hardhat,创建hardhat示例项目:

npm init -y
npm install –save-dev hardhat
npx hardhat

一路回车完成。
运行如下进行编译和测试:

npx hardhat compile
npx hardhat test

运行没问题即可。

V1仅支持ETH交换,所以我们需要一个ERC20代币合约用来测试,直接用openzeppelin创建最简单的合约即可。

// contracts/Token.sol
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract Token is ERC20 {
constructor(
string memory name,
string memory symbol,
uint256 initialSupply
) ERC20(name, symbol) {
_mint(msg.sender, initialSupply);
}
}

V1包含两个合约,Factory合约和Exchange合约。

Factory合约是一个注册合约,允许创建交易对并跟踪所有已部署的交易对,允许通过代币地址查找交易对合约地址,反之亦然。
Exchange合约定义了交换逻辑。每一个交易对都被部署为一个Exchange合约,有自己的合约地址,并且只允许与ETH进行交易。

合约的细节和逻辑,后面的文章里再讲。

发表评论