Перейти к содержимому

Миграция на PumpSwap

Pump.fun-токен первую часть своей жизни торгуется на bonding curve — автомате ценообразования, принадлежащем программе pump.fun. Когда в кривую залилось достаточно SOL, кривая грэдуэйтится: ликвидность переезжает в постоянный PumpSwap pool (AMM), и торговля продолжается там уже всегда.

Moono Protocol относится к этому переходу как к концепту первого класса. Любая операция Moono — buy/sell займа, MTrade-buy/sell, ликвидация — работает одинаково до и после грэдуации, потому что универсальные инструкции определяют состояние кривой on-chain и роутят в нужный backend.

Когда поле real_sol_reserves у bonding curve достигает константы Global.threshold pump.fun:

  1. Аккаунт кривой переключает флаг complete в true. Новых покупок в кривую больше не будет.
  2. Инструкцию migrate pump.fun можно вызвать, чтобы:
    • Создать pool на PumpSwap для токена
    • Сминтить LP-токены на pool authority
    • Перевести накопленные SOL и base-токены из кривой в vault’ы пула
  3. После миграции вся торговля идёт через AMM PumpSwap (pumpswap.buy, pumpswap.sell).

Миграция одноразовая для каждого токена. После неё кривая запечатана, а pool активен.

Moono разрешает грэдуацию кривой ровно в одном месте loan-потока — cap-aware initial buy внутри launch_0. Любая другая buy-ix Moono отвергает грэдуацию посреди потока ошибкой BuyWouldGraduateCurve.

Это даёт frontend’у единственную детерминированную точку грэдуации. Цена — pre-flight должен спланировать всю связку так, чтобы ни bundle buy, ни user buy случайно не закэпили кривую.

Сценарий A — All-pre-grad (миграции во время вашего loan-потока нет)

Суммарный спрос вашего лонча комфортно ниже порога грэдуации. launch_0 не закепливает кривую. launch_migrate_0 и launch_complete_0 отправляются в составе entry-связки, но исполняются как дешёвые no-op’ы. Все последующие loan-flow buy и user buy остаются на bonding curve.

Сценарий B — Cap-path (миграция как часть вашего запуска)

Ваш Initial Buy Amount достаточно большой, чтобы закепить кривую. Entry-связка:

  1. launch_0 — грэдуэйтит кривую (pump.fun автоматически кэпит buy до порога; остаток SOL остаётся на займе как initial_quote_buy_remaining)
  2. launch_migrate_0 — вызывает pump.fun.migrate для создания PumpSwap pool и pumpswap.extend_account для апгрейда pool до последнего layout
  3. launch_complete_0 — тратит initial_quote_buy_remaining на PumpSwap через pumpswap.buy_exact_quote_in
  4. bundle_buy_universal_0 × N — bundle-покупки, теперь уже на PumpSwap
  5. buy_exact_quote_in_market_universal_0 — ваш user buy, тоже на PumpSwap

Вся последовательность атомарна (один Jito-bundle, если включён). Подробности pre-flight проверки и отвержения gray-zone — на странице Borrower → Шаг 5.

Сценарий C — Внешняя грэдуация во время вашего займа

Вы запустились в режиме all-pre-grad, но другие трейдеры пумпнули кривую через порог пока ваш займ был открыт. В следующий раз, когда вы (или кто-то ещё) работаете с этим токеном через Moono, универсальная ix определит BondingCurve.complete == true и пошлёт операцию на PumpSwap.

Если migrate pump.fun ещё не крэнкнули — pool ещё не создан на PumpSwap — buy/sell упадёт. На этот случай exit-связка Moono (repay или liquidate) начинается с защитного launch_migrate_0. Он идемпотентен: no-op, если кривая не завершилась; no-op, если pool уже создан; крэнк, если обе условия совпали.

Вам ничего вручную делать не нужно. Приложение вставляет этот защитный migrate автоматически в каждый exit.

В MTrade (отдельный торговый терминал) грэдуация не привязана к конкретному действию пользователя. Если вы открываете токен, у которого кривая завершилась, но PumpSwap pool ещё не создан, на странице появится баннер Migrate:

Bonding curve is ready to be migrated to PumpSwap. Anyone can trigger it now.
[Migrate]

Нажать может любой. Caller оплачивает миграцию — примерно ~0.05 SOL rent за новые аккаунты (pool, lp_mint, pool ATAs) плюс compute fees — и после приземления tx сделки MTrade по этому токену начинают идти на PumpSwap.

On-chain handler (mtrade_migrate_0) — тот же, что использует loan-flow (launch_migrate_0). Та же инструкция, то же идемпотентное поведение — вызвать дважды или без надобности безопасно.

Для конкретного токена post-graduation:

АспектPre-gradPost-grad
Площадка buy/sellpump.fun bonding curvePumpSwap AMM pool
Открытие ценыФормула кривойConstant-product AMM
Инструкция MoonoТа же universal ix, ветка pumpТа же universal ix, ветка PumpSwap
ALTТа же per-token ALTТа же per-token ALT (уже включает адреса PumpSwap)
Поведение slippageДоминирует кривизна кривойДоминирует глубина pool’а
КомиссииFee recipients pump.funProtocol/buyback fee recipients PumpSwap

ALT — ключевой UX-момент: вывести обе ветки один раз при первом взаимодействии с токеном, и вы готовы на всю его жизнь. Bundle ALT Moono и per-token ALT MTrade оба следуют этому правилу.

ДействиеКто платитПрибл. стоимость
Cap-path migrate во время launch_0Заёмщик (платится из launch overhead и упаковывается в entry tx)~0.05 SOL за pool/lp_mint/ATA rent + CU
Защитный migrate в exit-связкеCaller repay/liquidate (вы) — но это no-op, если внешней грэдуации не было~0 SOL на no-op пути
Крэнк миграции чужого токена через mtrade_migrate_0Caller (любой)~0.05 SOL + ~1M CU

Rent возвращается косвенно (оседает на аккаунтах пула) — практическая стоимость в основном в апфронт-капитале, который блокируется на аккаунтах пула. Moono сам комиссий за миграцию не берёт.

launch_migrate_0 и mtrade_migrate_0 оба идемпотентны:

  • Если кривая не грэдуэйтилась: быстрый no-op возврат
  • Если кривая грэдуэйтилась, но pool ещё нет: полный migrate CPI
  • Если кривая грэдуэйтилась и pool уже есть: пропуск migrate, запуск extend_account (тоже идемпотентен)

Можно вызывать там, где удобно — в худшем случае несколько тысяч CU.

Для разработчиков на Moono: читать BondingCurve.complete off-chain для выбора ix не нужно. Универсальные ix’ы делают это сами на цепочке. Соберите tx с обеими ветками в remaining_accounts, передавайте один и тот же shape каждый раз, и handler выберет живую ветку в момент исполнения. Это убирает race window между off-chain чтением и on-chain приземлением.

Полный layout аккаунтов — в IX-референсе в репозитории moono-solana.

Кнопка Migrate в MTrade полезнее всего, когда:

  • Вы хотите торговать токеном, у которого кривая завершилась, но никто не мигрировал — buy/sell не пройдут, пока pool не создан
  • Вы оператор бота, который крэнкает миграции как public service (награды протокола нет, но это открывает торговлю по токену для всех)

Если у токена в MTrade нет баннера Migrate — миграция либо не нужна (кривая ещё активна), либо уже сделана (вы уже торгуете на PumpSwap).