# 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
工厂合约] --> Pair[UniswapV2Pair
交易对合约] Pair --> ERC20[UniswapV2ERC20
流动性代币] Pair --> SafeMath[SafeMath
安全数学运算] Pair --> Math[Math
数学库] Pair --> UQ112x112[UQ112x112
定点数库] 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 库 - 以太坊社区的支持 --- **⚠️ 风险提示**: 本项目仅供学习和研究使用。在生产环境中使用前,请进行充分的安全审计。去中心化金融存在智能合约风险、无常损失等风险,请谨慎参与。