Pump代币激励
x402agent2026-10-28查看 1163复制 641
基于交易量的 PUMP 代币奖励系统,具有按天索引的 epoch、按比例分配、累加器跟踪以及 Solana 上的跨程序领取功能。
📘如何使用这个技能
- 1复制技能内容·点击上方「Copy SKILL.md」复制全部内容,或 Download 下载到本地
- 2打开你的 AI 客户端·支持 Claude Code、Trae、Cursor、ChatGPT、DeepSeek、Kimi 等任意 AI 助手
- 3粘贴为系统提示/知识文件·Claude Code:放入 .claude/skills/ 目录;普通对话:作为首条消息发送并说「请严格按这份技能文档执行」
- 4直接提出你的需求·AI 会按技能定义的工作流、格式和约束来处理,无需再解释背景
💡 提示:技能生效后,每次对话只需一句需求,AI 会按 SKILL.md 的流程执行。
SKILL.md3121 chars
---
name: pump-token-incentives
description: "Volume-based PUMP token reward system with day-indexed epochs, pro-rata distribution, accumulator tracking, and cross-program claiming on Solana."
metadata:
openclaw:
homepage: https://github.com/nirholas/pump-fun-sdk
requires:
env:
- SOLANA_RPC_URL
---
# Token Incentives — Volume-Based PUMP Token Rewards
Implement and maintain the token incentive system that rewards traders with PUMP governance tokens based on their SOL trading volume, using a day-based epoch system with pro-rata distribution.
## Context
The Pump protocol incentivizes trading activity by distributing PUMP tokens to users proportional to their SOL trading volume. The system tracks volume in day-long epochs, with each day having a pre-configured token supply pool.
## Day-Based Epoch System
Volume tracking operates in fixed-length epochs defined by the `GlobalVolumeAccumulator`:
- `startTime` — epoch system start timestamp
- `secondsInADay` — epoch length (typically 86,400 seconds)
- `solVolumes[]` — array of total SOL volume per day
- `totalTokenSupply[]` — array of PUMP tokens available per day
```typescript
dayIndex = Math.floor((currentTimestamp - startTime) / secondsInADay)
```
## Pro-Rata Reward Formula
$$\text{tokens} = \frac{\text{userSolVolume} \times \text{dayTokenSupply}}{\text{globalSolVolume}}$$
## Account Lifecycle
1. **Init** (`initUserVolumeAccumulator`) — creates the user's volume accumulator PDA
2. **Sync** (`syncUserVolumeAccumulator`) — updates the accumulator with latest volume data
3. **Claim** (`claimTokenIncentives`) — claims accumulated PUMP token rewards
4. **Close** (`closeUserVolumeAccumulator`) — closes the account, reclaims rent
## BothPrograms Aggregation
Since users trade on both the bonding curve (Pump) and AMM (PumpAMM):
- `fetchUserVolumeAccumulatorTotalStats(user)` — sums across both programs
- `getTotalUnclaimedTokensBothPrograms(user)` — combined unclaimed rewards
- `claimTokenIncentivesBothPrograms(user, payer)` — claims from both
- `syncUserVolumeAccumulatorBothPrograms(user)` — syncs both
## Edge Cases
| Case | Behavior |
|------|----------|
| Zero global volume for a day | No tokens distributed (division by zero guarded) |
| User never synced | Only `totalUnclaimedTokens` from account state returned |
| Day index beyond arrays | No additional rewards computed |
| User updated same day | `currentDayTokens` returns preview, `totalUnclaimedTokens` excludes it |
## Patterns to Follow
- Pure functions in `tokenIncentives.ts` — no side effects, no RPC calls
- Accept optional `currentTimestamp` parameter for testability
- Always use `BN` arithmetic — never convert to JavaScript `number`
- Sync before claiming to ensure the latest volume is reflected
## Common Pitfalls
- `totalUnclaimedTokens` does NOT include the current day's rewards — only finalized days
- `currentDayTokens` returns 0 if the user's last update was on a different day (sync first)
- Day indices are zero-based from `startTime`, not from epoch 0
- Volume accumulator PDAs differ between Pump and PumpAMM programs