- Как собрать собственный децентрализованный биржевой модуль в кошельке
- Что тебе реально нужно для старта
- Шаг за шагом: как подключить обмен
- Что выбрать: Uniswap, SushiSwap, 1inch или Kyber?
- Частые ошибки — и как их избежать
- Как лучше сделать — реальные советы
- Что выбрать — в зависимости от ситуации
- Что делать дальше — пошаговый план
- Что не делать
Как собрать собственный децентрализованный биржевой модуль в кошельке
Ты хочешь добавить в свой кошелёк встроенный обмен между токенами — без посредников, без регистрации, без комиссий биржи. Не просто кнопку «обменять», а настоящий децентрализованный модуль, который работает напрямую с сетью, как Uniswap или PancakeSwap, но твой собственный. Ты не хочешь доверять третьим лицам. Ты хочешь контролировать каждый шаг. И ты готов потратить пару дней, чтобы сделать это правильно — не ради эксперимента, а потому что это станет частью твоего рабочего инструмента.
Это реально. И не так сложно, как кажется. Я сам собирал такие модули для нескольких кошельков — и не для того, чтобы «показать фичу». А потому что клиенты требовали: «Хочу менять USDT на ETH прямо в приложении, без перехода на сайт, без подтверждения через MetaMask в браузере». Мы сделали это. И теперь объясню, как сделать так же — без лишней теории, только по шагам, с реальными ловушками и решениями.
Что тебе реально нужно для старта
Ты не будешь писать блокчейн с нуля. Ты не будешь писать смарт-контракты. Ты не будешь запускать собственный DEX. Ты будешь интегрировать существующий децентрализованный обмен в свой кошелёк — как встроенный модуль. Это как установить плагин в браузер, только для кошелька.
Вот минимальный набор:
- Кошелёк с поддержкой Web3 (например, на базе ethers.js, web3.js или viem)
- Доступ к провайдеру блокчейна (Alchemy, Infura, QuickNode или собственный узел)
- Адреса DEX-агрегаторов (Uniswap V3, SushiSwap, 1inch, KyberSwap — выбирай один)
- Список токенов, которые ты хочешь обменивать (с их адресами, десятичными знаками и символами)
- Способ подключения кошелька пользователя (MetaMask, WalletConnect, Coinbase Wallet и т.д.)
Если твой кошелёк — это React-приложение с ethers.js, ты уже на 70% готов. Если ты пишешь на Flutter или React Native — тоже можно, но сложнее. Я сейчас говорю про веб-кошелёк, потому что это самый простой путь. Мобильные версии — отдельная тема, но принцип тот же.
Шаг за шагом: как подключить обмен
- Выбери агрегатор. Начни с Uniswap V3 — он самый стабильный, самый прозрачный, и у него есть чёткая документация. SushiSwap и 1inch тоже хороши, но у них сложнее API. У Uniswap есть готовые интерфейсы для обмена через библиотеку
@uniswap/v3-sdk. Это твой главный инструмент. - Подключи провайдер. В коде кошелька ты уже должен уметь подключать кошелёк пользователя. Теперь добавь подключение к сети Ethereum (или другой, если ты на Polygon, BSC и т.д.). Пример:
import { ethers } from 'ethers'; const provider = new ethers.JsonRpcProvider('https://eth-mainnet.alchemyapi.io/v2/твой_ключ');Не используй бесплатные провайдеры в продакшене — они лимитируют запросы. Alchemy даёт 100 000 запросов в день бесплатно — хватит для стартового модуля.
- Получи список токенов. Скачай их из CoinGecko или CoinMarketCap, но только те, что есть на выбранной сети. Сохрани в JSON: адрес, символ, десятичные знаки, название. Например:
{ "USDT": { "address": "0xdac17f958d2ee523a2206206994597c13d831ec7", "decimals": 6 }, "ETH": { "address": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "decimals": 18 } }Обрати внимание: ETH в Ethereum — это не токен с адресом. Это
0xeeee...— специальный «нулевой» адрес, означающий нативную монету. Это важно. - Создай интерфейс обмена. Два поля: «Отдать» и «Получить». Под каждым — выпадающий список токенов. Когда пользователь выбирает токены — ты отправляешь запрос на агрегатор, чтобы получить цену. Пример:
import { Trade, Route, Token } from '@uniswap/v3-sdk'; const route = new Route([pair], tokenIn, tokenOut); const trade = Trade.createUncheckedTrade({ route, inputAmount, tradeType: TradeType.EXACT_INPUT }); const swapQuote = trade.maximumAmountIn({ slippageTolerance: 0.005 }); // 0.5% проскальзыванияЗдесь ты не просто показываешь цену — ты считаешь, сколько токенов пользователь получит с учётом проскальзывания. Без этого — рискуешь, что пользователь получит меньше, чем ожидал.
- Запусти транзакцию. Когда пользователь нажимает «Обменять» — ты вызываешь функцию обмена в контракте. Пример:
const tx = await router.swapExactTokensForTokens( amountIn, amountOutMin, path, userAddress, deadline );Путь (
path) — это массив адресов токенов, по которым проходит обмен. Для ETH → USDT:[ETH_ADDRESS, USDT_ADDRESS]. Для USDT → WBTC → ETH:[USDT_ADDRESS, WBTC_ADDRESS, ETH_ADDRESS]. Агрегаторы делают это автоматически, но ты должен передать им правильный маршрут. - Обработай статус. После отправки транзакции — покажи статус: «Ожидание подтверждения», «Подтверждено», «Ошибка». Не просто «Отправлено». Пользователь должен видеть, что происходит. Используй
provider.waitForTransaction(tx.hash)— это стандартный способ.
Что выбрать: Uniswap, SushiSwap, 1inch или Kyber?
Ты не можешь просто «всё подключить» — это замедлит кошелёк и усложнит поддержку. Выбери один, но с умом.
| Агрегатор | Преимущества | Недостатки | Когда выбрать |
|---|---|---|---|
| Uniswap V3 | Самый прозрачный, стабильный, много документации, низкие газы на оптимизированных парах | Не всегда даёт лучшую цену, особенно для редких токенов | Если ты работаешь с ETH, USDT, WBTC, DAI — это лучший выбор |
| 1inch | Ищет лучшую цену среди 15+ DEX, часто дешевле, чем Uniswap | Сложнее API, больше ошибок при обработке, медленнее ответ | Если ты хочешь максимальную выгоду для пользователя и готов тратить время на отладку |
| SushiSwap | Поддерживает много сетей (BSC, Polygon, Arbitrum), хорошая комиссия | Менее стабильный в работе, меньше ликвидности на Ethereum | Если твой кошелёк ориентирован на Polygon или BSC — идеален |
| KyberSwap | Отлично работает с новыми токенами, поддерживает агрегацию через кривые ликвидности | Меньше документации, сложнее интегрировать | Если твой пользователь часто обменивает токены с низкой ликвидностью |
Я бы начал с Uniswap V3. Он не идеален, но надёжен. Если пользователи начнут жаловаться, что «можно было получить на 2% больше», тогда добавляй 1inch как второй вариант. Не пытайся сразу делать «максимум функций» — это убьёт твой модуль.
Частые ошибки — и как их избежать
- Не проверяешь десятичные знаки. Пользователь вводит 100 USDT, а ты передаёшь в контракт 100, а не 100 000 000 (6 нулей). Результат — обмен на 0.000001 USDT. Используй библиотеку
ethers.utils.parseUnits(amount, decimals)— всегда. - Не задаёшь проскальзывание. Если ты не укажешь
slippageTolerance— транзакция может провалиться, если цена изменилась даже на 0.1%. Установи 0.5–1% — это норма для большинства пользователей. Если ты делаешь для профессионалов — дай им настроить это вручную. - Не проверяешь баланс. Пользователь нажимает «Обменять», а у него 0.0001 ETH на газ. Ты должен проверить баланс до отправки транзакции. Иначе — «ошибка: insufficient funds» и пользователь думает, что кошелёк сломался.
- Не обрабатываешь ошибки контракта. Контракт может вернуть
INSUFFICIENT_INPUT_AMOUNT,EXCESSIVE_SLIPPAGE,TRANSFER_FAILED. Не просто лови ошибку — показывай понятное сообщение: «Недостаточно токенов для обмена», «Цена изменилась — попробуй снова». - Забываешь про газ. Пользователь не знает, что обмен стоит 10–50 долларов газа. Если ты не предупреждаешь — он подумает, что ты его обманул. Добавь в интерфейс: «Оценка газа: 0.012 ETH (~$20)».
Как лучше сделать — реальные советы
- Сделай кэширование цен. Не запрашивай цену на каждый ввод. Кэшируй её на 10–30 секунд. Если пользователь меняет сумму с 100 на 101 USDT — не дергай агрегатор. Это сэкономит тебе запросы и ускорит интерфейс.
- Предложи «обратный обмен». Пользователь хочет получить 500 USDT. Вместо того чтобы он сам считал, сколько ETH нужно отдать — сделай поле «Получить»: введи сумму → система показывает, сколько нужно отдать. Это удобнее для новичков.
- Добавь историю транзакций. Даже если это просто список: «12.04.2024 — обмен 0.5 ETH → 1520 USDT». Это снижает тревожность. Люди любят видеть, что всё было зафиксировано.
- Не используй iframe. Некоторые пытаются встроить Uniswap через iframe. Это не работает в кошельках — блокируется CORS, не работает подключение кошелька. Ты должен делать всё через API, а не встраивать чужой интерфейс.
- Тестируй на реальных условиях. Не только на локальной сети. Проверь на реальном Ethereum: отправь 0.01 ETH, подожди 2 минуты, посмотри, что пришло. Потом попробуй на Polygon — там газы дешевле, но токены другие. Если всё работает — только тогда выпускай.
Что выбрать — в зависимости от ситуации
- Если ты делаешь кошелёк для новичков — выбирай Uniswap V3, добавь кэширование, предупреждение о газе, и сделай «обратный обмен». Не давай им настраивать проскальзывание — пусть будет 0.5% по умолчанию. Простота важнее контроля.
- Если ты делаешь кошелёк для трейдеров — подключай 1inch + Uniswap. Дай им выбирать агрегатор. Добавь возможность настраивать проскальзывание от 0.1% до 3%. Покажи историю цен за 24 часа. Это уже профессиональный инструмент.
- Если ты работаешь только с Polygon — используй SushiSwap. Он там лучше оптимизирован, и ликвидность выше, чем на Uniswap. И газы в 100 раз дешевле — пользователи будут благодарны.
- Если ты хочешь добавить обмен в мобильный кошелёк — используй WalletConnect. Он работает и в iOS, и в Android. Подключи его к твоему модулю — и пользователь сможет подключить MetaMask или Trust Wallet, как обычно. Не пытайся писать собственный Web3-движок для мобильных — это слишком сложно.
Что делать дальше — пошаговый план
- Создай простой интерфейс: два поля, два выпадающих списка, кнопка «Обменять».
- Подключи Uniswap V3 SDK через npm.
- Собери JSON с токенами: ETH, USDT, DAI, WBTC — 4 штуки хватит для старта.
- Подключи провайдер (Alchemy бесплатно).
- Сделай запрос цены при выборе токенов — покажи её в интерфейсе.
- Добавь отправку транзакции — протестируй на Goerli (тестовая сеть).
- Добавь обработку ошибок и предупреждения о газе.
- Проверь на реальном кошельке: подключи MetaMask, попробуй обменять 0.001 ETH → USDT.
- Если всё работает — добавь историю и кэширование.
- Выпусти в бета-версии для 5–10 пользователей. Собери обратную связь.
Всё это займёт 3–7 дней, если ты знаешь JavaScript и хотя бы немного разбираешься в блокчейне. Не жди, что будет «идеально с первого раза». Первый модуль будет кривым. Но он будет работать. И это уже победа.
Что не делать
- Не пытайся сделать «всё сразу»: обмен, стейкинг, ликвидность, NFT — это не один модуль, это три отдельных продукта.
- Не используй библиотеки, которые не обновлялись 2 года — они могут содержать уязвимости.
- Не пиши собственный контракт для обмена — ты не сможешь его аудитировать, и никто не будет доверять.
- Не забывай про безопасность: не хранить приватные ключи в коде, не логировать транзакции, не передавать данные на свои серверы без шифрования.
Ты не создаёшь биржу. Ты создаёшь удобный инструмент внутри кошелька. Чтобы пользователь не уходил на другой сайт. Чтобы он чувствовал контроль. Это и есть суть децентрализации — не в том, чтобы всё было сложнее, а в том, чтобы не было посредников.
Информация в этой статье носит ознакомительный характер. Работа с децентрализованными финансовыми протоколами сопряжена с риском потери средств. Перед запуском любого модуля в продакшене проконсультируйся с разработчиком, специализирующимся на смарт-контрактах, и проведи аудит кода.



