mcpField
P
pumpfun-mechanics

pumpfun-mechanics

github.com/agiprolabs其他456459 次安装8 周前更新
代码仓库

关于 pumpfun-mechanics

pumpfun-mechanics 是面向 Solana 链上分析和交易策略开发者的 PumpFun 技术指南,涵盖曲线计算、毕业迁移机制,以及指令和事件解析。

主要功能

  1. 01计算买卖数量、成本与价格影响
  2. 02估算毕业进度并说明迁移流程
  3. 03解析 PumpFun 指令与事件布局
  4. 04提供曲线计算器和事件解析脚本

适用场景

  1. 01评估代币买卖的曲线价格与滑点影响
  2. 02追踪代币达到毕业门槛的进度
  3. 03从交易数据解析 PumpFun 事件
  4. 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.md
graduation_process.md
instruction_reference.md
scripts/
curve_calculator.py
parse_events.py

详细介绍

PumpFun 机制 — 联合曲线、毕业与指令解析

PumpFun 是 Solana 上主流的代币发行平台。了解其联合曲线数学、毕业流程和指令格式,对于分析新代币发行、围绕毕业事件制定交易策略,以及解析链上 PumpFun 活动都至关重要。

联合曲线数学

PumpFun 使用**虚拟恒定乘积(CPMM)**联合曲线:

k = virtualSolReserves × virtualTokenReserves
初始参数
参数值
初始虚拟 SOL30 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% 最终会毕业。

毕业时的变化
  1. 联合曲线账户上的 complete 标记设为 true
  2. 发出 CompleteEvent(判别符 5f72619cd42e9808)
  3. 联合曲线停止接受交易
  4. 约 12,000 美元的流动性存入目标 DEX
  5. 代币可在 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]

事件判别符(十六进制)
CreateEvent1b72a94ddeeb6376
TradeEventbddb7fd34ee661ee
CompleteEvent5f72619cd42e9808
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旧版,偶尔仍可见
create181ec828051c0777创建代币
买入指令数据(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