backtrader
Event-driven backtesting with bar-by-bar execution, complex order types, multiple analyzers,…
PumpFun bonding curve math, graduation mechanics, instruction parsing, and PumpSwap migration
$ npx -y skills add agiprolabs/claude-trading-skills --skill pumpfun-mechanics --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/pumpfun-mechanicsContext preview
The summary Claude sees to decide when to auto-load this skill.
PumpFun bonding curve math, graduation mechanics, instruction parsing, and PumpSwap migration
name: pumpfun-mechanics description: PumpFun bonding curve math, graduation mechanics, instruction parsing, and PumpSwap migration
PumpFun is the dominant Solana token launchpad. Understanding its bonding curve math, graduation process, and instruction formats is essential for analyzing new token launches, building trading strategies around graduation events, and parsing on-chain PumpFun activity.
PumpFun uses a **virtual constant-product (CPMM)** bonding curve:
k = virtualSolReserves × virtualTokenReserves
| Parameter | Value | |-----------|-------| | Initial Virtual SOL | 30 SOL (30,000,000,000 lamports) | | Initial Virtual Tokens | ~1.073B tokens (1,073,000,000,000,000 raw, 6 decimals) | | Token Total Supply | 1B tokens (1,000,000,000,000,000 raw) | | Real Token Reserves | ~793M tokens (793,000,000,000,000 raw) | | Real SOL Reserves | 0 (no real SOL at launch) | | Fee | 1% (applied externally by the program) |
**Virtual vs Real**: Virtual reserves define the curve shape. Real reserves track actual withdrawable funds. The difference (1.073B - 793M = 280M virtual tokens) shapes the initial price but can never be withdrawn.
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)
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)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)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_solThe 1% fee is **not** part of the curve math. It's applied externally:
# 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
Graduation occurs when `realSolReserves` reaches **~85 SOL** (~$12K-14K depending on SOL price). Only ~1.4% of PumpFun tokens ever graduate.
1. `complete` flag set to `true` on bonding curve account 2. `CompleteEvent` emitted (discriminator `5f72619cd42e9808`) 3. Bonding curve stops accepting trades 4. ~$12K liquidity deposited to the destination DEX 5. Token becomes tradeable on PumpSwap (or Raydium for older tokens)
GRADUATION_THRESHOLD = 85_000_000_000 # 85 SOL in lamports fill_pct = (real_sol_reserves / GRADUATION_THRESHOLD) * 100.0
PumpSwap is a constant-product AMM with 1% fee (same as bonding curve). Key differences:
| Program/Account | Address | |-----------------|---------| | PumpFun Program | `6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P` | | PumpSwap Program | `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA` | | Fee Program | `pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ` | | Global Account | `4wTV1YmiEkRvAtNtsSGPtUrqRYQMe5SKy2uB4Jjaxnjf` | | Fee Recipient | `62qc2CNXwrYqQScmEdiZFFAnJR262PxWEuNQtxfafNgV` | | Event Authority | `Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1` |
Events are Anchor-style: `sha256("event:<EventName>")[0..8]`
| Event | Discriminator (hex) | |-------|-------------------| | CreateEvent | `1b72a94ddeeb6376` | | TradeEvent | `bddb7fd34ee661ee` | | CompleteEvent | `5f72619cd42e9808` |
mint: pubkey 32 bytes solAmount: u64 8 bytes tokenAmount: u64 8 bytes isBuy: bool 1 byte user: pubkey 32 bytes timestamp:
A comprehensive collection of 68 ready-to-use trading, DeFi, and quantitative finance Agent Skills. Works with Claude Code, Cursor, Codex, Gemini CLI, and 30+ other tools.
Repo: agiprolabs/claude-trading-skills
Event-driven backtesting with bar-by-bar execution, complex order types, multiple analyzers,…
Solana token market data via Birdeye — prices, OHLCV, trades, token metadata, security…
Broad crypto market data from CoinGecko covering 13,000+ tokens. Global market stats,…
Cointegration testing for pairs trading using Engle-Granger, Johansen, and rolling stability…
Wallet evaluation, monitoring, and copy-trade strategy design for Solana DEX trading
Cross-asset correlation analysis including rolling correlation, hierarchical clustering, tail…