AMM 初始流动性生成器(GCASH / PETRO)

AMM 初始流动性生成器(GCASH / PETRO)

初始 GCASH 储备 X0
-
初始 PETRO 储备 Y0
-
常数 k = X0 × Y0
-
-
-
-
-
-
-
-
-

# 本次买入(PETRO) 累计买入(PETRO) X(GCASH) Y(PETRO) 价格(GCASH/PETRO) 本次花费(GCASH) 累计花费(GCASH) cumulative_buy_GCASH pool_GCASH_after_buy price_after_buy_GCASH_per_Token tokens_remaining_in_pool tokens_bought_cumulative avg_price_paid_so_far_GCASH_per_Token
小白逐步买入记录:
AMM 步 小白本次买入(GCASH) 本次拿到(PETRO) 小白累计 GCASH 小白累计 PETRO 小白平均价
数据可视化(按 tokens_bought_cumulative 作为横轴):
提示:当前忽略手续费,仅用于估算初始流动性与价格路径。若需引入手续费,请在模拟中将入场资金乘以 (1 - fee) 再计算 PETRO 输出。
function solveStartForTargetAvgWithSchedule(p0, p1, dx, steps, schedule, interval, targetAvg, xbEarly) { const { x0, y0, k } = computeInitialReservesByGCASH(p0, p1, dx, steps); function avgForStart(s) { let x = x0; let y = y0; let tokens = 0; let spent = 0; let schedIdx = 0; if (xbEarly > 0) { const xE = x + xbEarly; const yE = k / xE; tokens += y - yE; spent += xbEarly; x = xE; y = yE; } for (let t = 1; t <= steps; t++) { const x1 = x + dx; const y1 = k / x1; if (t >= s && ((t - s) % Math.max(1, interval) === 0) && schedIdx < schedule.length) { const amount = Number(schedule[schedIdx] || 0); const x2 = x1 + amount; const y2 = k / x2; tokens += y1 - y2; spent += amount; x = x2; y = y2; schedIdx += 1; } else { x = x1; y = y1; } } return spent > 0 ? spent / tokens : 0; } let events = schedule.length; let lo = 1; let hi = Math.max(1, steps - Math.max(0, events - 1) * Math.max(1, interval)); const aLo = avgForStart(lo); const aHi = avgForStart(hi); if (targetAvg <= aLo) return lo; if (targetAvg >= aHi) return hi; for (let i = 0; i < 50; i++) { const mid = Math.floor((lo + hi) / 2); const am = avgForStart(mid); if (am < targetAvg) lo = mid + 1; else hi = mid - 1; } return Math.floor((lo + hi) / 2); }