逆向分析pump.fun的BondingCurve算法

找到 div id, 或者 用报错文本 进行全局搜索

全局搜索

可以看到 onChange事件处理函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
onChange:  es ? e=>{
if (et)
return;
let t = parseFloat(e.target.value);
if (isNaN(t)) {
g(""),
f("");
return
}
g(t),
f(I(new ex.BN(Math.floor(1e9 * t)), !0).toNumber() / 1e6)
}
: e=>{
let t;
if (et)
return;
let n = parseFloat(e.target.value);
if (isNaN(n)) {
f(""),
g("");
return
}
f(n);
let s = new ex.BN(1e6 * n);
t = u ? I(s, !1) : A(s),
g((0,
p.s)(t))
}
})

可知, 函数I正是算法函数的实现, 接下来,需要定位 I函数的位置,

我们在 onChange函数中打两个断点, 然后在输入框输入数量,触发执行到断点处

此时,将鼠标放置在I上就可以查看函数的位置:

或者,直接在调试窗口的下方控制台,直接输入 I, 然后双击输出, 也可以查看I的定义,

至此,我们已经找到pump.fun的bonding curve的算法实现函数:

根据前面的分析,

  • 参数 n 是个bool值, 表示的是按照sol还是按照token买入
  • 参数 e 是数量

因此,
其中 i 是 bigint库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 // 买入
function x(e,n)=>{
let s, a;
if (e.eq(new i.BN(0)) || !t)
return new i.BN(0);
if (n) {
// 按照 sol数量买入
let n = t.virtualSolReserves.mul(t.virtualTokenReserves)
, r = t.virtualSolReserves.add(e)
, o = n.div(r).add(new i.BN(1));
a = t.virtualTokenReserves.sub(o),
a = i.BN.min(a, t.realTokenReserves),
s = e
} else
// 按照 token数量买入
s = (e = i.BN.min(e, t.realTokenReserves)).mul(t.virtualSolReserves).div(t.virtualTokenReserves.sub(e)).add(new i.BN(1)),
a = e;
let r = _(s); // 手续费
return n ? a : s.add(r) //SOL加上手续费
}

// 卖出
sellQuote: e=>{
if (e.eq(new i.BN(0)) || !t)
return new i.BN(0);
let n = e.mul(t.virtualSolReserves).div(t.virtualTokenReserves.add(e))
, s = _(n); // 手续费
return n.sub(s) // 扣除手续费
}

Bonding Curve公式

特别说明:

  • 前端计算使用BN:,
  • 合约计算过程中使用 u128 , 最终计算结果保存在数据账户使用u64即可

用户买入Token

买入公式(按照SOL数量)
$$ \Delta{t} = T_v - \bigg ( \frac{S_v \times T_v}{S_v + \Delta{s}} + 1 \bigg) $$

买入公式(按照Token数量)

$$ \Delta{s} = \frac{\Delta{t} \times S_v }{T_v - \Delta{t}} + 1 $$

买入后状态更新:

用户卖出Token

$$ \Delta{s} = \frac{\Delta{t} \times S_v }{T_v + \Delta{t}} $$

卖出后状态更新:


推导过程

基础公式

买入Token(按照token数量)

$$(T_v - \Delta t)(S_v + \Delta s) = k = T_v \times S_v$$

$$\Delta t = T_v - \frac{T_v \times S_v}{S_v + \Delta s}$$

用户买入Token(按照SOL)

$$(T_v + \Delta t)(S_v - \Delta s) = k = T_v \times S_v$$

$$\Delta s = S_v - \frac{T_v \times S_v}{T_v + \Delta t}$$

$$\Delta s = \frac{S_v \times (T_v +\Delta t) - T_v \times S_v}{T_v + \Delta t} $$

$$\Delta s = \frac{S_v \times T_v + S_v \times \Delta t - T_v \times S}{T_v + \Delta t} $$

$$\Delta s = \frac{S_v \times \Delta t }{T_v + \Delta t} $$

价格

$$p = \frac{S_v}{T_v}$$

  • Copyrights © 2021-2024 youngqqcn

请我喝杯咖啡吧~