Skip to content

Commit df05c06

Browse files
committed
add vePendle
1 parent 3644428 commit df05c06

File tree

1 file changed

+149
-0
lines changed

1 file changed

+149
-0
lines changed

defi/Pendle/vePendle.md

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
## 1. 模型原理及数学描述
2+
3+
### (1) 锁仓与权重计算的核心思想
4+
5+
vePendle 模型本质上是一个 **锁仓机制(Voting Escrow)**,用户通过锁定 PENDLE 代币,获得一个与锁定金额和锁定时长挂钩的非转让投票权。核心目标在于:
6+
- **激励长期持有**:通过锁仓延长时间,用户能获得更高的治理权重和奖励;
7+
- **权重动态衰减**:随着锁仓时间的流逝,投票权逐渐降低,确保治理权与锁定期限紧密绑定。
8+
9+
最常见的数学公式描述为:
10+
11+
\[
12+
\text{vePendle 权重} = \text{锁定金额} \times \frac{\text{剩余锁定时间}}{\text{最大锁定时间}}
13+
\]
14+
15+
其中:
16+
- **锁定金额** 是用户投入的 PENDLE 数量;
17+
- **剩余锁定时间** = 锁定结束时间 - 当前时间;
18+
- **最大锁定时间** 为系统预设的最大锁仓周期(例如 4 年)。
19+
20+
这种设计保证了用户在锁仓期内,其治理权会**线性衰减**,从而鼓励用户延长锁定时间或频繁更新锁仓状态以保持较高权重。
21+
22+
### (2) 权重随时间衰减的动态性
23+
24+
与 Curve 的 veCRV 类似,vePendle 的核心在于动态计算用户的治理权重。假设用户在时刻 \(t_0\) 锁定 \(A\) 个代币,到期时间为 \(T\)\(T \leq t_0 + \text{max\_lock}\)),那么任一时刻 \(t\)\(t_0 \leq t \leq T\))的投票权重可以表达为:
25+
26+
\[
27+
w(t) = A \times \frac{T - t}{T - t_0} \quad \text{或} \quad w(t) = A \times \frac{T - t}{\text{max\_lock}}
28+
\]
29+
30+
不同项目可能在公式上有细微区别:
31+
- 前者把初始锁仓时长作为归一化因子;
32+
- 后者统一使用最大锁仓时长,使得即使用户锁仓时间不足最大周期,权重也以相同标准计算。
33+
34+
这种线性衰减设计确保了锁仓越接近结束,用户实际拥有的治理权越低;从而在治理过程中,迫使用户“续锁”或更新锁仓以保持较高权重。
35+
36+
37+
38+
## 2. 代码实现细节与示例
39+
40+
下面给出一个伪代码示例,展示如何在 Solidity 中计算和更新 vePendle 权重。注意这只是对核心逻辑的展示,实际合约会更为复杂,并会考虑安全、重入保护以及高效数据存储问题。
41+
42+
```solidity
43+
// SPDX-License-Identifier: MIT
44+
pragma solidity ^0.8.0;
45+
46+
contract VePendle {
47+
// 锁仓信息
48+
struct LockInfo {
49+
uint256 amount; // 锁定的 PENDLE 数量
50+
uint256 endTime; // 锁仓结束时间
51+
uint256 startTime; // 锁仓开始时间(可选,用于更精细的计算)
52+
}
53+
54+
// 用户地址映射到锁仓信息
55+
mapping(address => LockInfo) public locks;
56+
57+
// 最大锁仓时间,例如:4年 = 4 * 365 * 86400 秒
58+
uint256 public constant MAX_LOCK_TIME = 4 * 365 days;
59+
60+
// 事件通知:锁仓或更新
61+
event Locked(address indexed user, uint256 amount, uint256 endTime);
62+
63+
// 用户锁仓函数
64+
function lock(uint256 _amount, uint256 _lockDuration) external {
65+
require(_lockDuration > 0 && _lockDuration <= MAX_LOCK_TIME, "Invalid lock duration");
66+
67+
// 计算结束时间
68+
uint256 endTime = block.timestamp + _lockDuration;
69+
70+
// 此处省略代币转移逻辑(如 transferFrom 等)
71+
locks[msg.sender] = LockInfo({
72+
amount: _amount,
73+
startTime: block.timestamp,
74+
endTime: endTime
75+
});
76+
77+
emit Locked(msg.sender, _amount, endTime);
78+
}
79+
80+
// 计算当前 vePendle 权重
81+
function getVoteWeight(address _user) public view returns (uint256) {
82+
LockInfo memory lockInfo = locks[_user];
83+
if (block.timestamp >= lockInfo.endTime) {
84+
return 0;
85+
}
86+
// 剩余锁仓时间
87+
uint256 remainingTime = lockInfo.endTime - block.timestamp;
88+
// 权重 = 锁定金额 * (剩余时间 / 最大锁仓时间)
89+
return lockInfo.amount * remainingTime / MAX_LOCK_TIME;
90+
}
91+
}
92+
```
93+
94+
### 关键点解析
95+
96+
- **锁仓函数**:用户调用 `lock` 函数时,必须指定锁定数量和锁仓时长,系统计算出结束时间,并记录用户锁仓信息。实际应用中,还需要校验用户余额、调用 ERC20 的 `transferFrom` 等操作。
97+
98+
- **权重计算**`getVoteWeight` 函数根据当前时间动态计算用户剩余锁仓时间,再按照比例返回用户的治理权重。注意使用整型除法时可能存在精度损失,实际实现中可考虑使用高精度数学库或调整单位(例如使用 wei)。
99+
100+
- **状态更新**:用户可以在锁仓期内对锁仓信息进行续锁(延长 endTime)或增加锁定量,系统需设计相应的更新函数,同时调整对应的权重。
101+
102+
103+
104+
## 3. 激励机制与治理设计
105+
106+
### (1) 治理权与奖励挂钩
107+
108+
vePendle 模型通常不仅赋予治理投票权,还将奖励分配(如交易费分红、流动性挖矿加成等)与用户的 vePendle 权重挂钩。这样一来,治理权越大,用户在系统中享受的额外收益也越多,从而鼓励用户长期持有和参与治理。
109+
110+
### (2) 防止短期操控
111+
112+
由于投票权随着时间衰减,短期内大量买入 PENDLE 并锁仓虽然可以瞬间获得较高权重,但如果不续锁或延长锁定时间,其权重会迅速下降。这降低了“快进快出”用户对治理的短期操控风险,使治理决策更具持续性和合理性。
113+
114+
### (3) 动态调整与续锁激励
115+
116+
为了鼓励用户延长锁仓期,协议可设计动态激励机制,比如:
117+
- 在锁仓期接近结束时,通过奖励“续锁”行为(例如额外奖励或投票权加成)来防止大量用户同时解锁;
118+
- 设计自动续锁功能,让用户在解锁窗口自动选择延长锁仓周期,保持治理权稳定。
119+
120+
121+
122+
## 4. 潜在风险与优化挑战
123+
124+
### (1) 流动性问题
125+
126+
长期锁仓虽然能提升治理稳定性,但也会降低市场上 PENDLE 的流动性,可能在市场波动时加剧价格波动。解决方案包括设计部分流动性激励措施或支持质押衍生品。
127+
128+
### (2) 解锁窗口集中风险
129+
130+
当大量用户的锁仓期在同一时间到期时,可能导致治理权迅速下降及市场抛压。为缓解此风险,可采用以下策略:
131+
- **分散解锁时间**:在用户锁仓时引入随机化或限制每个周期内可解锁的比例;
132+
- **预告机制**:提前通知用户解锁窗口,引导用户续锁或逐步退出。
133+
134+
### (3) 算法复杂度与 gas 优化
135+
136+
实时计算权重可能涉及高频调用,如何在保证精度的同时降低 gas 消耗,是设计时必须考虑的点。常见做法包括:
137+
- 利用“快照”机制,在治理投票前批量更新状态;
138+
- 使用“延迟更新”策略,仅在用户交互时计算最新权重。
139+
140+
141+
142+
## 5. 总结
143+
144+
vePendle 模型通过锁仓获得动态衰减的治理权重,不仅将治理权与长期承诺挂钩,还为激励机制设计提供了灵活空间。其核心技术要点包括:
145+
- **权重的线性衰减**:通过剩余锁仓时间与最大锁仓期的比例来计算治理权重;
146+
- **激励机制设计**:锁仓与奖励、治理挂钩,鼓励用户长期持有并参与生态治理;
147+
- **风险与优化**:面对流动性、解锁集中风险和 gas 成本,设计者需要在安全性、用户体验与系统性能之间找到平衡。
148+
149+
这一模型在技术上借鉴了成熟的 veCRV 思路,同时针对 Pendle 生态的特定需求做出调整,为去中心化金融项目提供了既稳定又灵活的治理和激励方案。

0 commit comments

Comments
 (0)