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
运行没问题即可。
.png)
V1仅支持ETH交换,所以我们需要一个ERC20代币合约用来测试,直接用openzeppelin创建最简单的合约即可。
// contracts/Token.solpragma 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进行交易。
合约的细节和逻辑,后面的文章里再讲。