Files
Heyue_test/document/ytLp池子合约流程文档.md
2025-12-15 14:45:51 +00:00

18 KiB
Raw Blame History

ytLp池子合约流程文档

  1. 项目概述 1.1 设计目标 基于GMX GLP原理设计一个支持多种YTYield Token代币的流动性池系统。 1.2 架构对比 Plain Text GMX GLP池子 YT流动性池 ├─ ETH ├─ YT-A ├─ WBTC ├─ YT-B ├─ USDC ├─ YT-C ├─ USDT ├─ YT-D └─ DAI └─ WUSD ↓ ↓ 以USDG统一计价 以USDY统一计价 核心特点: Markdown
  • 一篮子YT代币: YT-A, YT-B, YT-C等不同的收益代币
  • WUSD代币支持: 支持WUSD稳定币地址: 0x7Cd017ca5ddb86861FA983a34b5F495C6F898c41
  • 统一底层: 所有YT都基于USDC
  • LP代币ytLP: 代表用户在池子中的份额
  • Swap功能: YT-A ↔ YT-B ↔ YT-C ↔ WUSD
  • 计价单位: USDY完全模拟GMX的USDG
  • 动态手续费: 根据池子占比自动调整手续费
  • 自动复利: 手续费直接留在池子中ytLP价值自动增长
  1. 系统流程图 Plain Text ┌─────────────────────────────────────────┐ │ 用户交互层 │ │ YTRewardRouter.sol │ │ (addLiquidity / removeLiquidity) │ └──────────────┬──────────────────────────┘ │ ┌───────────┴─────────────┐ ▼ ▼ ┌───────────────┐ ┌──────────────────┐ │ YTPoolManager │◄── │ YTVault │ │ (流动性管理) │ │ (资金池+动态费率) │ └───────┬───────┘ └──────┬───────────┘ │ │ │ ├──► YT-A (40%) │ ├──► YT-B (30%) │ ├──► YT-C (20%) │ └──► WUSD (10%) ▼ ┌───────────────┐ │ ytLP Token │ │ (ERC20) │ │ 持有即增值 │ └───────────────┘

辅助合约: ├─ USDY.sol (统一计价代币) └─ YTPriceFeed.sol (价格读取器) 流程图查看网站:https://www.processon.com/mermaid 2.1 系统总览架构图 Plain Text graph TB subgraph "用户交互层" User[用户] Router[YTRewardRouter
一站式入口] end

subgraph "核心业务层"
    PoolManager[YTPoolManager<br/>流动性管理]
    Vault[YTVault<br/>资金池 + 动态手续费]
    USDY[USDY Token<br/>统一计价单位]
end

subgraph "资产层"
    YTA[YT-A Token<br/>40% 目标占比]
    YTB[YT-B Token<br/>30% 目标占比]
    YTC[YT-C Token<br/>20% 目标占比]
    WUSD[WUSD Token<br/>10% 目标占比<br/>0x7Cd017...c41]
end

subgraph "LP代币层"
    YTLP[ytLP Token<br/>流动性凭证]
end

subgraph "奖励层"
    FeeTracker[FeeYtLPTracker<br/>手续费奖励追踪]
end

User -->|存入/取出/交换| Router
Router -->|管理流动性| PoolManager
Router -->|质押ytLP| FeeTracker
PoolManager -->|buyUSDY/sellUSDY| Vault
PoolManager <-->|铸造/销毁| YTLP
PoolManager <-->|转移USDY| USDY

Vault -->|持有| YTA
Vault -->|持有| YTB
Vault -->|持有| YTC
Vault -->|持有| WUSD
Vault <-->|铸造/销毁| USDY

FeeTracker -->|分发奖励| USDY

style WUSD fill:#90EE90
style USDY fill:#FFD700
style Vault fill:#87CEEB

2.2 用户存入流程图 Plain Text flowchart LR subgraph "输入" A[用户YT代币
10,000 YT-A] end

subgraph "Router处理"
    B[收集用户代币]
end

subgraph "PoolManager处理"
    C[调用Vault.buyUSDY]
    D[计算ytLP数量<br/>ytLP = USDY * supply / AUM]
    E[铸造ytLP]
end

subgraph "Vault处理"
    F[接收YT代币<br/>poolAmounts增加]
    G[计算手续费<br/>0.3% = 30 YT-A]
    H[更新USDY债务<br/>usdyAmounts增加]
    I[铸造USDY<br/>9,970 USDY]
end

subgraph "输出"
    J[用户获得ytLP<br/>价值9,970 USDY]
end

A --> B
B --> C
C --> F
F --> G
G --> H
H --> I
I --> D
D --> E
E --> J

style A fill:#90EE90
style J fill:#FFD700
style G fill:#FFA07A

2.3 用户取出流程图 Plain Text flowchart LR subgraph "输入" A[用户ytLP
5,000 ytLP] end

subgraph "PoolManager处理"
    B[销毁ytLP]
    C[计算USDY价值<br/>USDY = ytLP * AUM / supply]
    D[转USDY给Vault<br/>5,000 USDY]
end

subgraph "Vault处理"
    E[收到USDY并销毁]
    F[计算YT数量<br/>根据价格]
    G[计算手续费<br/>动态费率]
    H[减少poolAmounts<br/>减少usdyAmounts]
    I[转YT代币]
end

subgraph "输出"
    J[用户收到YT<br/>4,985 YT-A]
end

A --> B
B --> C
C --> D
D --> E
E --> F
F --> G
G --> H
H --> I
I --> J

style A fill:#FFD700
style J fill:#90EE90
style G fill:#FFA07A

2.4 YT代币互换流程图 Plain Text flowchart LR subgraph "输入" A[用户YT-A
1,000 YT-A] end

subgraph "Vault处理"
    B[收到YT-A<br/>poolAmounts增加]
    C[查询价格<br/>priceA, priceB]
    D[计算USDY中间值<br/>1,000 * priceA]
    E[计算YT-B数量<br/>USDY / priceB]
    F[计算动态手续费<br/>检查两端占比]
    G[更新状态<br/>YT-A增, YT-B减<br/>USDY债务转移]
    H[转出YT-B]
end

subgraph "输出"
    I[用户收到YT-B<br/>997 YT-B]
end

A --> B
B --> C
C --> D
D --> E
E --> F
F --> G
G --> H
H --> I

style A fill:#90EE90
style I fill:#87CEEB
style F fill:#FFA07A

2.5 USDY铸造销毁流程图 Plain Text graph TB subgraph "USDY生命周期" Create[创建: 用户存入YT] Mint[Vault铸造USDY] Hold[PoolManager持有USDY] Transfer[PoolManager转USDY给Vault] Burn[Vault销毁USDY] Destroy[结束: 用户取回YT] end

subgraph "关键状态"
    Supply[USDY总供应量]
    PoolBalance[PoolManager余额]
    Debt[各代币USDY债务]
end

Create --> Mint
Mint --> Supply
Mint --> Hold
Hold --> PoolBalance
Hold --> Transfer
Transfer --> Burn
Burn --> Supply
Burn --> Destroy

Mint -.更新.-> Debt
Burn -.更新.-> Debt

style Mint fill:#90EE90
style Burn fill:#FFB6C1
style Supply fill:#FFD700

2.6 动态手续费架构图 Plain Text graph TB subgraph "输入层" User[用户操作
存入/取出/Swap] Token[操作的代币
YT-A/YT-B/YT-C/WUSD] Amount[操作数量] end

subgraph "状态查询层"
    Current[当前USDY债务<br/>usdyAmounts]
    Target[目标USDY债务<br/>getTargetUsdyAmount]
    Weight[代币权重<br/>tokenWeights]
    Supply[USDY总供应<br/>totalSupply]
end

subgraph "计算层"
    Calc1[计算操作后债务<br/>nextAmount]
    Calc2[计算偏离度<br/>initialDiff vs nextDiff]
    Calc3[判断改善/恶化]
end

subgraph "手续费决策层"
    Decision{改善平衡?}
    Rebate[降低手续费<br/>baseFee - rebate]
    Penalty[提高手续费<br/>baseFee + tax]
end

subgraph "输出层"
    Final[最终手续费<br/>0% - 0.8%]
    Effect[效果反馈<br/>引导池子平衡]
end

User --> Token
Token --> Amount
Amount --> Current

Current --> Calc1
Target --> Calc1
Weight --> Target
Supply --> Target

Calc1 --> Calc2
Calc2 --> Calc3
Calc3 --> Decision

Decision -->|是| Rebate
Decision -->|否| Penalty

Rebate --> Final
Penalty --> Final
Final --> Effect

style Decision fill:#FFD700
style Rebate fill:#90EE90
style Penalty fill:#FFA07A
style Final fill:#87CEEB

2.7 各YT代币价格获取图 Plain Text graph TB subgraph "价格查询层" Query[Vault查询价格
getPrice] end

subgraph "YTPriceFeed"
    Feed[价格读取器]
    Check{是WUSD?}
end

subgraph "WUSD处理"
    Fixed[返回固定价格<br/>1.0 USDY]
end

subgraph "YT代币处理"
    YTContract[YT代币合约]
    ReadVar[ 直接读取public变量<br/>assetPrice]
    AddSpread[添加价差<br/>0.2%]
end

subgraph "返回"
    Price[返回USDY价格<br/>30位小数]
end

Query --> Feed
Feed --> Check

Check -->|是| Fixed
Check -->|否| YTContract

YTContract --> ReadVar
Note1[:只读一个变量<br/>Gas成本极低]
ReadVar -.说明.-> Note1
ReadVar --> AddSpread

AddSpread --> Price
Fixed --> Price

style Check fill:#FFD700
style Fixed fill:#90EE90
style ReadVar fill:#87CEEB
style Note1 fill:#FFE4B5
  1. 收益机制设计 3.1 自动复利机制 Plain Text ytLP自动增值模型

┌──────────────────────┐ │ 用户持有 ytLP │ │ (无需质押,无需领取) │ └────────┬─────────────┘ │ ▼ ┌──────────────────────┐ │ 池子收取手续费 │ │ ├─ Swap手续费 │ │ ├─ 存取手续费 │ │ └─ 全部留在池子中 │ └────────┬─────────────┘ │ ▼ ┌──────────────────────┐ │ 池子总价值(AUM)自动增长 │ │ AUM = Σ(poolAmounts * prices) │ │ 手续费 → poolAmounts ↑ │ └────────┬─────────────┘ │ ▼ ┌──────────────────────┐ │ ytLP价格自动上涨 │ │ ytLP价格 = AUM / ytLP总量 │ │ 持有者自动获得收益 │ └──────────────────────┘ 3.2 收益来源 Plain Text

收益来源 实现方式 说明
YT Swap手续费 留在池子 手续费不转出直接增加poolAmounts
存入手续费 留在池子 用户存入时收取的手续费留在池子
取出手续费 留在池子 用户取出时收取的手续费留在池子
YT 增值 自动 YT代币本身增值体现在价格
优势:
100%手续费归LP
自动复利,无需操作
Gas高效零额外成本
3.3 自动复利效果演示
Plain Text
场景Alice持有1000 ytLP

T0: 初始状态 ├─ 池子AUM: 100M USDY ├─ ytLP总量: 100M ├─ ytLP价格: 1.0 USDY ├─ Alice持有: 1000 ytLP └─ Alice价值: 1000 USDY

T1: 1天后产生手续费 ├─ 每日交易量: 5M USDY ├─ 平均手续费: 0.3% ├─ 日手续费: 15,000 USDY ├─ 手续费留在池子 │ ├─ 池子AUM: 100,015,000 USDY ├─ ytLP总量: 100M (不变) ├─ ytLP价格: 1.00015 USDY ⬆️ ├─ Alice持有: 1000 ytLP (不变) └─ Alice价值: 1000.15 USDY (+0.015%)

T30: 30天后复利累积 ├─ 累积手续费: ~450,000 USDY ├─ 池子AUM: 100,450,000 USDY ├─ ytLP价格: 1.0045 USDY ⬆️ ├─ Alice持有: 1000 ytLP └─ Alice价值: 1004.5 USDY (+0.45%)

T365: 1年后年化收益 ├─ 累积手续费: ~5.475M USDY ├─ 加上YT增值: ~8M USDY ├─ 池子AUM: 113.475M USDY ├─ ytLP价格: 1.13475 USDY ⬆️ ├─ Alice持有: 1000 ytLP └─ Alice价值: 1134.75 USDY (+13.475%)

Alice全程无需任何操作 只需持有ytLP价值自动增长 4. 动态手续费 4.1 动态手续费机制 场景1YT-A占比过高 公式: avg_dev = (|D_after| + |D_before|)/2 adjustment = K * avg_dev / target Plain Text 当前状态: YT-A: usdyAmounts = 50M, 目标 = 40M (+10M, 占比过高) YT-B: usdyAmounts = 30M, 目标 = 30M (正好) YT-C: usdyAmounts = 15M, 目标 = 20M (-5M, 占比过低) WUSD: usdyAmounts = 5M, 目标 = 10M (-5M, 占比过低)

用户A想存入1M USDY价值的YT-A ┌─────────────────────────────────────┐ │ 初始偏离: +10M │ │ 操作后偏离: +11M (恶化平衡) │ │ 基础手续费: 0.3% (30 bps) │ │ 税费计算: 50 * 10.5M / 40M ≈ 13 bps │ │ 最终手续费: 30 + 13 = 43 bps (0.43%) │ └─────────────────────────────────────┘ 结果:手续费提高 43% → 😱 惩罚

用户B想存入1M USDY价值的YT-C ┌─────────────────────────────────────┐ │ 初始偏离: -5M │ │ 操作后偏离: -4M (改善平衡) │ │ 基础手续费: 0.3% (30 bps) │ │ 折扣计算: 50 * 5M / 20M = 12.5 bps │ │ 最终手续费: 30 - 12.5 = 17.5 bps │ └─────────────────────────────────────┘ 结果:手续费降低 42% → 🎉 激励

用户C想从YT-A换到YT-C ┌─────────────────────────────────────┐ │ YT-A减少 → 改善平衡 │ │ YT-C增加 → 改善平衡 │ │ 最终手续费: 可能接近0% 🎁 │ └─────────────────────────────────────┘ 结果:双重鼓励! 场景2WUSD作为稳定资产 Plain Text WUSD (0x7Cd017ca5ddb86861FA983a34b5F495C6F898c41)

特点: 稳定币,价格 ≈ $1 可以直接存入池子 目标占比: 50% 作为池子的"稳定锚"

动态手续费: 当WUSD占比过低时 → 鼓励存入WUSD 当WUSD占比过高时 → 鼓励取出WUSD

用户存入WUSD场景 当前: WUSD占5M目标10M 存入5M WUSD:

  • 改善平衡 → 手续费可能只有0.05% 🎉 4.2 手续费范围 Plain Text YT代币互换:
  • 最低: 0% (大幅改善平衡)
  • 正常: 0.3% (平衡状态)
  • 最高: 0.8% (严重失衡)

涉及WUSD的操作:

  • 最低: 0% (大幅改善平衡)
  • 正常: 0.04% (平衡状态)
  • 最高: 0.24% (严重失衡) 4.3 USDY债务追踪机制 Solidity // usdyAmounts: 追踪每个代币的USDY债务 mapping(address => uint256) public usdyAmounts;

// 存入YT-A时 buyUSDY(YT-A) { // 1. 收YT-A // 2. 增加池子中YT-A数量 // 3. 增加usdyAmounts[YT-A] ← 关键! // 4. 铸造USDY给用户 }

// 取出YT-B时 sellUSDY(YT-B) { // 1. 收用户的USDY并销毁 // 2. 减少usdyAmounts[YT-B] ← 关键! // 3. 减少池子中YT-B数量 // 4. 转YT-B给用户 }

// Swap: YT-A → YT-C时 swap(YT-A, YT-C) { // 1. 收YT-A增加usdyAmounts[YT-A] // 2. 转YT-C减少usdyAmounts[YT-C] // 3. 根据两边的偏离度计算手续费 } 4.4 USDY主要作用 统一计价所有YT转换为USDY价值 价值传递PoolManager和Vault通过USDY交互 动态手续费usdyAmounts追踪债务自动平衡 按需铸造:资金高效利用,会计清晰 4.4.1 举例说明 Plain Text 场景:你去商店用积分换商品 ├─ 你有1000积分ytLP ├─ 积分中心PoolManager销毁你的积分 ├─ 商店Vault有商品YT代币 └─ 问题:商店凭什么给你商品?

解决方案:

  1. 积分中心销毁你的积分
  2. 积分中心给商店"提货券"USDY ← 关键!
  3. 商店验证提货券
  4. 商店给你商品
  5. 商店销毁提货券

如果没有第2步转USDY ├─ 商店不知道你有权拿商品 ├─ 商店无法验证价值 └─ 系统无法运转