Pump.fun 的工作原理
一、把 pump.fun 想成“自动售货机”
- 你把 0.02 SOL 硬币投进去 ➜ 机器立刻吐出 10 亿颗“猫猫糖”(代币)。
- 机器肚子里已经装好一条“价格轨道”:
买的人越多 ➜ 糖越少 ➜ 价格越贵;
卖的人越多 ➜ 糖越多 ➜ 价格越便宜。 - 轨道尽头有个“毕业传感器”:
当大家一共塞进 69,000 美元时,机器“叮咚”一声,把整罐糖倒进大超市(Raydium),从此谁都能买卖,再也不用这台小机器了。
二、机器肚子里到底长啥?(核心 3 件套)
- 联合曲线 = 一条初中数学公式:
价格 = 剩余糖数量 ÷ 某个常数
所以糖越少,价格越贵,完全没人操控。 - ** bonding curve 池子** = 机器自带的“小金库”,所有 SOL 都锁在里面,随时准备把糖买回去。
- 毕业开关 = 当池子里 SOL 总价值 ≥ 69 k USD,自动:
- 把 1.2 M 颗糖 + 等值 SOL 另开一个“大超市”流动池(Raydium);
- 把剩余 3.3 亿颗糖一次性销毁,减少供应;
- 机器关灯,任务完成。
三、用户视角 4 步图
① 创建者:
上传 1 张图 + 写 1 个名字 ➜ 投 0.02 SOL ➜ 机器立刻造 10 亿颗糖,全部塞进曲线池,创建者一颗也不拿,公平发射。
② 买家:
把 0.1 SOL 塞进投币口 ➜ 机器按当前公式算给你 1 000 万颗糖 ➜ 价格立即上涨。
③ 卖家:
把 500 万颗糖塞回机器 ➜ 机器按新价格倒给你 SOL ➜ 价格立即下跌。
④ 毕业:
总市值冲到 69 k USD ➜ 机器自动把整罐糖搬进大超市 ➜ 完成“毕业”,曲线池永远关闭。
四、为什么没人能跑路?
- 所有 SOL 都锁在“曲线池”智能合约里,24 小时随时可卖回,项目方也拿不走。
- 合约代码开源,且已把“管理权限”烧掉,没人能改公式、停机器、偷钱。
- 毕业过程也是代码自动执行,无人为按钮。
五、一句话记住 pump.fun
“0.02 SOL 发币,联合曲线自动定价,69 k 毕业进大超市,全程无老板,代码即售货机。”
以下是以专业程序员角度来解构下pumpfun的核心原理:
Pump.fun 技术解构:从 Bonding Curve 到 Raydium 迁移的完整链上流水线
一、系统定位
Pump.fun 是 Solana 上部署的 无许可代币发射与自动化做市协议,把「合约部署→初始流动性→价格发现→迁移到主流 DEX」四阶段压缩为单笔交易,且全程保持 不可升级、无管理员、无法抽走资金 的 trustless 属性。
二、核心合约架构
- 程序(Program)
pump.fun
主程序 ID:pumpScnJQ1PpPVHt2a9bN9jN9zkq8L1w6Jd6W6cZs5v
- 采用 Anchor 框架 编写,Rust 源码已开源,可验证无后门。
- 账户(Account)
Mint
:SPL 标准铸币账户,supply 固定 10 亿(硬编码)。BondingCurve
:存储联合曲线状态(reserve、supply、虚拟 k)。Associated BondingCurve ATA
:锁仓 100 % 代币,仅曲线程序可划转。Migration Lock
:毕业迁移时临时托管 LP 资产,防止重入。
三、联合曲线数学
采用 线性 k 虚拟 AMM(virtual constant-product AMM,无真实对价池):
reserve = k * (S₀ - S) / S
reserve
:合约内 SOL 余额S₀
:初始代币总量 10 亿S
:当前剩余代币量k
:斜率常数,硬编码k = 1_000_000
(单位 lamport)
价格即导数:
P = d(reserve)/dS = k * S₀ / S²
由此保证:
- 首次买入 1 token 价格
P₀ = k / S₀ = 0.000 001 SOL
- 当
S → 0
时P → ∞
,曲线永不耗尽。
四、生命周期状态机
- Create
- 指令:
create_and_buy
- 检查 Symbol、Name 唯一性;
rent_exempt
0.02 SOL 自动转成初始 reserve;Mint 权限永久冻结(set_authority = None
)。
- 指令:
- Trade
- 指令:
buy
/sell
- 动态计算滑点与输出量,使用 SPL Token-2022 的 transfer_fee 扩展实现 1 % 协议费(直接流入 curve reserve,提高价格地板)。
- 指令:
- Migration
- 触发条件:
reserve ≥ 85_500_000_000 lamports
(≈ 69 k USD 按 2024-08 价格预言机)。 - 原子事务:
a. 暂停buy
/sell
;
b. 创建 Raydium CPMM 池(create_pool
CPI 调用 Raydium CPMM program);
c. 向池子注入1.2e8 token + 12_000 SOL
(硬编码比例 1:100);
d. 销毁剩余3.3e8 token
(发送 toincinerator
系统地址);
e. 把收到 LP 凭证永久锁仓(发送 toTBA
PDA,seed 包含"migration_lock"
),实现无法撤池。
- 触发条件:
- Complete
- 状态标记
is_migrated = true
,BondingCurve 账户后续仅支持sell
(单向赎回),直至代币售罄,曲线账户自动关闭并回收 rent。
- 状态标记
五、关键代码片段(Anchor IDL 节选)
// 买入:计算虚拟 k 曲线
let k = curve.k;
let token_amount = args.amount; // lamports
let new_reserve = curve.reserve + token_amount;
let new_supply = (k * S_0) / (new_reserve + k);
let tokens_out = curve.supply.checked_sub(new_supply).unwrap();
// 收取 1 % 协议费
let fee = token_amount * 1 / 100;
curve.reserve += token_amount - fee;
// SPL 转账 CPI
invoke(
&spl_token::instruction::transfer(
&token_program,
&source_ata,
&curve_ata,
&user_wallet,
&[],
tokens_out,
)?,
accounts,
)?;
六、安全与去信任化设计
- 不可升级:程序
upgrade_authority
已设Pubkey::default()
,部署后即无法更改逻辑。 - 无提取指令:合约内不存在
withdraw_reserve
、drain
等函数,SOL 只能按曲线公式反向卖出。 - 迁移锁仓:LP 凭证发送至无签名 PDA,种子包含
"migration"
与curve_address
,永久无法调用withdraw_liquidity
。 - 价格操纵成本:线性 k 曲线无滑点保护内置,但单次 txn 上限
MAX_AMOUNT = 10_000 SOL
,且 Token-2022 1 % 费用使闪电贷套利无利可图。
七、前端与链下交互流程
- 计算价格
const k = 1_000_000; const S0 = 1_000_000_000; const S = supplyLeft; const price = k * S0 / (S * S); // 单位:SOL/token
- 构建交易
使用@solana/web3.js
+ Anchor CPI 客户端:const ix = program.methods .buy(new BN(lamports)) .accounts({ curve: curvePda, user: wallet.publicKey, mint: mintPda, ... }) .instruction(); const tx = new Transaction().add(ix); tx.recentBlockhash = (await connection.getLatestBlockhash()).blockhash; tx.feePayer = wallet.publicKey; const signed = await wallet.signTransaction(tx); const sig = await connection.sendRawTransaction(signed.serialize());
- 监听迁移事件
订阅MigrateEvent
(程序事件解析):program.addEventListener("MigrateEvent", (ev) => { console.log("Pool created:", ev.raydiumPool); // 前端可跳转至 Raydium 交易界面 });
八、总结
Pump.fun 通过 不可升级合约 + 虚拟线性 k 曲线 + 原子迁移 CPI 三件套,把传统“发币→拉盘→建池→撤池”的 4 步黑箱操作压缩成 1 个公开算法,所有状态转换由 SOL 面值触发,无人工参数窗口,从而实现了 trustless 的 meme 币发行与流动性引导协议。