
В прошлой статье я писал хайлевелно о том, как пришёл к разработке своего арбитражного бота на Solana — с использованием ликвидности децентрализованных бирж (DEX) и реализацией атомарных мультихоп-свопов.
В комментах под статьёй было много вопросов про одно конкретное место: откуда вообще берётся цена на DEX?Почему она двигается, кто её “ставит” и почему бывает слиппедж.
В этой статье хочу копнуть чуть глубже и разобрать именно механику ценообразования в децентрализованных пулах. Без воды, максимально простыми словами и на понятных примерах.
Если захочется углубиться в математику и механику под капотом — пишите в комменты, по возможности разложу подробнее.
Для начала быстро вспомним, как работает ценообразование на CEX, а потом на контрасте разберём DEX.
Ценообразование на CEX 💥
На CEX вроде Binance, Bybit или OKX цена формируется через ордера. Один хочет купить, другой — продать, и биржа просто сводит их заявки между собой.
Пример:
Кто-то хочет купить 1 BTC по $85,000
Кто-то готов продать по $85,100
Биржа просто показывает, кто сколько готов дать или взять — и сделки происходят на этих условиях
🔹 Как это выглядит визуально 🔹
Представь себе ось Y (вертикальную), где сверху — высокая цена, снизу — низкая. Это и есть наша визуализация стакана.
Продавцы всегда хотят продать дороже, поэтому в стакане продаж:
самая дешёвая (самая выгодная для покупателя) цена — внизу
самые дорогие предложения — сверху
Покупатели, наоборот, хотят купить дешевле, поэтому в стакане покупок:
самая высокая цена — стоит вверху (она выгоднее для продавца)
более дешёвые заявки — идут ниже
📌 Ниже — пример, как это выглядит на практике

🔹 Как это читать 🔹
Например:
Я хочу купить 4 BTC (смотрим в колонку Amount BTC),
По цене $85 700 за 1 BTC (ячейка Price USDT),
На общую сумму $342 800 (это Total USDT — 4 × 85 700).
📌 В итоге каждая строка в обоих стаканах — это ордера подобные тому, что мы разобрали.

🔹 Визуализация стакана 🔹
Чтобы было нагляднее, давай представим, что мы разворачиваем BUY order book вверх ногами (зеркально) и прикладываем его снизу к нижней части SELL order book.
📌 Так мы получим классическую картинку со спредом посередине — и будет видно, как цена покупки и продажи сходятся.

Это всё складывается в ордербук — таблицу, где сверху стакан продавцов, снизу стакан покупателей. Они не совпадают идеально, между ними есть небольшой зазор — это называется спред.
Пример:
Ты заходишь на Binance, хочешь купить 1 SOL.
В ордербуке пишут, что ближайший продавец готов отдать по $145.
Ты жмёшь “купить по рынку” — биржа забирает этот ордер у продавца, и ты получаешь SOL по $145.
А цена последней сделки (эта $145) становится “текущей рыночной ценой”.
📌 Цена на CEX постоянно меняется — не потому что кто-то “рисует” цену, а потому что люди размещают ордера: кто-то продал, кто-то купил, и вот уже новая цена. Это как аукцион — сколько готовы дать, столько и будет стоить.
Биржа сама цену не устанавливает — она просто сводит заявки между участниками.
Как формируется цена на DEX: Order Book vs AMM 💥
В отличие от централизованных бирж, где цена формируется через ордера (один хочет купить, другой продать — биржа их сводит), на децентрализованных биржах (DEX) всё работает по-другому — через пулы ликвидности.
📌 Пул ликвидности — это смарт-контракт, в котором лежат две монеты, например SOL и USDC.
Любой может прийти и обменять одну на другую — по тому курсу, который получается из текущего баланса токенов в этом пуле.
Какие вообще есть механики?
Если упростить до самого базового уровня, то под капотом почти всех DEX можно выделить две основные модели ценообразования:
🔹 Order Book (Ордера) 🔹
Пример: OpenBook (ранее Serum)
Цена формируется через лимитные заявки (ордера)
Есть покупатели и продавцы, каждый ставит свою цену
Смарт-контракт сводит ордера, как обычная биржа
Очень похоже на CEX, только всё в ончейне
🔹 AMM (Automated Market Maker) 🔹
А вот тут уже интереснее.
📌 Вместо ордеров — просто баланс токенов в пуле, и формула, по которой считается цена.
Сюда относятся разные вариации:
CPMM (Constant Product Market Maker)
Raydium AMM v4, Raydium CPMM, Uniswap V2
Формула X * Y = K, простая и надёжная
CLMM (Concentrated Liquidity Market Maker)
Uniswap V3, Raydium CLMM
Ликвидность только в выбранных диапазонах (тиках), меньше слиппедж
DLMM (Dynamic Liquidity Market Maker)
Meteora
Ликвидность двигается за ценой автоматически, гибче чем CLMM
‼️разберем CLMM в отдельной статье - механика там отличается от стандартного AMM
AMM (Automated Market Maker) 💥
В основе этой модели лежит простая, но мощная формула:
X * Y = K
Где:
X — количество одного токена в пуле (например, SOL)
Y — количество второго токена в пуле (например, USDC)
K — постоянное значение произведения изначального количества SOL * USDC (оно сохраняется при каждом свопе)
🔹 Как работает обмен 🔹
📌 Допустим, ты хочешь обменять SOL → USDC.
Ты добавляешь немного SOL в пул — то есть X увеличивается.
Чтобы K осталась постоянной, Y (кол-во USDC) должно уменьшиться.
Ты получаешь эти USDC — по новому, менее выгодному курсу, потому что ты нарушил баланс пула.
Чем больше ты меняешь — тем сильнее нарушается баланс, тем хуже курс.
🔹 Пример 1 — маленький свап 🔹
📌 Допустим в пуле:
1000 SOL
100 000 USDC
👉 Это означает, что K = 1000 * 100000 = 100,000,000
Ты хочешь обменять 1 SOL на USDC.
После обмена в пуле станет X = 1001.
Чтобы сохранить K, считаем новое Y:
Y = K / X = 100,000,000 / 1001 ≈ 99 900.1
То есть:
было 100 000 USDC
стало 99 900.1
ты получил около 99.9 USDC
👉 Эффективный курс ≈ 1 SOL = 99.9 USDC
(вместо ровно 100 — есть маленький слиппедж)
🔹 Пример 2 — крупный свап (и сильный слиппедж) 🔹
📌 Те же условия:
1000 SOL, 100 000 USDC
Ты хочешь свапнуть 100 SOL.
👉 Пул станет: X = 1100
Y = 100,000,000 / 1100 ≈ 90 909.1
То есть:
было 100 000 USDC
стало 90 909.1
ты получил 9090.9 USDC
👉 Эффективный курс ≈ 1 SOL = 90.91 USDC
👉 Разница колоссальная: ты потерял почти 9% только из-за объёма — именно это и называется проскальзывание.
Практический пример на Meteora Devnet 💥
Чтобы показать, как всё работает на практике, я создал тестовый пул на девнете и покажу, как делается расчёт и насколько он совпадает с реальностью.
Я сам себе сминтил два тестовых токена, которые буду использовать в качестве парных активов в пуле.
🔹 Создаём пул 🔹
Для эксперимента я создал пул с ликвидностью по 100 токенов каждого типа — токен X и токен Y.
На скрине видно:
Base Token (2no) - будем называть его токен X
Quote Token (BaS) - соответственно, токен Y
Initial Price - поставил 1, то есть 1 токен X = 1 токен Y.Это почти никогда не бывает так в реальности, но для примера — самое то.
Base Fee - комиссия за своп, дефолт 10% на девнете

Делаем первый своп: меняем 10 X на Y 💥
Вспоминаем старую-добрую формулу AMM:
X * Y = K — должна оставаться постоянной
🔹 Без учёта комиссии 🔹
Базовые данные:
В пуле лежит: X = 100, Y = 100
Значит: K = 100 * 100 = 10,000
Ты добавляешь 10 токенов X:
Xnew = 100 + 10 = 110
Считаем новый Y:
Ynew = K / Xnew = 10,000 / 110 ≈ 90.91
Сколько получим на выходе:
AmountOut = Y - Ynew = 100 - 90.91 ≈ 9.09
🔸 То есть получаешь почти 9.1 токена Y, если бы не было комиссии вообще.
🔹 Учитываем комиссию 10% 🔹
По умолчанию в большинстве AMM комиссия берётся с входа.
В нашем случае: 10% с 10 X → 1 X в комиссию
➡️ До пула доходит:
10 * 0.9 = 9 X
Новый X в пуле:
Xnew = 100 + 9 = 109
Пересчитаем Y:
Ynew = 10,000 / 109 ≈ 91.74
AmountOut = 100 - 91.74 = 8.26
🔺 Итого: ты получил 8.26 Y вместо 9.09.
Эта разница и есть “стоимость” комиссии в цифрах.

Важно:
Это не универсальное поведение — в разных DEX/пуловах логика бывает разной:
В ExactIn комиссия снимается с входа (как у нас)
В ExactOut — с выхода
А иногда комиссия прибавляется сверх суммы свапа
Поэтому всегда смотри:
какая модель свапа используется (ExactIn, ExactOut, hybrid),
и как реализована комиссия в конкретной DEX.
🔹 Что произошло с пулом после свопа? 🔹
На скрине ниже видно:
Баланс токена X: стал 109.00
Баланс токена Y: стал 91.74
Цена изменилась: было 1, стало ≈ 0.841

📌 Это логично:
Ты внёс X, пул получил больше X, но меньше Y → курс X упал, а Y подорожал.
Делаем второй своп — снова 10 X на Y 💥
После первого обмена баланс токенов в пуле уже изменился. Теперь повторим тот же свап — ещё 10 токенов X — и посмотрим, как изменится результат.
🔹 Исходные данные после первого свопа 🔹
X = 109
Y = 91.74
K = 10,000 (формула остаётся та же)
🔹 Сразу учитываем комиссию 10% 🔹
Как и раньше:
10 X → минус 10% комиссии → до пула доходит 9 X
Новый баланс X:
Xnew = 109 + 9 = 118
Считаем новый Y:
Ynew = 10,000 / 118 ≈ 84.74
AmountOut = 91.74 - 84.74 = 7
🔻 Получаем только 7 токенов Y — меньше, чем в первом свопе.

🔹 Сравниваем с первым свопом 🔹
В первом свопе: 10 X → 8.26 Y
Во втором свопе: 10 X → 7 Y
То есть за ту же сумму ты получил меньше.
И суммарно за 20X мы получили 15,25 Y
🔹 Почему так? 🔹
Потому что соотношение токенов в пуле изменилось, и цена токена X по отношению к Y стала ниже.
То есть твой X теперь “весит меньше”, чем в начале.
Чем больше ликвидность в пуле — тем меньше ты влияешь на цену.
Чем больше объём твоего свапа — тем сильнее цена уходит и больше слиппедж.
🔹 Как это выглядит визуально 🔹
Мы видим:
Новый баланс токенов в пуле
Обновлённое соотношение X к Y
Обновлённую текущую цену на интерфейсе

📌 Но важно понимать:
Текущая цена в UI — это просто соотношение токенов в пуле, а не та цена, по которой произойдёт следующий свап.
Настоящая цена свапа рассчитывается в момент обмена, по формуле, с учётом:
текущей ликвидности,
объёма твоего свопа,
и комиссии.
Вывод 💥
Формула X * Y = K — простая, но она не про фиксированные курсы.
Любой обмен влияет на цену.
Именно из-за этого возникает арбитраж между пулами: если в одном цена сильно сдвинулась, а в другом — ещё нет, то тут и появляется арбитражная возможность.
Чем больше объём свопа — тем хуже курс.
Лучше 1 своп на сумму X, чем 2 свопа по 0.5X.
Если текущая цена в пуле, например 1.5, то это не значит что при обмене 10 USDT, ты получишь 15 SPL. Потому что эффективная цена и реальный выход считается через формулу X * Y = K каждый раз при каждом свопе.
Соответственно, чем больше ликвидности в пуле (K) , тем объёмней свопы ты можешь делать без значимого влияния на цену.