Миграция на 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:
- Аккаунт кривой переключает флаг
completeвtrue. Новых покупок в кривую больше не будет. - Инструкцию
migratepump.fun можно вызвать, чтобы:- Создать pool на PumpSwap для токена
- Сминтить LP-токены на pool authority
- Перевести накопленные SOL и base-токены из кривой в vault’ы пула
- После миграции вся торговля идёт через AMM PumpSwap (
pumpswap.buy,pumpswap.sell).
Миграция одноразовая для каждого токена. После неё кривая запечатана, а pool активен.
Где миграция происходит в Moono
Заголовок раздела «Где миграция происходит в Moono»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-связка:
launch_0— грэдуэйтит кривую (pump.fun автоматически кэпит buy до порога; остаток SOL остаётся на займе какinitial_quote_buy_remaining)launch_migrate_0— вызываетpump.fun.migrateдля создания PumpSwap pool иpumpswap.extend_accountдля апгрейда pool до последнего layoutlaunch_complete_0— тратитinitial_quote_buy_remainingна PumpSwap черезpumpswap.buy_exact_quote_inbundle_buy_universal_0 × N— bundle-покупки, теперь уже на PumpSwapbuy_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
Заголовок раздела «Где миграция происходит в MTrade»В 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-grad | Post-grad |
|---|---|---|
| Площадка buy/sell | pump.fun bonding curve | PumpSwap 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.fun | Protocol/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_0 | Caller (любой) | ~0.05 SOL + ~1M CU |
Rent возвращается косвенно (оседает на аккаунтах пула) — практическая стоимость в основном в апфронт-капитале, который блокируется на аккаунтах пула. Moono сам комиссий за миграцию не берёт.
Идемпотентность
Заголовок раздела «Идемпотентность»launch_migrate_0 и mtrade_migrate_0 оба идемпотентны:
- Если кривая не грэдуэйтилась: быстрый no-op возврат
- Если кривая грэдуэйтилась, но pool ещё нет: полный migrate CPI
- Если кривая грэдуэйтилась и pool уже есть: пропуск migrate, запуск
extend_account(тоже идемпотентен)
Можно вызывать там, где удобно — в худшем случае несколько тысяч CU.
Frontend’у не нужно детектить грэдуацию
Заголовок раздела «Frontend’у не нужно детектить грэдуацию»Для разработчиков на 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).