Buy and sell on PumpFun bonding curves + PumpSwap AMM. Directly from Python.
Project description
pumpfun-python
Buy and sell on PumpFun bonding curves + PumpSwap AMM. Directly from Python. No Jupiter needed.
Why?
PumpFun tokens start on a bonding curve and graduate to a PumpSwap AMM pool. Jupiter doesn't always route through these — and when it does, you're at the mercy of their routing engine. This library builds the raw Solana instructions so you can swap directly.
- Pre-graduation — buy/sell against the PumpFun bonding curve (v2, 16/14 accounts)
- Post-graduation — swap on PumpSwap AMM pools (constant-product, 13 accounts)
- Zero dependencies beyond solders + httpx — no SDK bloat
- Production-tested — extracted from a live trading system
Install
pip install pumpfun-python
Or from source:
pip install git+https://github.com/JinUltimate1995/pumpfun-python.git
Quick Start
💰 Calculate buy/sell amounts (no RPC needed)
from pumpfun import calculate_buy_amount, calculate_sell_amount
# How many tokens for 0.1 SOL?
tokens = calculate_buy_amount(
sol_amount_lamports=100_000_000, # 0.1 SOL
virtual_sol_reserves=30_000_000_000,
virtual_token_reserves=1_000_000_000_000,
)
print(f"Tokens received: {tokens:,}")
# How much SOL for selling 1M tokens?
sol_out = calculate_sell_amount(
token_amount=1_000_000,
virtual_sol_reserves=30_000_000_000,
virtual_token_reserves=1_000_000_000_000,
)
print(f"SOL received: {sol_out / 1e9:.6f}")
📈 Read bonding curve state
RPC calls require your own Solana RPC endpoint. Get a free key from Helius, QuickNode, or use the public endpoint (rate-limited).
import asyncio
from pumpfun import fetch_bonding_curve_state
async def main():
state = await fetch_bonding_curve_state(
rpc_url="https://api.mainnet-beta.solana.com",
token_mint="YourTokenMintAddress",
)
print(f"Reserves: {state.virtual_sol_reserves} SOL, {state.virtual_token_reserves} tokens")
print(f"Complete (graduated): {state.complete}")
print(f"Creator: {state.creator}")
asyncio.run(main())
🔨 Build a buy instruction
from solders.pubkey import Pubkey
from pumpfun import build_buy_instruction, get_bonding_curve_pda
user = Pubkey.from_string("YourWalletAddress")
token_mint = Pubkey.from_string("TokenMintAddress")
bonding_curve = get_bonding_curve_pda(token_mint)
ix = build_buy_instruction(
user=user,
token_mint=token_mint,
bonding_curve=bonding_curve,
sol_amount_lamports=100_000_000, # 0.1 SOL max
min_tokens_out=950_000, # slippage protection
creator=Pubkey.from_string("CreatorAddress"),
fee_recipient=Pubkey.from_string("62qc2CNXwrYqQScmEdiZFFAnJR262PxWEuNQtxfafNgV"),
)
# Add `ix` to your transaction
🏊 PumpSwap AMM swap
from pumpfun import calculate_swap_output, build_swap_instruction, fetch_pool_state
# Read pool state
pool = await fetch_pool_state(rpc_url, "PoolAddress")
# Calculate output
amount_out, fee = calculate_swap_output(
amount_in=100_000_000, # 0.1 SOL
reserve_in=5_000_000_000,
reserve_out=1_000_000_000_000,
lp_fee_bps=pool.lp_fee_basis_points,
protocol_fee_bps=pool.protocol_fee_basis_points,
)
API Reference
Bonding Curve (pre-graduation)
| Function | Description |
|---|---|
calculate_buy_amount() |
Tokens received for SOL input (1% fee) |
calculate_sell_amount() |
SOL received for token input (1% fee) |
build_buy_instruction() |
Build PumpFun v2 BUY ix (16 accounts) |
build_sell_instruction() |
Build PumpFun v2 SELL ix (14 accounts) |
fetch_bonding_curve_state() |
Read reserves, creator, completion from chain |
fetch_fee_recipient() |
Read fee recipient from Global account |
PumpSwap AMM (post-graduation)
| Function | Description |
|---|---|
calculate_swap_output() |
Output amount for constant-product swap |
build_swap_instruction() |
Build PumpSwap swap ix (13 accounts) |
fetch_pool_state() |
Read pool vaults, mints, fees from chain |
PDA Helpers
| Function | Description |
|---|---|
get_bonding_curve_pda() |
Derive bonding curve PDA for a mint |
get_associated_token_address() |
Derive ATA (SPL Token or Token-2022) |
Constants
All program IDs are exported: PUMP_FUN_PROGRAM, PUMP_SWAP_PROGRAM, PUMP_AMM_PROGRAM, plus system programs, discriminators, and fee accounts.
Account Layout Notes
BUY instruction uses 16 accounts + 1 remaining account (bonding-curve-v2 PDA).
SELL instruction uses 14 accounts + 1 remaining — but creator_vault [8] and token_program [9] are SWAPPED relative to buy. This is an undocumented PumpFun quirk that causes failed transactions if you copy the buy layout.
Pump AMM pools (pAMMBay program) can have reversed base/quote — base_mint=SOL, quote_mint=TOKEN. The PoolState.base_is_sol flag indicates this.
Also by JinUltimate1995
- jupiter-swap-python — Jupiter swap client for Python. Async. Typed.
- solana-rpc-resilient — Fault-tolerant Solana RPC with automatic failover.
- dexscreener-python — DexScreener API client for Python.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pumpfun_python-0.1.0.tar.gz.
File metadata
- Download URL: pumpfun_python-0.1.0.tar.gz
- Upload date:
- Size: 14.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e3cd2e628704970153438b6f46b12ba2101a815c0d346f4620709c73c899e8e6
|
|
| MD5 |
2fe5278679e6808fc1f8d06960b9e540
|
|
| BLAKE2b-256 |
e9d89ab1d8e8c90d855c74400e71c644815ae3d71192a70fcaa3af61424ac8e5
|
File details
Details for the file pumpfun_python-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pumpfun_python-0.1.0-py3-none-any.whl
- Upload date:
- Size: 12.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e38d06891ca3495a7e092faef6ec96de18c1f55c48b81a9c45f8b2b9b5d93501
|
|
| MD5 |
499c8c85dab0a7914926ead03d655aef
|
|
| BLAKE2b-256 |
968a102c3128e37712450c70cd31279202f49462e5b5a204bdba19cdec37e033
|