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
2022-07-13 11:45:04 -07:00
2025-07-08 01:27:47 +08:00
2019-10-22 11:38:01 -04:00
2019-12-30 15:21:02 -05:00
2019-10-22 11:38:01 -04:00
2020-05-18 18:40:32 -05:00
2022-05-03 10:50:37 -04:00
2019-10-22 11:38:01 -04:00
2020-05-18 18:54:10 -05:00
2025-07-08 01:27:47 +08:00
2019-10-22 11:38:01 -04:00

Uniswap V2 Core 核心合约

Actions Status Version

📋 项目概述

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/                   # 测试合约

合约关系图

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

其中:

  • xy 是池中两种代币的数量
  • k 是恒定值,只在添加/移除流动性时改变

2. 流动性提供

用户可以向交易对提供流动性,获得:

  • 流动性代币(LP Token): 代表在池中的份额
  • 交易手续费: 每笔交易的0.3%手续费按比例分配

流动性计算公式:

// 首次添加流动性
liquidity = sqrt(amount0 * amount1) - MINIMUM_LIQUIDITY

// 后续添加流动性  
liquidity = min(amount0 * totalSupply / reserve0, amount1 * totalSupply / reserve1)

3. 价格发现机制

交易价格由池中代币比例决定:

price = reserve1 / reserve0

每次交易后,价格会自动调整以维持恒定乘积。

4. 时间加权平均价格(TWAP)

合约内置价格累积器,可以计算任意时间段的平均价格:

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 包管理器

安装依赖

yarn install

编译合约

yarn compile

运行测试

yarn test

代码检查

yarn lint

📖 使用示例

1. 部署工厂合约

// 部署工厂合约
UniswapV2Factory factory = new UniswapV2Factory(msg.sender);

2. 创建交易对

// 创建 WETH/USDC 交易对
address pair = factory.createPair(WETH, USDC);

3. 添加流动性

// 向交易对转入代币
IERC20(WETH).transfer(pair, wethAmount);
IERC20(USDC).transfer(pair, usdcAmount);

// 铸造流动性代币
uint liquidity = IUniswapV2Pair(pair).mint(msg.sender);

4. 执行交换

// 计算输出数量 (需要使用路由合约)
uint amountOut = getAmountOut(amountIn, reserveIn, reserveOut);

// 转入代币
IERC20(tokenIn).transfer(pair, amountIn);

// 执行交换
IUniswapV2Pair(pair).swap(amount0Out, amount1Out, msg.sender, "");

🔐 安全考虑

重入攻击防护

  • 所有状态修改函数都使用重入锁
  • 采用检查-生效-交互模式

整数溢出防护

  • 使用SafeMath库防止算术溢出
  • 严格的边界检查

经济安全

  • 最小流动性锁定(1000 wei)
  • K值单调性检查
  • 合理的手续费机制

前端安全

  • CREATE2确定性地址
  • 完整的事件日志
  • 标准化接口

📚 深入学习

相关资源

构建工件

编译后的合约可通过 unpkg.com 浏览。

🤝 贡献指南

欢迎提交 Issue 和 Pull Request

开发流程

  1. Fork 本仓库
  2. 创建功能分支
  3. 提交更改
  4. 运行测试
  5. 提交 Pull Request

📄 许可证

本项目采用 GPL-3.0-or-later 许可证。

🙏 致谢

  • Uniswap 团队的创新设计
  • DappHub 的 SafeMath 库
  • 以太坊社区的支持

⚠️ 风险提示: 本项目仅供学习和研究使用。在生产环境中使用前,请进行充分的安全审计。去中心化金融存在智能合约风险、无常损失等风险,请谨慎参与。

Description
No description provided
Readme Cite this repository 1,019 KiB
Languages
Solidity 53.7%
TypeScript 46.3%