Files
uniswap-v2/README.md
NoBey 3586e648b2
Some checks failed
CI / test (10.x, ubuntu-latest) (push) Has been cancelled
CI / test (12.x, ubuntu-latest) (push) Has been cancelled
init
2025-07-08 01:27:47 +08:00

271 lines
6.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Uniswap V2 Core 核心合约
[![Actions Status](https://github.com/Uniswap/uniswap-v2-core/workflows/CI/badge.svg)](https://github.com/Uniswap/uniswap-v2-core/actions)
[![Version](https://img.shields.io/npm/v/@uniswap/v2-core)](https://www.npmjs.com/package/@uniswap/v2-core)
## 📋 项目概述
Uniswap V2 Core 是去中心化交易协议 Uniswap V2 的核心智能合约集合,实现了自动化做市商(AMM)机制。本项目包含了创建和管理流动性池、执行代币交换等核心功能的智能合约。
### 🎯 核心特性
- **自动化做市商(AMM)**: 基于恒定乘积公式 `x * y = k` 的去中心化交易
- **流动性挖矿**: 用户可以提供流动性获得手续费收入
- **CREATE2 部署**: 使用确定性地址部署,便于前端集成
- **EIP-712 支持**: 支持链下签名授权,提升用户体验
- **时间加权平均价格(TWAP)**: 内置价格预言机功能
## 🏗️ 项目架构
### 核心合约
```
contracts/
├── UniswapV2Factory.sol # 工厂合约,管理所有交易对的创建
├── UniswapV2Pair.sol # 交易对合约实现AMM核心逻辑
├── UniswapV2ERC20.sol # 流动性代币支持EIP-712
├── interfaces/ # 接口定义
│ ├── IUniswapV2Factory.sol
│ ├── IUniswapV2Pair.sol
│ ├── IUniswapV2ERC20.sol
│ ├── IERC20.sol
│ └── IUniswapV2Callee.sol
├── libraries/ # 工具库
│ ├── Math.sol # 数学运算库
│ ├── SafeMath.sol # 安全数学运算
│ └── UQ112x112.sol # 定点数运算
└── test/ # 测试合约
```
### 合约关系图
```mermaid
graph TB
Factory[UniswapV2Factory<br/>工厂合约] --> Pair[UniswapV2Pair<br/>交易对合约]
Pair --> ERC20[UniswapV2ERC20<br/>流动性代币]
Pair --> SafeMath[SafeMath<br/>安全数学运算]
Pair --> Math[Math<br/>数学库]
Pair --> UQ112x112[UQ112x112<br/>定点数库]
User[用户] --> Factory
User --> Pair
LP[流动性提供者] --> Pair
Trader[交易者] --> Pair
```
## 🔧 核心概念
### 1. 自动化做市商(AMM)
Uniswap V2 使用恒定乘积公式实现自动化做市:
```
x * y = k
```
其中:
- `x``y` 是池中两种代币的数量
- `k` 是恒定值,只在添加/移除流动性时改变
### 2. 流动性提供
用户可以向交易对提供流动性,获得:
- **流动性代币(LP Token)**: 代表在池中的份额
- **交易手续费**: 每笔交易的0.3%手续费按比例分配
流动性计算公式:
```solidity
// 首次添加流动性
liquidity = sqrt(amount0 * amount1) - MINIMUM_LIQUIDITY
// 后续添加流动性
liquidity = min(amount0 * totalSupply / reserve0, amount1 * totalSupply / reserve1)
```
### 3. 价格发现机制
交易价格由池中代币比例决定:
```
price = reserve1 / reserve0
```
每次交易后,价格会自动调整以维持恒定乘积。
### 4. 时间加权平均价格(TWAP)
合约内置价格累积器,可以计算任意时间段的平均价格:
```solidity
price0CumulativeLast += (reserve1 / reserve0) * timeElapsed
price1CumulativeLast += (reserve0 / reserve1) * timeElapsed
```
## 💼 主要功能
### UniswapV2Factory (工厂合约)
**职责**: 创建和管理所有交易对
**核心函数**:
- `createPair(address tokenA, address tokenB)`: 创建新的交易对
- `getPair(address tokenA, address tokenB)`: 获取交易对地址
- `allPairs(uint index)`: 按索引获取交易对
- `setFeeTo(address feeTo)`: 设置协议费接收地址
**特点**:
- 使用CREATE2确定性部署地址可预测
- 任何人都可以创建交易对
- 自动排序代币地址确保唯一性
### UniswapV2Pair (交易对合约)
**职责**: 实现具体的AMM交易逻辑
**核心函数**:
- `mint(address to)`: 铸造流动性代币
- `burn(address to)`: 销毁流动性代币,取回资产
- `swap(uint amount0Out, uint amount1Out, address to, bytes calldata data)`: 执行代币交换
- `getReserves()`: 获取当前储备量和时间戳
**安全机制**:
- 重入锁防止重入攻击
- 最小流动性锁定防止攻击
- 完整性检查确保K值不减少
### UniswapV2ERC20 (流动性代币)
**职责**: 标准ERC20流动性代币支持高级功能
**核心功能**:
- 标准ERC20功能 (转账、授权等)
- EIP-712签名授权 (`permit`)
- 域分隔符确保跨链安全
## 🚀 快速开始
### 环境要求
- Node.js >= 10
- Yarn 包管理器
### 安装依赖
```bash
yarn install
```
### 编译合约
```bash
yarn compile
```
### 运行测试
```bash
yarn test
```
### 代码检查
```bash
yarn lint
```
## 📖 使用示例
### 1. 部署工厂合约
```solidity
// 部署工厂合约
UniswapV2Factory factory = new UniswapV2Factory(msg.sender);
```
### 2. 创建交易对
```solidity
// 创建 WETH/USDC 交易对
address pair = factory.createPair(WETH, USDC);
```
### 3. 添加流动性
```solidity
// 向交易对转入代币
IERC20(WETH).transfer(pair, wethAmount);
IERC20(USDC).transfer(pair, usdcAmount);
// 铸造流动性代币
uint liquidity = IUniswapV2Pair(pair).mint(msg.sender);
```
### 4. 执行交换
```solidity
// 计算输出数量 (需要使用路由合约)
uint amountOut = getAmountOut(amountIn, reserveIn, reserveOut);
// 转入代币
IERC20(tokenIn).transfer(pair, amountIn);
// 执行交换
IUniswapV2Pair(pair).swap(amount0Out, amount1Out, msg.sender, "");
```
## 🔐 安全考虑
### 重入攻击防护
- 所有状态修改函数都使用重入锁
- 采用检查-生效-交互模式
### 整数溢出防护
- 使用SafeMath库防止算术溢出
- 严格的边界检查
### 经济安全
- 最小流动性锁定(1000 wei)
- K值单调性检查
- 合理的手续费机制
### 前端安全
- CREATE2确定性地址
- 完整的事件日志
- 标准化接口
## 📚 深入学习
### 相关资源
- [Uniswap V2 白皮书](https://uniswap.org/whitepaper.pdf)
- [官方文档](https://uniswap.org/docs)
- [Solidity 最佳实践](https://consensys.github.io/smart-contract-best-practices/)
### 构建工件
编译后的合约可通过 [unpkg.com](https://unpkg.com/browse/@uniswap/v2-core@latest/) 浏览。
## 🤝 贡献指南
欢迎提交 Issue 和 Pull Request
### 开发流程
1. Fork 本仓库
2. 创建功能分支
3. 提交更改
4. 运行测试
5. 提交 Pull Request
## 📄 许可证
本项目采用 [GPL-3.0-or-later](LICENSE) 许可证。
## 🙏 致谢
- Uniswap 团队的创新设计
- DappHub 的 SafeMath 库
- 以太坊社区的支持
---
**⚠️ 风险提示**: 本项目仅供学习和研究使用。在生产环境中使用前,请进行充分的安全审计。去中心化金融存在智能合约风险、无常损失等风险,请谨慎参与。