pumpfun-mechanics について
pumpfun-mechanicsは、Solana上のPumpFunを扱う開発者や分析者向けの技術ガイドです。ボンディングカーブ計算、卒業と移行の仕組み、命令やイベントの解析を扱います。
主な機能
- 01売買数量、コスト、価格インパクトの計算
- 02卒業の進捗推定と移行プロセスの解説
- 03PumpFunの命令とイベント構造の解析
- 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) |
| 初期仮想トークン | 約 1.073B トークン(1,073,000,000,000,000 raw、6 decimals) |
| トークン総供給量 | 1B トークン(1,000,000,000,000,000 raw) |
| 実トークン準備金 | 約 793M トークン(793,000,000,000,000 raw) |
| 実 SOL 準備金 | 0(ローンチ時に実 SOL なし) |
| 手数料 | 1%(プログラムによって外部で適用) |
仮想準備金と実準備金:仮想準備金はカーブの形状を定義します。実準備金は実際に引き出し可能な資金を記録します。この差(1.073B - 793M = 280M の仮想トークン)が初期価格を形作りますが、引き出すことはできません。
スポット価格
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]
| イベント | ディスクリミネーター(16 進数) |
|---|---|
| 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] |
インストラクションのディスクリミネーター
| インストラクション | 16 進数 | 備考 |
|---|---|---|
| buy_exact_sol_in (V2) | 38fc74089edfcd5f | 現在の本番環境での購入 |
| sell (V2) | 33e685a4017f83ad | 現在の本番環境での売却 |
| buy (V1/legacy) | 66063d1201daebea | レガシー形式。現在も時折見られる |
| create | 181ec828051c0777 | トークンの作成 |
購入命令データ(24バイト)
[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バイト)
[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 イベントをパース