change WUSD payment to USDC

This commit is contained in:
2025-12-24 16:41:26 +08:00
parent d2e9377f78
commit e21ee7a5df
160 changed files with 6038 additions and 4050 deletions

View File

@@ -499,7 +499,7 @@
│ │ │ YT-A (原有) │ 30000 │ 30.0% │ 27.27% │ ← 自动变化│ │
│ │ │ YT-B (原有) │ 30000 │ 30.0% │ 27.27% │ │ │
│ │ │ YT-C (原有) │ 30000 │ 30.0% │ 27.27% │ │ │
│ │ │ WUSD (原有) │ 10000 │ 10.0% │ 9.09% │ │ │
│ │ │ USDC (原有) │ 10000 │ 10.0% │ 9.09% │ │ │
│ │ │ YT-D (新增) │ 10000 │ - │ 9.09% │ ← 新增 │ │
│ │ ├──────────────┼────────┼──────────┼──────────┤ │ │
│ │ │ 总计 │ 110000 │ 100% │ 100% │ │ │
@@ -534,8 +534,10 @@
│ ② 初始化价格 (如果需要) │
│ forceUpdatePrice(YT-D, 1e30) // 初始价格 $1.00 │
│ │
│ 注意: YT代币需要实现 assetPrice() 接口
价格预言机会自动读取该接口获取价格
│ 注意:
• YT代币需要实现 ytPrice() 接口
│ • 价格预言机会自动读取该接口获取YT价格 │
│ • USDC价格自动从Chainlink获取无需手动配置 │
└─────────────────────────────────────────────────────────────────────┘
│ 3. 配置完成
@@ -569,9 +571,9 @@
┌─────────────────────────────────────────────────────────────────────┐
│ YT代币必须实现的接口 │
│ │
│ interface IYTToken {
│ // 必需返回当前资产价格30位精度
│ function assetPrice() external view returns (uint256); │
│ interface IYTAssetVault {
│ // 必需:返回当前YT资产价格30位精度
│ function ytPrice() external view returns (uint256);
│ │
│ // 可选:返回最后价格更新时间 │
│ function lastPriceUpdate() external view returns (uint256); │
@@ -584,9 +586,14 @@
│ external returns (bool); │
│ } │
│ │
│ 价格示例:
YT价格示例 (1e30精度):
│ $1.00 = 1 × 10^30 = 1000000000000000000000000000000 │
│ $0.998 = 998000000000000000000000000000 │
│ │
│ USDC价格从Chainlink获取1e8精度: │
│ $1.00 = 100000000 (1e8) │
│ $0.998 = 99800000 │
│ 自动转换为1e30精度用于内部计算 │
└─────────────────────────────────────────────────────────────────────┘
```
@@ -640,7 +647,7 @@
│ │ │ YT-A │ 30000 │ 30% │ │ │
│ │ │ YT-B │ 30000 │ 30% │ │ │
│ │ │ YT-C │ 30000 │ 30% │ │ │
│ │ │ WUSD │ 10000 │ 10% │ │ │
│ │ │ USDC │ 10000 │ 10% │ │ │
│ │ │ YT-D (删除) │ 0 │ - │ ← 已移除 │ │
│ │ ├──────────────┼────────┼────────┤ │ │
│ │ │ 总计 │ 100000 │ 100% │ │ │
@@ -783,25 +790,29 @@
## 6. 系统部署和初始化流程
### 6.1 部署 YTPriceFeed优化版
### 6.1 部署 YTPriceFeed使用 Chainlink
```
┌─────────────────────────────────────────────────────────────────────┐
│ 部署者 (Deployer) │
└────────────────────────────┬────────────────────────────────────────┘
│ 1. 首先部署 WUSD
│ 1. 准备 USDC 和 Chainlink 地址
┌─────────────────────────────────────────────────────────────────────┐
部署 WUSD 合约
准备外部合约地址
│ ───────────────────────────────────────────────────────────────── │
WUSD wusd = new WUSD()
wusd.initialize("Wrapped USD", "WUSD")
• USDC 代币地址BSC主网
usdc = 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d
│ 注意BSC主网USDC是18位精度 │
│ │
得到: 0x7Cd017ca5ddb86861FA983a34b5F495C6F898c41
• Chainlink USDC/USD 价格预言机地址BSC主网
│ usdcPriceFeed = 0x51597f405303C4377E36123cBc172b13269EA163 │
│ 精度1e8Chainlink标准
│ 价格示例:$1.00 = 100000000 (1e8) │
└────────────────────────────┬────────────────────────────────────────┘
│ 2. 部署 YTPriceFeed传入WUSD地址
│ 2. 部署 YTPriceFeed传入USDC和Chainlink地址)
┌─────────────────────────────────────────────────────────────────────┐
│ 部署 YTPriceFeed可升级
@@ -809,7 +820,10 @@
│ const YTPriceFeed = await ethers.getContractFactory("YTPriceFeed") │
│ const priceFeed = await upgrades.deployProxy( │
│ YTPriceFeed, │
│ [wusdAddress], // ← 初始化参数WUSD地址
│ [
│ usdcAddress, // ← USDC代币地址 │
│ usdcPriceFeedAddress // ← Chainlink预言机地址 │
│ ], │
│ { │
│ kind: "uups", │
│ initializer: "initialize" │
@@ -817,29 +831,37 @@
│ ) │
└────────────────────────────┬────────────────────────────────────────┘
│ 3. initialize(address _wusdAddress)
│ 3. initialize(address _usdc, address _usdcPriceFeed)
┌─────────────────────────────────────────────────────────────────────┐
│ YTPriceFeed.initialize() │
│ ───────────────────────────────────────────────────────────────── │
│ function initialize(address _wusdAddress) external initializer
│ function initialize(
│ address _usdc, │
│ address _usdcPriceFeed │
│ ) external initializer │
│ │
│ 步骤: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ ① __UUPSUpgradeable_init() │ │
│ │ • 初始化UUPS升级功能 │ │
│ │ │ │
│ │ ② 验证WUSD地址 │ │
│ │ if (_wusdAddress == address(0)) revert InvalidAddress() │ │
│ │ ✓ 0x7Cd... 有效 │ │
│ │ ② 验证USDC地址 │ │
│ │ if (_usdc == address(0)) revert InvalidAddress() │ │
│ │ ✓ 0x8AC... 有效 │ │
│ │ │ │
│ │ ③ 保存WUSD地址 │ │
│ │ wusdAddress = _wusdAddress │ │
│ │ ③ 验证Chainlink预言机地址 │ │
│ │ if (_usdcPriceFeed == address(0)) revert InvalidAddress()│ │
│ │ ✓ 0x515... 有效 │ │
│ │ │ │
│ │ ④ 设置治理地址 │ │
│ │ ④ 保存地址 │ │
│ │ usdc = _usdc │ │
│ │ usdcPriceFeed = AggregatorV3Interface(_usdcPriceFeed) │ │
│ │ │ │
│ │ ⑤ 设置治理地址 │ │
│ │ gov = msg.sender (部署者) │ │
│ │ │ │
│ │ 设置默认参数 │ │
│ │ 设置默认参数 │ │
│ │ maxPriceChangeBps = 500 // 5% 最大价格变动 │ │
│ └─────────────────────────────────────────────────────────────┘ │
└────────────────────────────┬────────────────────────────────────────┘
@@ -850,16 +872,20 @@
│ YTPriceFeed 就绪 │
│ ───────────────────────────────────────────────────────────────── │
│ 状态: │
│ • wusdAddress: 已设置 ✓
│ • usdc: 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d ✓
│ • usdcPriceFeed: 0x51597f405303C4377E36123cBc172b13269EA163 ✓ │
│ • gov: 已设置 ✓ │
│ • maxPriceChangeBps: 500 (5%) │
• wusdPriceSource: 未设置(稍后配置)
│ 价格获取方式: │
│ • USDC价格从Chainlink实时获取自动更新
│ • YT代币价格从YTAssetVault.ytPrice()读取需keeper更新
│ │
│ 优势: │
│ ✓ 减少一个初始化参数
│ ✓ WUSD地址在初始化时就确定
│ ✓ 避免后续单独设置WUSD地址
│ ✓ 简化部署流程
│ ✓ USDC价格实时准确Chainlink提供
│ ✓ 无需手动更新USDC价格
│ ✓ 价格数据去中心化,更可靠
│ ✓ 支持价格验证(负数/零值检查)
└─────────────────────────────────────────────────────────────────────┘
```
@@ -869,15 +895,16 @@
┌─────────────────────────────────────────────────────────────────────┐
│ 系统部署顺序 │
│ │
│ 步骤 1: 部署 WUSD
─→ WUSD.initialize("Wrapped USD", "WUSD")
│ 步骤 1: 准备 USDC 和 Chainlink 地址
─→ USDC: 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d (BSC主网)
│ └─→ Chainlink USDC/USD: 0x51597f405303C4377E36123cBc172b13269EA163 │
│ │
│ 步骤 2: 部署代币合约 │
│ ├─→ USDY.initialize() │
│ └─→ YTLPToken.initialize() │
│ │
│ 步骤 3: 部署 YTPriceFeed │
│ └─→ YTPriceFeed.initialize(wusdAddress) ← 传入WUSD地址
│ └─→ YTPriceFeed.initialize(usdcAddress, usdcPriceFeedAddress)
│ │
│ 步骤 4: 部署 YTVault │
│ └─→ YTVault.initialize(usdyAddress, priceFeedAddress) │
@@ -907,9 +934,9 @@
│ └─→ poolManager.setHandler(routerAddress, true) │
│ │
│ 步骤 8: 配置 YTPriceFeed │
│ ├─→ priceFeed.setWusdPriceSource(ytAssetVaultAddress) │
│ ├─→ priceFeed.setKeeper(keeperAddress, true) │
─→ priceFeed.setMaxPriceChangeBps(500) │
─→ priceFeed.setMaxPriceChangeBps(500) │
│ └─→ 注意USDC价格自动从Chainlink获取无需手动设置 │
│ │
│ 步骤 9: 配置 YTVault 参数 │
│ ├─→ vault.setSwapFees(30, 4, 50, 20) │