关于 pumpfun-mechanics
pumpfun-mechanics 是面向 Solana 链上分析和交易策略开发者的 PumpFun 技术指南,涵盖曲线计算、毕业迁移机制,以及指令和事件解析。
主要功能
- 01计算买卖数量、成本与价格影响
- 02估算毕业进度并说明迁移流程
- 03解析 PumpFun 指令与事件布局
- 04提供曲线计算器和事件解析脚本
适用场景
- 01评估代币买卖的曲线价格与滑点影响
- 02追踪代币达到毕业门槛的进度
- 03从交易数据解析 PumpFun 事件
- 04分析毕业后 PumpSwap 的交易机制
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ agiprolabs/ claude-trading-skills --skill pumpfun-mechanics安装后在 Claude Code 中输入/pumpfun-mechanics确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/bonding_curve_math.mdgraduation_process.mdinstruction_reference.mdscripts/curve_calculator.pyparse_events.py详细介绍
PumpFun 机制 — 联合曲线、毕业与指令解析
PumpFun 是 Solana 上主流的代币发行平台。了解其联合曲线数学、毕业流程和指令格式,对于分析新代币发行、围绕毕业事件制定交易策略,以及解析链上 PumpFun 活动都至关重要。
联合曲线数学
PumpFun 使用**虚拟恒定乘积(CPMM)**联合曲线:
k = virtualSolReserves × virtualTokenReserves
初始参数
| 参数 | 值 |
|---|---|
| 初始虚拟 SOL | 30 SOL(30,000,000,000 lamports) |
| 初始虚拟代币 | 约 10.73 亿枚(原始值 1,073,000,000,000,000,6 位小数) |
| 代币总供应量 | 10 亿枚(原始值 1,000,000,000,000,000) |
| 实际代币储备 | 约 7.93 亿枚(原始值 793,000,000,000,000) |
| 实际 SOL 储备 | 0(发行时没有实际 SOL) |
| 手续费 | 1%(由程序在曲线之外收取) |
虚拟储备与实际储备:虚拟储备决定曲线形状。实际储备记录可实际提取的资金。两者之间的差额(10.73 亿 - 7.93 亿 = 2.8 亿虚拟代币)决定初始价格,但永远无法提取。
现货价格
price_sol_per_token = virtual_sol_reserves / virtual_token_reserves
# In human-readable units:
price = (virtual_sol / 1e9) / (virtual_token / 1e6)
# At genesis: 30 / 1,073,000,000 ≈ 2.796e-8 SOL/token
# At graduation: ~4.1e-7 SOL/token (~14.7x from launch)
买入代币(SOL → 代币)
def buy_tokens(v_sol: int, v_tok: int, real_tok: int, sol_in: int) -> int:
"""Calculate tokens received for a given SOL input.
Args:
v_sol: Virtual SOL reserves (lamports).
v_tok: Virtual token reserves (raw).
real_tok: Real token reserves (raw).
sol_in: SOL to spend (lamports, BEFORE 1% fee).
Returns:
Tokens received (raw units).
"""
k = v_sol * v_tok
new_v_sol = v_sol + sol_in
new_v_tok = k // new_v_sol + 1 # +1 matches on-chain rounding
tokens_out = v_tok - new_v_tok
return min(tokens_out, real_tok)
卖出代币(代币 → SOL)
def sell_tokens(v_sol: int, v_tok: int, real_sol: int, tokens_in: int) -> int:
"""Calculate SOL received for selling tokens.
Args:
v_sol: Virtual SOL reserves (lamports).
v_tok: Virtual token reserves (raw).
real_sol: Real SOL reserves (lamports).
tokens_in: Tokens to sell (raw units).
Returns:
SOL received (lamports, BEFORE 1% fee).
"""
k = v_sol * v_tok
new_v_tok = v_tok + tokens_in
new_v_sol = k // new_v_tok
sol_out = v_sol - new_v_sol - 1 # -1 matches on-chain floor rounding
return min(sol_out, real_sol)
买入成本(指定代币数量 → 所需 SOL)
def buy_cost(v_sol: int, v_tok: int, tokens_wanted: int) -> int:
"""Calculate SOL needed to buy exact token amount.
Returns:
SOL cost in lamports (before fee). Returns max int if impossible.
"""
if tokens_wanted >= v_tok:
return 2**64 - 1 # impossible
k = v_sol * v_tok
new_v_tok = v_tok - tokens_wanted
new_v_sol = k // new_v_tok + 1
return new_v_sol - v_sol
手续费处理
1% 手续费不属于曲线数学的一部分,而是在曲线之外收取:
# Buying: fee deducted from SOL input before curve
actual_sol_to_curve = sol_input * 0.99
# Selling: fee deducted from SOL output after curve
actual_sol_received = sol_from_curve * 0.99
# Roundtrip minimum cost: ~2% from fees alone, plus price impact
市值
market_cap_sol = (token_total_supply * virtual_sol_reserves) / virtual_token_reserves
毕业
当 realSolReserves 达到约 85 SOL(根据 SOL 价格,约合 12,000 至 14,000 美元)时,就会发生毕业。PumpFun 代币中只有约 1.4% 最终会毕业。
毕业时的变化
- 联合曲线账户上的
complete标记设为true - 发出
CompleteEvent(判别符5f72619cd42e9808) - 联合曲线停止接受交易
- 约 12,000 美元的流动性存入目标 DEX
- 代币可在 PumpSwap(较早发行的代币则在 Raydium)上交易
填充百分比
GRADUATION_THRESHOLD = 85_000_000_000 # 85 SOL in lamports
fill_pct = (real_sol_reserves / GRADUATION_THRESHOLD) * 100.0
迁移目标
- 2025 年 3 月及之后:PumpSwap(
pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA)——原生 AMM,无迁移费 - 2025 年 3 月之前:Raydium V4(
675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8)——6 SOL 手续费
PumpSwap 毕业后机制
PumpSwap 是收取 1% 手续费的恒定乘积 AMM(与联合曲线相同)。主要区别:
- 基础资产始终为 WSOL,报价资产为代币
- 指令语义相反:“buy”指令卖出代币,“sell”指令买入代币
- 支持创作者收益分成(将交易量的 0.05% 分给原始创作者)
程序 ID 与地址
| 程序/账户 | 地址 |
|---|---|
| PumpFun 程序 | 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P |
| PumpSwap 程序 | pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA |
| 手续费程序 | pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ |
| 全局账户 | 4wTV1YmiEkRvAtNtsSGPtUrqRYQMe5SKy2uB4Jjaxnjf |
| 手续费接收方 | 62qc2CNXwrYqQScmEdiZFFAnJR262PxWEuNQtxfafNgV |
| 事件权限账户 | Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1 |
事件解析
事件采用 Anchor 风格:sha256("event:<EventName>")[0..8]
| 事件 | 判别符(十六进制) |
|---|---|
| CreateEvent | 1b72a94ddeeb6376 |
| TradeEvent | bddb7fd34ee661ee |
| CompleteEvent | 5f72619cd42e9808 |
TradeEvent 布局(8 字节判别符之后)
mint: pubkey 32 bytes
solAmount: u64 8 bytes
tokenAmount: u64 8 bytes
isBuy: bool 1 byte
user: pubkey 32 bytes
timestamp: i64 8 bytes
virtualSolReserves: u64 8 bytes
virtualTokenReserves: u64 8 bytes
realSolReserves: u64 8 bytes
realTokenReserves: u64 8 bytes
重要:事件位于 CPI 内层指令中。请在指令数据的任意位置搜索判别符,而不只是偏移量 0 处。
联合曲线账户布局
Offset 0: discriminator 8 bytes
Offset 8: virtualTokenReserves u64
Offset 16: virtualSolReserves u64
Offset 24: realTokenReserves u64
Offset 32: realSolReserves u64
Offset 40: tokenTotalSupply u64
Offset 48: complete bool (1 byte)
Offset 49: creator pubkey (32 bytes)
PDA 推导
| PDA | 种子 |
|---|---|
| 联合曲线 | ["bonding-curve", mint] |
| 联合曲线 V2 | ["bonding-curve-v2", mint] |
| 创作者金库 | ["creator-vault", creator] |
指令判别符
| 指令 | 十六进制 | 备注 |
|---|---|---|
| buy_exact_sol_in (V2) | 38fc74089edfcd5f | 当前生产环境买入指令 |
| sell (V2) | 33e685a4017f83ad | 当前生产环境卖出指令 |
| buy (V1/legacy) | 66063d1201daebea | 旧版,偶尔仍可见 |
| create | 181ec828051c0777 | 创建代币 |
买入指令数据(24 bytes)
[0..8]: discriminator
[8..16]: spendable_sol_in u64 LE (total SOL budget, fees deducted internally)
[16..24]: min_tokens_out u64 LE (slippage floor)
卖出指令数据(24 bytes)
[0..8]: discriminator
[8..16]: amount_tokens u64 LE (tokens to sell, raw)
[16..24]: min_sol_output u64 LE (minimum SOL out, lamports)
价格影响与交易规模
def price_impact(v_sol: int, v_tok: int, sol_in: int) -> float:
"""Calculate price impact for a buy as a percentage."""
spot = v_sol / v_tok
tokens = buy_tokens(v_sol, v_tok, v_tok, sol_in)
if tokens == 0:
return float('inf')
exec_price = sol_in / tokens
return (exec_price / spot - 1) * 100
# Example: 1 SOL buy at genesis
# impact = price_impact(30_000_000_000, 1_073_000_000_000_000, 1_000_000_000)
# ≈ 3.3% price impact
文件
参考资料
references/bonding_curve_math.md— 完整的数学推导及计算示例references/graduation_process.md— 毕业阈值、迁移和 PumpSwap 机制references/instruction_reference.md— 用于解析的完整指令和事件布局
脚本
scripts/curve_calculator.py— 交互式绑定曲线计算器:价格、影响和成交比例scripts/parse_events.py— 从交易数据中解析 PumpFun 事件
评论
支持 Markdown