Что нового
Все выпуски OneSwaper, новые сверху. Номер версии: первая цифра — большие изменения, вторая — новые функции и доработки, третья — правки; -beta — продукт ещё в бете. Как обновиться — Обновление.
1.11.0-beta — 2026-10-26
Заявки: переписка с клиентом, фото карты с телефона, Telegram
- Написать клиенту из карточки заявки — блок «Переписка с клиентом» в карточке: сотрудник сам начинает разговор по заявке. Клиент видит сообщение карточкой «Сообщение от поддержки» на странице заявки (она обновляется сама) и в чате поддержки, а дубль приходит на почту из заявки (письмо «Заявка: сообщение от сотрудника», текст меняется в «Настройки → Почта») и от бота, если Telegram клиента связан. Это обычное обращение поддержки по заявке: ответ клиента из чата или бота ложится в него же и виден в карточке и в «Поддержке», второго чата нет. Новое право ролей «Писать клиенту из карточки заявки», встроенному «Оператору» выдано (миграция 0065).
- Фото карты с телефона по QR — на странице заявки рядом с загрузкой фото карты блок «Загрузить фото со смартфона» с QR-кодом. Ссылка разовая, на 15 минут и только для этой заявки, без входа и без кода заявки; телефон фотографирует карту или берёт фото из галереи, а страница на компьютере обновляется сама. Защита от подбора: 24 случайных байта (в базе только хэш), новая ссылка гасит прежнюю, лимиты запросов и открытий. На телефоне QR не показывается.
- Новые заявки в Telegram — со ссылкой на карточку — сообщение сотрудникам о новой заявке (и другие уведомления со ссылкой) заканчивается адресом карточки в админке (
ADMIN_DOMAINиз.env). Проверена вся цепочка: заявка на сайте → событие «Новая заявка» (в Telegram включено по умолчанию, владельцу достаточно включить Telegram и вписать чат в «Настройки → Уведомления → Настройки») → воркер → сообщение в чат.
Публичный API и плагины
- Публичный API
/api/v1по ключам — интеграторы, партнёры и мониторинги получают курсы (/directions,/ratesс ETag), валюты, лимиты, расчёт (/quotes), предпроверку и создание заявок, статус и список своих заявок, реквизиты оплаты и «клиент оплатил». Заявка из API идёт тем же путём, что с сайта (одна функцияcreateOrder): все лимиты, доверие, KYC, AML и ручная проверка действуют. Описание —/api/v1/openapi.json, для интеграторов —docs/public-api.md. - Ключи с правами — виды «Интегратор», «Партнёр», «Мониторинг», права (scopes) по минимуму, ключ
osk_live_…/osk_test_…показывается один раз, в базе — хэш. Подпись запроса HMAC (на каждый запрос или только на заявки и выплаты — для них всегда), защита от повтора подписи, IP-whitelist, срок, лимит в минуту, суточная и месячная квоты, заявок в час и максимальная сумма заявки по ключу, журнал вызовов без тел. Неверные ключи с одного IP — бан, как за перебор паролей. - Идемпотентность —
Idempotency-Keyобязателен для создания заявки и вывода партнёра: повтор возвращает тот же ответ, другое тело — 409.external_idинтегратора уникален на ключ, по нему же искать заявку. - Согласие клиента — по умолчанию клиент принимает оферту, политику ПДн и AML/KYC на нашей странице заявки, до этого реквизиты оплаты не показываются. Интегратор принимает условия за клиента только при отметке в ключе (по договору). Недоверенный ключ — заявки на ручную проверку.
- Песочница — ключи
osk_test_: заявки в отдельной таблице (не попадают в статистику, очередь операторов, AML и начисления), статусы двигаетPOST /sandbox/orders/{id}/simulate, вебхуки уходят настоящие. - Партнёрский API — партнёр сам выпускает себе ключ только на чтение (кабинет → «Партнёрская программа → API», до 2 ключей): баланс, обмены по его коду без данных клиентов, начисления, выводы. Запрос вывода через API — только с правом от владельца, на сохранённый в кабинете адрес, с подписью.
- Вебхуки на ключ —
/webhooks: только события своих заявок и своего партнёра (order.created,order.status_changed,order.payment_details_ready,order.done,order.cancelled,partner.accrual.created,partner.withdrawal.paid,api.test), подпись и 5 повторов как у вебхуков уведомлений, номер событияsequence, история и повтор, после 3 дней неудач вебхук выключается. - «Настройки → API и плагины» — ключи (создать, изменить, приостановить, ротация со сроком работы старого, новый секрет подписи, отозвать, аварийная остановка всех ключей интеграторов), последние вызовы ключа, доставки вебхуков, общие выключатели (API, заявки через API, песочница, резервы ключам). Новое право ролей «API-ключи и плагины».
- Плагины для сторонних разработчиков — папка
plugins/с манифестом: источник курса и платёжная система (дизайн —docs/plans/plugins.md). Код плагина работает в песочнице: отдельный процесс без окружения (ни базы, ни ключей), без записи на диск и запуска программ, сеть — только на хосты из манифеста. Включает и проверяет только владелец; изменился код — плагин выключается до нового подтверждения. Включённый источник курса — ещё одна площадка в опросе курсов. Пример —plugins/kraken-rates.
Курсы и деньги
- Позиция на BestChange — у направления («Курсы → Направления», кнопка «Курс», вкладка BestChange) парсер держит наш курс на заданном месте или в диапазоне мест выдачи BestChange: шаг в % или в единицах курса, наценка не ниже и не выше заданной (себестоимость), игнор-лист обменников, минимальный резерв конкурента, Rate или RankRate, защита от скачков (наценка за раз меняется не больше чем на N п.п.). Внутри диапазона курс не трогаем. Парсер меняет только нашу наценку, рыночный курс и статистика не меняются. Данные — BestChange API v2 по ключу партнёрской программы; ключ, наш номер обменника и частота — в «Курсы → Парсинг». Нет ключа, данных или курс упёрся в границу — обычная комиссия направления и уведомление «Ошибка курса». По умолчанию место 1–3, шаг 0,01 %.
- Формулы курса — вместо медианы площадок у направления можно задать формулу:
binance:BTC_USDT * 1.02, цепочкиbinance:BTC_USDT * rapira:USDT_RUB,avg(…),min,max,median, пары по медиане (BTC_RUB). Кнопка «Проверить» считает формулу по последним ценам площадок. - Страховка курса — запасной источник (формула или медиана площадок) и действие, если основной пропал, не меняется N минут или ушёл от медианы дальше N %: перейти на запасной или остановить направление. В обоих случаях — уведомление «Ошибка курса», в «Парсинге» видно, что сработало.
- Курс от суммы — у направления до шести ступеней (окно «Курс», вкладка «От суммы»): от суммы «отдаю» комиссия меньше на скидку в п.п. Работает поверх наценки BestChange и бонуса уровня клиента, учитывается в заявке и в обмене на балансе кошелька. В форме — «Курс для суммы от …» и «От … — курс лучше». В файлы мониторингов и на BestChange уходит обычный курс: их формат ступеней не знает.
- Расписание направлений — вкладка «Расписание»: дни недели, часы (через полночь, круглые сутки), праздники, часовой пояс. Вне расписания направление скрыто или показано «Откроется завтра в 09:00», заявка не создаётся (
direction_closed), в файлы мониторингов и в обмен на балансе не попадает. - История курсов с графиками — курс каждого направления пишется с прореживанием: минута (2 суток), час (120 дней), сутки (3 года), три вставки на проход воркера. В окне «Курс» вкладка «История» — рынок и курс клиента; на сайте новая страница «Курсы и графики» (
/rates) и «График курса» в форме обмена.
Деньги: агенты Telegram, биржа, резервы из баланса, автовыплата партнёрам, свой узел TRON
- Агенты Telegram (полуавтомат) — новая платёжная система «Агенты Telegram». Заявка уходит в группу проверенных агентов с кнопкой «Взять»; агент присылает боту реквизиты — клиент сразу видит их на странице заявки, — потом жмёт «Пришла полностью» или пишет, сколько пришло. Выплата так же: взял, перевёл, прислал хэш или номер перевода — заявка «Готово». У агента потолок задания, лимит за сутки, список монет и вознаграждение в %; невзятая за 15 минут выплата встаёт в «Ошибку выплаты», взятая и не подтверждённая — тревога. Экран «Заявки → Агенты Telegram»: агенты, журнал заданий, расчёты и «Выплатить агенту». Права «Агенты Telegram: смотреть / менять / выплаты агентам»; оператору выдано «смотреть».
- Хеджирование на бирже — «Заявки → Сделки на бирже»: когда заявка оплачена, движок продаёт пришедшую монету и покупает монету выдачи рыночным ордером на Binance или WhiteBIT (или только присылает уведомление «что купить»). Минимум, потолок сделки и лимит за сутки, тревога при цене хуже рынка; включает владелец с кодом 2FA. Результат против рынка на момент заявки идёт в «Юнит-экономику», цена покупки — в цену закупки заявки. Ключи бирж — в «Платёжных системах → Биржи» (только «торговля», без вывода), расшифровывает их только фоновый обработчик.
- Резервы из баланса — «Настройки → Резервы»: остаток монеты подтягивается сам из баланса Heleket, Binance или WhiteBIT по расписанию (или «Сверить сейчас») с ручной поправкой; сверка с изменением — строка журнала «Сверка с балансом».
- Автовыплата партнёрам — вывод партнёра уходит сам через Heleket: до лимита без людей, больше — ждёт подтверждения сотрудника с кодом 2FA. Пока автовыплата в пути, вручную «выплачено / отклонено» нажать нельзя; повтор сначала перепроверяет прежний номер у процессинга. Включает владелец с 2FA в «Партнёры → Выплаты».
- Свой узел TRON — платёжная система «Свой узел TRON»: приём USDT-TRC20 без процессинга. Адрес на каждую заявку выводится из xpub (на сервере только публичный ключ, приватные — у владельца офлайн), оплату видит свой узел или TronGrid; подтверждённая — «Оплачена». План других сетей, ресурсы и безопасность —
docs/plans/own-nodes.md. - Платёжный модуль стал общим для нескольких систем: у каждой свой список монет, фиат — у агентов; счёт без реквизитов (агент ещё не взял) ждёт в «Создана».
Платёжный модуль: автоприём и автовыплата (Heleket)
Адрес оплаты выставляется сам — если монету принимает Heleket («Способы оплаты»), фоновый обработчик за несколько секунд выставляет счёт на заявку, клиент видит адрес и срок счёта; оператор больше не вписывает адрес. KYC-порог, серый курс и ручная проверка клиента — по-прежнему через оператора.
«Оплачена» ставится сама — по ответу API Heleket (вебхук только будит проверку, плюс опрос каждые 15–30 с). Проводка — на фактически полученную сумму, «Сверка платежей» заполняется сама, AML-проверка входящих ставится сама.
Новые статусы: «Частично оплачена» (клиент видит, сколько получено и сколько доплатить) и «Ошибка выплаты». Недоплата и переплата до 1 % — штатно (недоплату принимаем с пересчётом выплаты), больше — на проверку; оплата после отмены — на проверку и тревога.
Автовыплата до лимита — «Платёжные системы → Автовыплата»: включает только владелец с кодом 2FA, потолок 100 $ на заявку и 500 $ в сутки по умолчанию, аварийное выключение — у владельца и у роли с правом «Аварийно выключить автовыплаты». Направление должно быть в режиме «Авто» или «Авто до лимита»; в карточке видно, почему заявка не ушла автоматом.
Без двойной выплаты — номер выплаты у Heleket (повтор возвращает ту же), одна выплата на заявку в базе, захват попытки одним запросом, «результат неизвестен» сам не повторяется. Ошибка выплаты — тревога в Telegram, повтор и «в кабинете выплаты нет» — в карточке заявки с кодом 2FA.
Ключ выплат Heleket — отдельное поле в карточке системы; расшифровывает его только фоновый обработчик.
Журналы входящих уведомлений и запросов к процессингу (без ключей), кнопка «Проверить соединение».
Автоматические резервы — «Настройки → Резервы» показывает по каждой монете остаток, сколько удержано под открытые заявки и сколько свободно. Заявка при создании удерживает сумму выдачи, отмена и истечение возвращают её, оплата пополняет резерв входящей монеты, «Готово» списывает выплату, отмена после оплаты снимает приход. Движение ведёт база по статусу заявки — кто бы его ни менял (оператор, таймер, будущий платёжный модуль). Вписанные раньше резервы стали остатком, открытые заявки сразу их удержали.
Нехватка резерва — если свободного резерва меньше суммы выдачи, заявка создаётся, но уходит на ручную проверку; в карточке заявки видно почему. Наружу свободный резерв не меньше нуля: при нуле монеты нет в файлах мониторингов.
Корректировка и журнал резервов — приход или расход вне заявок и сверка «ровно столько» с обязательным комментарием, остаток в минус не уходит; «Снять учёт» с причиной. Журнал движения: удержания, возвраты, оплаты, выплаты по заявкам (со ссылками) и корректировки сотрудников.
Файлы мониторингов и главная показывают свободный резерв (остаток минус удержанное), а не вписанную вручную цифру.
Чёрный список — «Заявки → Чёрный список»: карты, телефоны, кошельки и счета, адреса крипты, IP и подсети, почты. При совпадении — не создавать заявку, на ручную проверку или пометка. Сверка при создании заявки и при подтверждении оплаты (с адресом отправителя): «не создавать» и «на проверку» останавливают подтверждение, пока сотрудник не подтвердит ещё раз. Импорт списком (вид по строке, причина после «;»), журнал срабатываний, счётчик у каждой записи. Права «Чёрный список — смотреть / менять»; оператору выданы.
Проверка карт клиента — включается в «Настройки → AML и KYC»: клиент, который платит рублями с новой карты, присылает её фото на странице заявки (на трёх языках), оператор одобряет или отказывает с причиной в «Заявки → Проверка карт». Реквизиты для оплаты — после одобрения; одобренная карта больше не проверяется у того же клиента (того же аккаунта, у гостя — того же ФИО), чужой человек с тем же номером снова присылает фото. Оператор видит первые 6 и последние 4 цифры — как на фото. Уровни доверия из настройки — без фото, «подозрительный» — всегда с фото. Право «Проверка карт клиентов»; оператору выдано. Каждый просмотр фото — в журнале действий.
Выгрузка заявок в XLSX и CSV — кнопка «Выгрузить» в «Заявках»: текущий статус и поиск плюс период; суммы, курс, доход, расходы, реквизиты, ФИО, уровень доверия. Право «Выгрузка заявок»; в журнал действий пишется каждая выгрузка. CSV — с «;» для Excel, защищён от формул.
Выгрузка статистики — кнопка «Выгрузить» в «Статистика → Обзор»: листы «По дням» и «По направлениям», без личных данных.
Сайт для клиентов
Вкладки валют на главной — «Настройки → Дизайн → Оформление → Вкладки валют на главной»: владелец включает и выключает «Все валюты», «Банки РФ», «Стейблкоины», «Криптовалюту», «Платёжные системы», «Наличные». Если на сайте остаётся одна вкладка, вкладок нет и список показывает все монеты.
Исправлено: на вкладке «Стейблкоины» при «Отдаю USDT TRC20» в «Получаю» было «Ничего не нашлось» — вкладка фильтровала обе колонки, а направлений «стейблкоин → стейблкоин» нет. Теперь вкладка фильтрует «Отдаю», а в «Получаю» — всё, на что меняется выбранная монета. Выбранная вкладка больше не сбрасывается после выбора монеты.
Промокоды — в форме обмена «Есть промокод?» (или ссылка
/?promo=КОД): код улучшает курс заявки, курс в форме сразу пересчитывается. Скидка — «курс лучше на N п.п.» или «N % от комиссии», срок, лимит использований, на одно направление или на все. Со скидкой уровня доверия не складывается — действует большая. Один код — один раз на клиента (аккаунт, почта или адрес выплаты).Новости — лента
/newsи страница новости; ссылки в меню «Обмен» и в подвале (появляются с первой опубликованной).Свои страницы —
/p/<адрес>: «О нас», условия акции и т. п., по желанию — ссылка в подвале. Текст — markdown без HTML.Отзывы клиентов на сайте — блок на главной и страница
/reviewsсо средней оценкой. Показываются только отзывы, опубликованные модератором; почту клиента сайт не показывает, подпись — от модератора.Баннеры сверху сайта — строка над шапкой: акция, перерыв в работе. Сроки показа, ссылка; клиент может закрыть.
Всё — на русском, английском и китайском; пустой язык берёт русский.
Главная и свои страницы из конструктора — главная собирается из блоков «Конструктора страниц»; пока его не публиковали, она та же, что раньше. Страницы конструктора открываются по
/p/<адрес>, как страницы «Контента».Бонусы и конкурсы — в кабинете «Бонусы»: баллы за обмены, отзывы и приглашённых друзей, обмен баллов на кешбэк в USDT или личный промокод, история; конкурсы (топ по обороту, розыгрыш) — там же и на странице
/contests, участники в таблице под маской.Мгновенные обновления — статус заявки и ответы поддержки приходят сразу (Server-Sent Events) вместо опроса раз в 4–10 секунд; если поток не держится — прежний опрос.
«Контент и промо» — новости, страницы, баннеры, модерация отзывов и промокоды со статистикой по коду: заявок, выполнено, оборот и сколько стоила скидка. Новые права «Новости, страницы и баннеры», «Отзывы на сайте», «Промокоды».
Автораспределение заявок — «Заявки → Распределение»: новая заявка сразу получает ответственного среди операторов «В сети» — по нагрузке или по кругу, с лимитом открытых заявок на оператора. Все заняты — заявка ждёт первого освободившегося. «Мои» в меню заявок, колонка «Ответственный», в заявке — «Взять себе» и передать другому (право «Назначать заявки другим»).
Промокод в карточке заявки — код и на сколько он снизил комиссию.
Конструктор страниц — «Контент и промо → Конструктор страниц»: блоки (герой, форма обмена, шаги, «Почему мы», отзывы, новости, вопросы, текст, картинка, кнопка, «Нас рекомендуют»), порядок перетаскиванием или стрелками, тексты на трёх языках, предпросмотр на 1440/768/375 и на трёх языках (с несохранёнными правками), черновик, публикация, версии и откат одной кнопкой, снять с сайта. Картинки — PNG, JPEG, WebP, GIF до 1,5 МБ. Право — «Новости, страницы и баннеры».
Бонусы и конкурсы — «Контент и промо → Бонусы и конкурсы»: ставки баллов, награды (кешбэк на баланс кошелька или личный промокод), баллы клиентов с поиском и ручной правкой, конкурсы с таблицей участников (с почтой) и итогами одной кнопкой. Новое право «Бонусы и конкурсы». Личные промокоды из баллов в «Промокодах» не показываются.
Мгновенные обновления — счётчики меню, списки заявок, обращений и писем, колокольчик и окна о новом обновляются сразу по событию, а не раз в 15–30 секунд.
Миграция 0054 — таблицы конструктора (
site_layouts,site_layout_versions,site_images), бонусов (bonus_ledger,contests),promo_codes.user_id; триггер ставитorders.updated_atпри любой правке заявки (по нему наблюдатель мгновенных обновлений видит изменения от воркера и платёжного модуля).Caddy — потоки
/api/liveи/api/admin/liveне сжимаются (иначе события копятся в буфере). Через Cloudflare поток держится пингом каждые 25 с.Ступени процента по обороту — «Партнёры → Программа → Ступени по обороту»: чем больше оборот выполненных заявок рефералов партнёра за 30 дней, тем выше процент. Свой процент партнёра важнее ступени. Партнёр видит в кабинете свой оборот и до какой ступени осталось. Выплаты мониторингам ступени не меняют.
Безопасность
- Капча — «Настройки → Безопасность → Капча»: Cloudflare Turnstile или своя (цифры с картинки, без внешних сервисов) на заявке, входе, регистрации, обращении в поддержку и первом сообщении чата. По умолчанию выключена; на поддомене админки и в Telegram Mini App её нет. Секретный ключ Turnstile хранится зашифрованным.
- Вход по passkey (Face ID / Touch ID, WebAuthn) — меню профиля → «Ключи входа и телефон»: добавить ключ устройства (с кодом 2FA), несколько ключей, переименовать, отозвать; всё в журнале. На странице входа — «Войти по Face ID / Touch ID». «Сотрудники → Защита»: passkey выключен, вместо кода 2FA (по умолчанию) или вместо пароля и кода. Сброс 2FA сотрудника удаляет и его ключи.
- Подтверждение вторым человеком — «Сотрудники → Защита»: включить, срок ожидания, какие операции защищены (ключи платёжных систем, AML-провайдеров, почты и SMS; включение платёжных систем; лимиты и адреса выплат; автовыплата; роли и права; IP-доступ; отключение и сброс 2FA сотрудника; новый сотрудник). Защищённое изменение уходит в «Сотрудники → На подтверждении»: другой сотрудник с новым правом «Подтверждать защищённые операции» подтверждает своим кодом 2FA (сервер выполняет запрос от имени автора, с его правами на этот момент) или отклоняет с причиной; автор может отозвать. Ключи в очереди не видны, тело запроса хранится зашифрованным. Ослабить саму защиту — тоже через второго; включить её, когда подтвердить некому, нельзя. Уведомление «Операция ждёт подтверждения».
- Код подтверждения ручной выплаты — «Сотрудники → Защита»: порог в USDT и способы — код из приложения 2FA, письмо, Telegram, SMS. В карточке заявки перед «К выплате» — поле кода и «Выслать». Код подходит только к своей заявке, 10 минут, 5 попыток, не чаще раза в минуту; код 2FA — один раз на выплату. Модуль
lib/payout-code.tsвызывается и из автоматики выплат. - SMS — «Уведомления → Настройки → SMS»: SMS.ru или Twilio, ключ (только владелец, прочитать нельзя), отправитель, какие уведомления дублировать по SMS и на какие номера, проверочное SMS. Телефон сотрудника для кодов — в его профиле (с кодом 2FA).
Наличные по городам
- Валюты «наличные» — CASHUSD, CASHEUR, CASHRUB (коды BestChange) и направления USDT и BTC ⇄ наличные, заведены выключенными. Доллары наличными считаются один к одному к USDT, евро — по паре EUR/USDT (Binance, Bybit, CoinGecko), рубли — как банки.
- «Настройки → Курсы → Наличные» — города (код BestChange, названия на трёх языках, часовой пояс), офисы и курьер (адрес, часы, телефон, ссылка на карту, подсказка), направления по городам со своей комиссией и резервом. Всё в журнале действий; город или точку с заявками не удалить — только выключить.
- Форма обмена — у наличных направлений выбор города (курс — городской), на втором шаге точка встречи, время по местному времени города (от 30 минут до двух недель), телефон для связи и имя того, кто придёт. Наличные не выплачиваются на баланс кошелька и не попадают под лимиты карт.
- Страница заявки — карточка встречи (точка, адрес, часы, телефон, карта, время по городу, сообщение оператора), в чеке — «Ждём вас на встрече», «Наличные приняты», «Наличные выданы».
- Карточка заявки в админке — город, точка и время встречи, «Подтвердить встречу» вместо реквизитов у приёма наличных, перенос встречи, сверка паспорта перед «Оплачено» и «Готово».
- Файлы мониторингов — у наличных строка на каждый открытый город с тегом
<city>, курсом и резервом города (BestChange, Exnode и мониторинги в формате BestChange).
Telegram
- Заявка целиком в боте — кнопка «Заявка в чате» и /new: направление → город, точка и время встречи (для наличных) → сумма → адрес или реквизиты → согласие с условиями → заявка. «Мои заявки» и /orders — карточка со статусом, реквизитами и кнопками «Я оплатил», «Приложить чек» (фото или PDF до 8 МБ), «Обновить». Тексты на русском, английском и китайском.
- Тот же расчёт, что на сайте — бот не считает сам: каждое действие идёт через те же маршруты, что и сайт (курс, лимиты, KYC, реквизиты, «Я оплатил», чек). Лимиты считаются по telegram id клиента, а не по адресу бота. Заявка из Telegram, связанного с аккаунтом, ложится в аккаунт.
- Кнопки под сообщением о реквизитах — «Я оплатил» и «Приложить чек» прямо под уведомлением бота; у наличных в каждом сообщении — где и когда встреча.
Админка на английском
Язык админки — русский или английский: сотрудник выбирает в меню профиля («Язык», RU / EN), выбор хранится у него и одинаков на любом компьютере. На странице входа и приглашения — свой переключатель.
На английском уже меню и подменю, путь вверху страницы, меню профиля, вход и подключение 2FA, колокольчик и окна о новом, статусы и действия заявок, названия прав и ролей, ошибки сервера, общие кнопки и сообщения «Сохранено». Даты и числа — в формате языка. Экраны разделов пока по-русски — переведём одной волной.
Словарь терминов
docs/admin-glossary.md, инструкцияdocs/admin-i18n.mdи проверка непереведённых строк (pnpm --filter пакет i18n:admin, тест вpnpm test).Сайт документации docs.oneswaper.com — для покупателей движка (что это, требования к серверу, установка пошагово, переменные окружения, Caddy и Cloudflare, обновление, бэкапы и восстановление, здоровье и логи, безопасность, лицензия) и для владельцев и операторов (все разделы админки и настроек, сценарии «обработать заявку», «выплата», «ответ на обращение», вопросы и неполадки). Русский и английский, поиск, светлая и тёмная тема, телефон, планшет и ПК; цвета OneSwaper. Установщик одной командой, обновление из админки и лицензия помечены «скоро», невыкаченные функции — «следующая версия».
«Что нового» собирается сам из этой истории изменений при каждой сборке; внутренние имена и разделы для разработки в неё не попадают.
docs.<домен> в Caddy — сайт документации собирается внутри образа Caddy (
apps/docs, VitePress) и раздаётся статикой;04-deploy.shпроверяет, что сборка есть в образе, и печатает адрес. Перед выкаткой нужна запись DNSdocs(A, с прокси, как уadmin).
Продажа движка коробкой
Подписанная лицензия — ключ Ed25519, привязка к домену и номеру установки. Проверка раз в 6 часов, без связи — 30 дней работы. Просрочка мягкая: 0–7 дней только полоса, 7–21 закрыты обновления, с 21-го — пауза только новых заявок с сайта. Выплаты, админка и бэкапы работают всегда. Действует только в коробочной сборке, нашему серверу лицензия не нужна.
Сервер лицензий (
apps/license, отдельная машина):- админка продавца: покупатели, лицензии, оплата и продление, отзыв, установки и ручная проверка, релизы, журнал;
- кабинет покупателя: ключ, команда установки, домен, установки, файл лицензии, история версий;
- доступ к закрытому реестру образов — только пока открыты обновления.
Установщик одной командой (
install.sh) для чистой Ubuntu 22.04/24.04. Он проверяет:- систему и DNS;
- Cloudflare (определяет сам);
- подпись релиза.
Ставит Docker, файрвол и fail2ban, генерирует
.env, применяет миграции, создаёт владельца с 2FA. Есть--dry-run. Повторный запуск безопасен, сбой убирает созданное.Обновления из админки — «Настройки → Обновления»: версия, что нового, обновление и откат кнопкой, ход по шагам, история, автообновление исправлений в своё окно. Выполняет хост-агент
oneswaperd: у API нет доступа к Docker.oneswaperctl— командыstatus,logs,update,rollback,backup,restore,admin-ip,license,domain,cloudflare,doctor.Сборка коробки (
infra/release):- образы без исходников: один минифицированный файл, без тестов и sourcemap;
- манифест с дайджестами и подпись офлайн-ключом владельца;
- проверка, что в образах нет внутренних имён.
Чистка того, что видит покупатель:
- каталог
/opt/oneswaper, имена контейнеров и томов, базаoneswaper; - имя файла копии базы, строка бота;
- User-Agent курсов, ключи в браузере, подсказки в админке.
- каталог
1.10.0-beta — 2026-10-24
Демо-версия для покупателей движка
- «Справка → Возможности» — в демо-админке список всего, что умеет движок, по разделам и без дат: у каждой функции — как она работает и для чего нужна обменнику. Как «Что нового»: фильтр по разделу, поиск и оглавление. Ссылка «Возможности» — и в плашке демо на сайте, и у номера версии внизу меню.
1.9.0-beta — 2026-10-24
Курсы и деньги
- Выплаты мониторингам — у каждого мониторинга в его подразделе «Выплата мониторингу»: включить, от чего считать (% от комиссии, % от прибыли — как «30% от прибыли» у BestChange, или % от суммы обмена) и процент. Там же наша ссылка
?ref=<мониторинг>для их кабинета: клиент засчитывается мониторингу 30 дней, последний переход побеждает, с партнёрской программой клиентов не пересекается. - «Мониторинги → Выплаты» — отчёт за период: переходы, заявки, оборот, комиссия, прибыль, начислено, к выплате и долг за всё время. «Выплачено» — отметка на сумму начислений за период с комментарием, ошибочную можно снять. Всё в журнале действий.
- Чистая прибыль в статистике учитывает начисления мониторингам, как долю партнёров.
- Цена закупки в заявке — в карточке заявки оператор с правом «Выплачивать» вписывает, за сколько долларов (USDT) куплена 1 монета, которую отдаём клиенту; рядом подсказка: сумма закупки и спред сделки. Можно поправить или убрать — всё пишется в историю заявки. Цену дальше чем вдвое от рынка (лишний ноль, рубли вместо долларов) сохраняет только явное «Сохранить, цена верна»; у замороженной по AML заявки цену меняет только владелец, у отменённой её можно только убрать. Не вписана — считаем по рынку, как раньше. Видят цену те, кто выплачивает или смотрит юнит-экономику.
- Юнит-экономика: спред — плитка «Спред» и график «Спред (средний %)» по дням с выбором периода: (наш курс − цена закупки) / цена закупки. У графика — сколько сделок посчитано по цене закупки, остальные по рынку; дни без сделок — разрыв. Спред и в таблице направлений, и у каждой сделки.
- Прибыль по цене закупки — где цена вписана, прибыль сделки, доход и маржа в юнит-экономике и «Обзоре» считаются от неё, а не от рынка.
Партнёры
- Партнёр сам добавляет пользователей — в кабинете «Партнёрская программа → Пользователи» вводит почту. Человека ещё нет на сайте — создаётся кабинет и уходит письмо «задать пароль» (ссылка на 7 дней); задав пароль, он закреплён за партнёром. Уже есть — уходит приглашение, человек принимает или отклоняет его в кабинете. Ответ партнёру одинаковый, по нему не узнать, есть ли человек на сайте; не больше 20 приглашений в сутки.
- Заявки пользователя засчитываются его партнёру и без ссылки — даже если клиент пришёл по чужой ссылке.
- Партнёр не зарабатывает на своих же заявках с другого аккаунта — если адрес выплаты, карта плательщика или IP заявки совпали с партнёрскими (его реквизиты, выводы, его заявки, входы), процент не начисляется. Партнёр таких заявок не видит, в админке они в окне партнёра с причиной, в списке — «свои: N».
- Переход к другому партнёру — только с согласия пользователя: приглашение от нового партнёра показывает, у кого он сейчас; сотрудник может отвязать пользователя в админке.
- Две схемы начисления — % от нашей комиссии или % от оборота (суммы заявки в $, но не больше нашей комиссии). Работает одна: общая в «Программе», своя у партнёра, исключение для отдельного пользователя.
- Настройки партнёра в кабинете — имя в приглашениях (почту партнёра не показываем), своя метка ссылки вместо кода (
?ref=IVAN), сохранённые реквизиты вывода, автовывод от заданной суммы, письмо о каждом начислении. - Админка «Партнёры» — схема и доля от оборота в «Программе», в списке — условия и число пользователей; по нажатию на партнёра — окно по центру: его схема и процент, пользователи с исключениями и отвязкой, приглашения. Изменения — в журнале.
Уведомления в админке
- Окно о новом в углу админки — сообщение клиента в поддержке, новая заявка и «Клиент оплатил» всплывают стопкой карточек (по устройству notification-stack): видна верхняя, за ней края остальных, наведение или «Показать все» раскрывает список. В карточке — «Перейти в диалог» или «Перейти в сделку» и «Закрыть»; «Закрыть все» убирает стопку. Каждый видит только то, на что у него права (заявки или поддержка).
- Звук на каждое сообщение клиента в поддержке, на «Я оплатил» и на новое письмо — по режиму «Звук заявок» в меню профиля; при выключенном звуке или в другой вкладке мигает заголовок. Раньше звенело только на новую заявку и новое обращение.
Сверка платежей
- «Заявки → Сверка платежей» — по каждому поступлению (оплаченная заявка или зачисленное пополнение кошелька): клиент, откуда пришли деньги, терминал, № заявки, сумма, платёжная система, внешний ID. Поиск по почте, номеру, карте, хэшу и терминалу, период.
- История клиента по клику на имя — окно по центру: дата, время до секунд, № заявки, сумма операции, статус ПС, сумма по ПС, ID провайдера (ведёт на сделку), URL провайдера, внешний ID. Гостевые заявки на подтверждённую почту аккаунта — там же, при неподтверждённой — отдельно с пометкой «совпадает почта, не подтверждено».
- Данные ПС у ручных заявок вписывает оператор — система, откуда, терминал, ID и ссылка провайдера (только https), внешний ID, статус и сумма. Пустое поле — снова то, что знает сайт; каждая правка — в журнале заявки. Что прислал модуль (WestWallet), руками не меняется. Адрес отправителя и хэш из отметки «оплачена» попадают в сверку сами.
- Новое право «Сверка платежей» в ролях, в заготовке «Финансы» оно уже стоит.
Демо-версия для покупателей движка
- demo.oneswaper.com — демо-версия обменника: тот же сайт и та же админка (
/admin) с правдоподобными данными за три месяца — 40 клиентов с обычными именами, около 250 заявок во всех статусах, отзывы, обращения в поддержку, партнёры с переходами, посетители; графики статистики живые, курсы живые с бирж. Каждую ночь данные возвращаются к исходным. - Вход только по выданному логину — покупатель заходит и на сайт как клиент, и в админку как владелец; роль меняется сама по адресу, внизу плашка «Сайт / Админка» и срок доступа. Без логина в демо ничего не открывается.
- «Справка → Демо-доступ» в админке (только владелец): выдать логин на срок (по умолчанию 7 дней), продлить, отозвать. Пароль показывается один раз — готовый текст со ссылкой копируется и пересылается покупателю.
- Демо отделена от боевой: своя база и свои ключи, своя сеть; логины передаются в демо только на чтение. В демо не уходят письма, Telegram, вебхуки, не работают AML, бэкапы и платёжные ключи; нет документации проекта и описания API; сотрудников, роли и безопасность можно только смотреть.
- Выкатка обновляет и демо —
04-deploy.shпосле боевой выкатки зовёт05-demo.sh.- upd 1.9.0: исправлено — в пустой базе демо не стартовал воркер (pg-boss не мог создать свои таблицы); право CREATE даётся роли приложения только на первый запуск и сразу забирается.
Сервер
- Ключи из
.envбольше не попадают в образы Docker (.dockerignore): раньшеCOPY . .клал.envвнутрь образа. - Конфиг Caddy проверяется до перезапуска — с ошибкой в нём выкатка остановится, а сайт продолжит работать.
1.8.0-beta — 2026-10-23
Новый личный кабинет с кошельком и «Что нового», мониторинги с лентой «Нас рекомендуют», почта на своём домене, провайдеры AML/KYC и резервы в админке. Кошелёк клиентов включён.
Админка
- Иконки во всём меню админки — у каждого пункта и подпункта: статистика, заявки по статусам, поддержка, люди, партнёры, кошелёк, журнал, настройки и документы.
- Нажатие на название сразу открывает раздел и раскрывает его список, стрелка справа отдельно сворачивает и разворачивает — и у «Настроек», и у их разделов.
- Меню не прыгает наверх при переходе — прокрутка меню, кто вошёл и счётчики сохраняются между страницами админки, экран не пустеет.
- Направления с иконками и сетью — «Альфа-Банк
RUB→ BTCBTC»: у каждой монеты сеть, даже родная, у банков и монет — значок, как на сайте. - Курс понятным числом — «1 BTC = 6 745 208 RUB» вместо 1.48e-7.
- Коды Exnode — список как на сайте — раскрывается под полем, с поиском и без размытия; свой код можно ввести в поиск и выбрать.
- Окна по центру экрана — «Создать роль», карточка человека и настройка платёжной системы открываются по центру, а не выезжают сбоку или снизу.
- Вкладки везде одного вида — «Кошелёк», «Партнёры» и «Люди» в админке теперь с такими же вкладками-пилюлями, как подразделы «Настроек».
- «Настройки → Резервы» — свой раздел: резервы по монетам (отсюда их берут BestChange и Exnode) и цифры блока «Почему OneSwaper» на главной.
- «Настройки → Мониторинги» (бывшие «Агрегаторы») — «Все» и у каждого мониторинга свой подраздел: BestChange, Exnode, Kurs Expert, OKchanger, Glazok, ExchangeSumo, Change PRO, Holder, WellCrypto. В подразделе — «Мы размещены», ссылка на нашу страницу у них, свой логотип, файл курсов и условия листинга с адресом заявки. Новый мониторинг добавляется одной строкой в общий список — подраздел появляется сам.
- Файл курсов для Kurs Expert, OKchanger, Glazok и ExchangeSumo — в формате BestChange, у каждого свой адрес
/api/export/<мониторинг>.xmlи свой включатель. - Лента «Нас рекомендуют» собирается сама — на главной мониторинги, где включено «Мы размещены» и есть ссылка, затем «Другие площадки» (форумы, каталоги). Из «Дизайна» лента убрана; уже включённые площадки перенесены.
- «AML и KYC → Провайдеры» карточками — AMLBot, Crystal, Bitok, Elliptic, Sumsub и «Оператор»; ключи вводятся в админке и хранятся зашифрованными. AMLBot работает сразу: сайт и воркер берут ключ из админки, иначе из .env. Остальные — хранение ключей до подключения.
- Админка и кабинет не выкидывают на вход при сбое связи — только когда сервер ответил «не вошёл»; при перезапуске сервера запрос тихо повторяется.
- «Люди»: две вкладки — 1 «Пользователи» (бывшие «Клиенты»: все с выполненной заявкой), 2 «Посетители»; вкладка «Зарегистрированные» убрана.
- Адрес /account ведёт в кабинет — главная личного кабинета (см. «Личный кабинет»); гостя — на вход. Раньше там была страница 404.
- «Личный кабинет» в меню аккаунта — всегда первым, «Кошелёк» — сразу после него, если кошелёк включён; вкладка больше не запоминает «кошелёк выключен» до перезагрузки.
Личный кабинет
- Новая главная кабинета по устройству Antarctic Wallet, в наших цветах — шапка с именем (ведёт в профиль) и кнопкой-подарком (партнёрская программа), лента «Что нового», четыре плитки «Пополнить баланс», «Вывести активы», «Обменять активы», «Сканировать QR-код», карточки «Активы и кошельки» (итог в $, по нажатию — список монет) и «Кешбэк и баллы» (процент и сколько получено, по нажатию — окно с пояснением), последняя заявка и «Сервисы» сеткой иконок с «Все →». Адреса /account и /account/wallet открывают её.
- Нижняя панель на телефоне — «Главная», «История», сканер QR в центре, «Сервисы», «Профиль»; на планшете и ПК — та же главная по центру без панели. Чат поддержки поднимается над панелью.
- Новые страницы кабинета — «Активы и кошельки», «История» операций, все «Сервисы» с пояснениями, «Профиль» (почта, уровень проверки кошелька, язык, тема, выход).
- Кошелёк выключен — кабинет всё равно работает: плитки «Новый обмен», «Мои заявки», «Найти заявку», «Поддержка», последняя заявка и сервисы, без баланса.
- «Что нового» — карточки-сторис новостей и обновлений в начале кабинета: по нажатию окно по центру с картинкой, текстом и кнопкой, листается стрелками. Новые для клиента карточки обведены рамкой, открытые — без неё (у каждого клиента своё). Язык карточки — язык сайта, пустой берёт русский.
- «Настройки → Дизайн → Что нового» — карточки создаёт и меняет владелец или роль с правом «Дизайн — менять»: заголовок, текст и подпись кнопки на русском, английском и китайском, картинка PNG/JPG/WebP до 1 МБ (тип проверяется по содержимому), ссылка на страницу сайта или https-адрес, порядок, «показывать» и сколько клиентов открыли; предпросмотр карточки и окна. «Дизайн» разделён на «Оформление» и «Что нового». Все изменения — в журнале действий.
Почта на своём домене
- «Настройки → Почта → Ящики» — свои адреса на домене: info@, support@ и любые другие. У каждого ящика — куда идёт письмо: лента «Входящие» в админке, уведомление «Письмо на ящик» (Telegram и колокольчик — по настройкам в «Уведомлениях»), тикет поддержки. Письма на адреса не из списка — не принимать или в «Другие адреса».
- Приём через Resend, без своего почтового сервера — MX-запись домена ведёт на Resend, он присылает письмо вебхуком, текст забирается по API-ключу Resend (если SMTP уже через Resend — подходит его пароль). На странице — какие DNS-записи добавить и кнопка «Проверить DNS».
- «Почта → Входящие» — новый пункт меню с непрочитанными по ящикам: список, чтение, ответ с адреса ящика, «не прочитано», «спам». Новое право «Почта: входящие письма» — по умолчанию только у владельца.
- support@ → тикет — письмо клиента становится обращением с канала «почта»; ответ оператора из тикета уходит клиенту письмом с support@ (тема с «[#номер]»), ответ клиента на это письмо ложится в тот же тикет.
- Защита — вебхук принимается только с подписью Resend (секрет хранится зашифрованным), письмо больше 256 КБ в вебхуке и 4 МБ у Resend не читается; HTML письма не показывается и не хранится — только текст; вложения не скачиваются (видно имя и размер). Не прошла подпись отправителя (DMARC) или больше 20 писем в час с одного адреса — «спам»: без тикета и уведомлений; тикетов с почты — не больше 30 в час, уведомлений о письмах — не больше 10 за 5 минут. Дописать письмо в существующий тикет по «[#номер]» в теме и привязать новый тикет к аккаунту клиента можно только при подтверждённой подписи отправителя (DMARC или DKIM): подделанный From не попадёт в чужую переписку.
1.7.0-beta — 2026-10-23
Кошелёк клиента, свои роли с правами, новое меню «Настроек», расходы и чистая прибыль, уведомления по событиям, уровни доверия, почта и Exnode.
Курсы и направления
- Массовое редактирование проще — комиссию и «серый» процент вводят сразу числом (пусто — не менять, галочка — убрать «серый» курс), без выбора «поставить / прибавить / убавить».
- Мин. и макс. в массовом редактировании работают при разных монетах — раньше поля отключались, если у выбранных направлений разные монеты «отдаю». Теперь у каждой монеты своя строка мин/макс, всё меняется одним разом или ничего.
- Понятные названия в списке направлений — «Альфа-Банк
RUB→ BTC», «USDTTRC20→ СбербанкRUB» вместо внутренних кодов вроде ACRUB.
Интерфейс и оформление
- Название без точки — в шапке, подвале, на входе и в приглашении название показывается ровно так, как задано в «Настройки → Дизайн».
Настройки
- Новое меню «Настроек» по разделам — Курсы (Направления, Парсинг), Платёжные системы (Платежи, Способы оплаты, Банки РФ), Расходы, AML и KYC (Настройки, Провайдеры), Сотрудники (Добавить сотрудника, Сессии, Вход в систему, Настройка), Уведомления (Уведомления, Вебхуки, Логи), Бэкапы (Копии, Настройки), Юридические, Агрегаторы (BestChange, Exnode — скоро), Почта (скоро), Безопасность (Доверие клиентов, Злоупотребления), Дизайн. Подразделы — вкладками на странице и под открытым разделом в меню слева; адрес
/admin/settings/<раздел>/<подраздел>, старые ссылки и закладки ведут на новые места. - «Сохранить» только когда есть что сохранять — на всех страницах настроек (и в настройках поддержки) кнопка появляется после правки и исчезает после сохранения или отката правки.
- Кнопка «Наверх» — на длинных страницах админки внизу справа, появляется после прокрутки больше экрана.
- Логи уведомлений — все отправки в Telegram и журнал доставок каждого вебхука на одной странице.
- «Настройки → Почта» — почтовый сервер для писем клиентам прямо из админки: хост (например smtp.resend.com), порт 465/587, логин, пароль, email и имя отправителя (по умолчанию — название из «Дизайна»), HELO/EHLO. Свой адрес «От кого» для групп писем: аккаунт, шаги заявки, проверочные. Шаблоны: тема и HTML каждого письма клиенту (подтверждение почты, новый пароль, кабинет по заявке, ссылка на заявку, четыре шага заявки) на трёх языках, с переменными
{{link}},{{order_number}},{{amount_in}}и др. и предпросмотром; общий макет всех писем. Значения из заявки в HTML экранируются. «Отправить тестовое письмо» отправляет сразу и показывает ответ почтового сервера. Если хост не задан, работаютSMTP_*из.env, как раньше. Кодов в письмах нет: подтверждение и сброс пароля по-прежнему по ссылке. Сменили хост, порт или логин — сохранённый пароль стирается, его вводят заново (иначе пароль можно было бы «вынести» на свой сервер). На сервере STARTTLS обязателен на 587/2525/25, почтовый сервер во внутренней сети не принимается — адрес проверяется в момент каждой отправки. Свой общий макет обязан содержать{{content}}. - Секреты из админки зашифрованы — пароль SMTP и ключи платёжных систем хранятся в базе зашифрованными (AES-256-GCM, ключ
SETTINGS_SECRETв.env, не короче 16 символов). В админке видно только «Настроено»: секрет можно задать, заменить или удалить, но не прочитать. В журнал пишется только имя секрета и действие. БезSETTINGS_SECRETсекреты не сохранить — работают ключи из.env. Новой миграции нет. - «Платёжные системы» карточками — возврат после оплаты (URL после успешной и неуспешной оплаты) и карточки систем по группам: криптовалюта (WestWallet, Cryptomus, Heleket, CryptoCloud), рублёвый эквайринг (ЮKassa, CloudPayments, Т-Банк), P2P (TabPay, WATA, Pally, Lava, CardLink). «Настроить» открывает окно: способы оплаты, ID магазина, секретные ключи, URL API, комиссия своими словами. Подключена к сайту пока только WestWallet — её ключи из админки работают (включатель, проверка «Здоровья»); у остальных — хранение ключей до подключения. Ключ из админки важнее ключа из
.env; удалили ключ у включённой системы и ключей не осталось — она выключается. - «Настройки → Расходы» — что стоит каждая заявка: комиссия сети за выплату (по каждой сети), платёжная система (% за приём, % и фикс за вывод), банк по рублям и юаням (% и фикс), AML-проверка (цена одной), запас на курсовую разницу (%). У каждого расхода — кто платит: «Площадка» (цена не меняется) или «Клиент» (заложено в цену: проценты — к комиссии направления, фиксированное — вычет из суммы к получению; так же в курсе на сайте, в заявке и в файле BestChange —
tofee). По умолчанию всё по нулям на площадке. Расходы запоминаются в заявке при создании (миграция 0035). Доля партнёра считается с дохода без расходов, которые оплатил клиент (они не наш доход). Если цены валюты выплаты нет и фиксированное клиенту вычесть нельзя, оно записывается на площадку. - Уровни доверия — свои — «Настройки → Безопасность → Уровни доверия»: сколько угодно уровней с названием, кодом и порядком (добавить, удалить, поднять/опустить). Условия уровня: обменов не меньше, обменял на сумму (USDT), дней с первого обмена, подтвердил почту, привязал Telegram, прошёл KYC, не бросал заявки после выдачи адреса (не больше N), AML без среднего и высокого риска. Что даёт: сумма обмена до (выше — отказ), ручная проверка от суммы (или каждая заявка), документы от своей суммы (или общий порог, или не спрашивать), курс лучше на N % (минус к комиссии, на сайте и в заявке). Первый уровень «Новый» — без условий. «Подозрительный» — поверх всех: ручная отметка сотрудника и авто-правила (высокий AML, заявок за сутки, страны), каждое включается отдельно. Пересчёт каждую ночь (воркер), при заявке и кнопкой «Пересчитать сейчас»; вверху — когда пересчитано и сколько клиентов на каждом уровне. Нынешние уровни, лимиты и правила переехали как были (миграция 0037).
- «Настройки → Агрегаторы → Exnode» — файл курсов для мониторинга Exnode по их формату (exnode.ru/info/rates):
/api/export/exnode.xml, собирается на каждый запрос (монитор спрашивает каждые 10 секунд), без кэша. Курсы те же, что на сайте и в файле BestChange (комиссия и расходы клиента, фиксированное — вtofee), лимиты из направлений, резервы общие из раздела BestChange. Коды валют Exnode подставляются сами (USDT TRC20 →USDTTRC, ERC20 →USDTERC, банки — как у BestChange); если валюты нет в их списке — направление не попадает в файл, свой код вписывается на странице. Меткиmanualиveryfying(так в их спецификации),floatingне ставим — наш курс держится в заявке. На странице — включатель, ссылка на файл, что сейчас в файле, готовность к листингу и ссылка «Мы на Exnode» в подвале (без картинки с их сайта). Изменения — в журнале действий. Общее с BestChange (сбор направлений, формат<rates>) вынесено, а не скопировано. Два наших тикера под одним кодом Exnode не сохранить (иначе под именем одной монеты ушёл бы курс другой); замены для валют, которых у нас нет, не хранятся. - Переход с мониторинга сразу на направление — ссылка вида
/?cur_from=BTC&cur_to=SBERRUBоткрывает форму обмена с этим направлением (адрес становится/exchange/BTC-SBERRUB). Понимает коды BestChange и Exnode (USDTTRC,USDTERCи свои коды из раздела Exnode, регистр не важен), партнёрский?ref=в той же ссылке тоже засчитывается. Неизвестный код или направления нет — обычная главная без ошибки, параметры из адреса убираются. Пункт в готовности к листингу Exnode отмечен. - Мониторинг не попадает в автобан — пока файл курсов BestChange или Exnode выключен, он отвечает «не найдено», а робот спрашивает его каждые 5–10 секунд; такие ответы больше не считаются признаком сканера.
- Суммы в предпросмотре файла без хвостовых нулей — «0.0005 – 1 BTC» вместо «0.000500000000000000 – 1.000000000000000000».
- Постоянные расходы — там же: сервер, подписки, реклама, зарплаты, юрист, банк, налоги. Разовые и ежемесячные (в тот же день каждого месяца, можно с датой конца), в USDT или рублях (пересчёт по курсу на момент записи). Добавление и удаление — в журнале действий. Ежемесячный с 29–31 числа не «уплывает» на другой день.
- «Настройки → Уведомления» (раньше «Интеграции и уведомления») — три подраздела: Уведомления, Настройки, Логи. В «Уведомлениях» сверху общий чат и топик Telegram, ниже события группами (заявки, AML и KYC, поддержка, партнёры, система, безопасность) карточками с иконкой и включателем. В «Настроить» у события — свой Chat ID и Topic ID (пусто — общий чат и топик), колокольчик в админке и «Проверить чат». Бэкапы уходят в общий чат и топик.
- Новые события: новое обращение в поддержку, ответ клиента в обращении, смена поддержки (оператор сам вышел на линию или ушёл с неё). Оператор видит события поддержки в колокольчике, по нажатию — карточка обращения. Защита от спама: ответ клиента в одно обращение — не чаще раза в 5 минут, всего событий поддержки в Telegram — не больше 10 за 5 минут (вебхуки получают всё). Если Telegram просит подождать (429), ждём столько, сколько он сказал, и попытку не засчитываем.
- Логи — журнал всех уведомлений сотрудникам: Telegram (в какой чат и топик), вебхуки (адрес, код ответа, время), колокольчик; фильтры по каналу, статусу и событию. Вебхуки и уведомления клиентам — в «Настройках». Прежние настройки переносятся сами (миграция 0036).
Сотрудники и доступ
- Свои роли с правами — «Настройки → Безопасность → Роли и доступ»: карточки ролей (название, описание, активна, участники, права по разделам «Заявки 4/7»), окно «Создать роль» с быстрым стартом («Оператор», «Финансы», «Администратор»), права группами с «Выбрать все» и участниками. Создание, правка и удаление роли, перевод сотрудников — в журнале действий со старым и новым значением. Роль с участниками не удаляется — сначала переведите их.
- Права проверяет сервер на каждом маршруте — 45 прав: страницы статистики по отдельности; заявки (смотреть, выдавать адрес, менять статус, выплачивать, AML/KYC и чеки, решения KYC, замороженные); поддержка (тикеты, назначение другим, шаблоны, база знаний, журнал, настройки); люди и доверие к клиентам; партнёры (смотреть, выплаты, условия); журнал действий, все события, инциденты; каждый раздел настроек — «смотреть» и «менять» отдельно; «Сотрудники и роли». Меню и экраны показывают только доступное; без прав на заявки админка открывает первый доступный раздел.
- Оператор — встроенная роль с ровно прежними правами; всем нынешним операторам она проставлена сама (миграция 0038), у них ничего не меняется. Встроенную нельзя удалить или отключить, права поправить можно. Владелец может всё и роли не имеет.
- Роли раздаёт не только владелец — сотрудник с правом «Сотрудники и роли» приглашает и ведёт сотрудников и роли, но только в пределах своих прав: не выдаёт прав, которых нет у него самого, не трогает владельцев, свою роль и тех, у кого прав больше.
- Адреса отдела (VPN) — у роли свой список IP: участников пускает с адресов роли и с их личных. Меняет только владелец; адреса роли тоже открывают ворота поддомена админки.
- Отключённая роль — её участники остаются без прав, пока роль не включат.
- Колокольчик и лента событий — по правам роли — сотрудник видит только события своих разделов (заявки, поддержка, AML/KYC, кошелёк); отключённая роль — ничего.
- Меню настроек ведёт только туда, куда есть доступ — первый доступный подраздел, плашка «Только просмотр» во всех разделах.
Кошелёк клиента
- Основа учёта кошелька — балансы клиентов по монетам (USDT всех сетей — один баланс, рубли всех банков — RUB) с двойной записью: каждая операция — проводка, по каждой монете сумма строк равна нулю, база проверяет это сама при сохранении. Остаток меняется только проводкой, клиентский счёт не уходит в минус, повтор запроса с тем же ключом второй раз деньги не проводит, операции и строки только дополняются (миграция 0039). Клиенту пока не виден: экраны — следующие этапы.
- Настройки кошелька — главный выключатель и каждая функция отдельно (пополнение, вывод, обмен внутри, переводы клиентам, рубли, выплата на баланс, кешбэк, баллы), защита вывода (2FA, пауза после смены пароля/почты/2FA, белый список адресов с задержкой, ручное одобрение выше суммы, лимит в сутки), кешбэк и комиссии. По умолчанию всё выключено, меняет только владелец, с записью в журнал. Пока через API, экран — позже.
- Сверка — владелец видит, сходятся ли остатки со строками и сколько всего должны клиентам по каждой монете.
- Кошелёк в личном кабинете —
/account/walletи пункт «Кошелёк» в меню аккаунта (только когда кошелёк включён): «Всего на балансе» в $, кнопки «Пополнить», «Вывести», «Обменять», «Сканировать QR» (последние три — «скоро»), монеты с балансом и оценкой в $, история операций со ссылками на заявки и «Показать ещё». - Обмен на баланс — в форме обмена у клиента с аккаунтом переключатель «На адрес / На баланс»: на баланс адрес не нужен, а при «Готово» оператора сумма зачисляется на баланс сама, без хэша. Кнопка «Пополнить» в кошельке открывает форму сразу с «На баланс». В заявке, чеке и карточке заявки в админке — «Баланс кошелька» вместо адреса. Пока только для монет, рубли на баланс — позже (миграция 0040).
- Кешбэк — клиенту с аккаунтом за каждую выполненную заявку (на адрес или на баланс) — процент от нашего дохода в USDT на баланс; доход считается как для партнёров. Партнёр получает свою долю отдельно.
- «Настройки → Кошелёк» — главный выключатель, обмен на баланс, кешбэк с процентом и сверка: сходится ли учёт и сколько должны клиентам по монетам.
- Вывод с баланса — кнопка «Вывести» в кошельке: монета и сеть, адрес из адресной книги, сумма с комиссией, код 2FA. Сумма с комиссией сразу блокируется; оператор нажимает «Беру в отправку», переводит монеты вручную и вписывает хэш в новом разделе админки «Кошелёк → Выводы». После «Беру в отправку» вывод уже не вернуть на баланс — ни клиенту, ни «Это не я», ни другому оператору (иначе монеты ушли бы и остались на балансе). Отказ до этого шага возвращает сумму. Клиент может отменить вывод, пока его не одобрили; удалил адрес из книги — ждущие выводы на него отменяются (миграция 0041).
- Защита вывода (каждая — в «Настройки → Кошелёк»): 2FA обязательна (без неё — код из письма, если 2FA не обязательна); пауза после смены пароля, почты или 2FA (24 ч); только на адреса из книги — новый адрес подтверждается ссылкой из письма и работает через задержку; лимит выводов за сутки; ручное одобрение дороже порога, первого вывода на новый адрес и «подозрительных» клиентов. Комиссия вывода — по монете и сети, фикс + процент. Ошибка в сумме или нехватка денег не тратит код 2FA.
- «Это не я» — в письме о каждом выводе ссылка: кошелёк замораживается, ждущие выводы отменяются, владельцу уведомление. Разморозить — владелец в «Кошелёк → Замороженные».
- 2FA для клиентов — подключение с QR прямо на странице вывода; вход клиента с включённой 2FA просит код из приложения; о включении 2FA приходит письмо. Код при выводе принимается один раз (подсмотренный не повторить), пять неверных подряд замораживают кошелёк. Код из письма — пять попыток на вывод, параллельными запросами не обойти.
- «Готово» заявки на баланс — только владелец — «Готово» без хэша само создаёт деньги на балансе, поэтому оператор доводит такую заявку до выплаты, а владельцу приходит уведомление «Заявка на баланс ждёт владельца». Выключается в настройках.
- Новые уведомления — «Вывод с кошелька», «Заявка на баланс ждёт владельца», «Клиент заморозил кошелёк», «Крупный перевод между клиентами».
- Обмен внутри кошелька — кнопка «Обменять»: монета на монету с баланса на баланс по курсу сайта (направление между монетами, его комиссия и наценка из настроек), без комиссии сети. Котировка видна до обмена; если курс за это время ухудшился — обмен не проходит и просит проверить сумму. Повтор нажатия не меняет второй раз.
- Переводы между клиентами — кнопка «Перевести»: клиенту OneSwaper по номеру кошелька (8 знаков) или почте, мгновенно, с комиссией из настроек. Дороже порога — с кодом 2FA; лимит в сутки общий с выводами; пауза после смены данных входа и заморозка действуют и здесь. Получателю — письмо (без почты отправителя), в истории у обоих — «Перевод кошельку / от кошелька …» с комментарием. Перевод — от $1 (пылью нельзя засыпать получателя письмами). Крупные переводы — уведомление владельцу (миграция 0042).
- «Получить» и «Сканировать QR» — номер своего кошелька и QR со ссылкой (можно указать монету и сумму): камера телефона откроет перевод на этот кошелёк. Сканер в браузере читает такой QR и открывает перевод, а адрес чужого кошелька предлагает добавить в адресную книгу; где браузер не умеет читать QR — подсказка открыть его камерой телефона.
- Пополнение криптой — кнопка «Пополнить»: личный адрес клиента в выбранной сети и QR, адрес закреплён за клиентом навсегда. Адреса выдаются из пула, который владелец загружает в новом разделе «Кошелёк → Пополнения». Поступление оператор отмечает там же (адрес, хэш, сумма; один хэш — один раз), после проверки деньги зачисляются; по настройке зачисляет только владелец. Клиенту — письмо «баланс пополнен». Подключение процессинга с API (WestWallet и т. п.) — одним адаптером, когда будут ключи (миграция 0043).
- Рубли на балансе — пополнение рублями заявкой: банк, сумма, карта плательщика и ФИО; оператор даёт реквизиты, клиент нажимает «Я оплатил», оператор сверяет поступление и зачисляет сумму, которая пришла на самом деле. Границы суммы, лимит в сутки и не больше трёх открытых заявок — в настройках. Вывод рублей — только на карту из адресной книги с ФИО владельца. Рубли — в обмене внутри кошелька и в выплате заявки на баланс.
- Комиссия пополнения — по монете и сети (у рублей — по банку), вычитается из пришедшей суммы; настраивается рядом с комиссией вывода.
- Кошельки клиентов в админке — «Кошелёк → Кошельки»: клиенты с балансами (сначала самые крупные), поиск по части почты или номеру кошелька, уровень KYC и пометка «заморожен». Карточка клиента: балансы (доступно и заблокировано), последние 100 операций, выводы, адресная книга и проверки KYC.
- Заморозка из карточки — «Заморозить» с причиной может и оператор: выводы и переводы закрыты, ждущие выводы отменяются и деньги возвращаются на баланс. Разморозить — только владелец; счётчик неверных кодов 2FA при этом обнуляется.
- Корректировка баланса — только владелец, в карточке клиента: плюс — зачислить, минус — списать (не больше доступного; до 8 знаков после запятой), с обязательной причиной. Проводка со счёта «корректировки», в журнал действий, владельцу уведомление «Корректировка баланса клиента», клиенту письмо. Двойной клик не проведёт её дважды.
- «Сверка» на отдельном экране — «Кошелёк → Сверка» (владелец): сходится ли учёт и по каждой монете — сколько должны клиентам ↔ сколько монет на наших кошельках (остаток горячего и холодного кошелька вписывает владелец) и хватает ли. В «Настройки → Кошелёк» осталась строка «учёт сходится» со ссылкой.
- Уровни проверки (KYC) кошелька — по умолчанию выключены и ничего не ограничивают; включаются в «Настройки → Кошелёк → Уровни проверки». Уровень 0 — почта подтверждена, 1 — документ и селфи (проверка по заявке тоже даёт уровень 1), 2 — документ об источнике средств и пояснение. Для каждого уровня — лимит выводов и переводов за 30 дней (по умолчанию $1000, $10 000, без лимита) и с какого уровня можно переводить клиентам (по умолчанию с 1-го).
- Проверка личности в кошельке — у клиента блок с уровнем, сколько из лимита потрачено и кнопкой «Пройти уровень»: загрузка документа и селфи (или подтверждения источника средств), статус «на проверке», причина отказа. Выше лимита вывод и перевод не проходят с понятным текстом.
- «Кошелёк → KYC» — документы клиентов: уровень 1 одобряет или отклоняет (с причиной) оператор, уровень 2 — только владелец. Каждый просмотр файла — в журнал, клиенту письмо с решением, владельцу уведомление «Клиент прислал документы для кошелька».
- Документы кошелька (черновики для юриста) — «Условия кошелька» (хранение, пополнение, вывод, обмен внутри, переводы, комиссии, заморозка, «Это не я», ответственность), «Политика AML/KYC кошелька» (уровни проверки, отказ и заморозка по 115-ФЗ, хранение данных 5 лет) и «Риски хранения» (не банк и не вклад, 161-ФЗ и 115-ФЗ, риск хранителя, курс, взлом, налоги) — сразу на русском, английском и китайском. Каждый помечен черновиком; вопросы юристу отмечены в тексте [ЮРИСТ: …], в админке видно, сколько их осталось. Правятся в «Настройки → Юридические тексты» рядом с офертой; пока кошелёк выключен, их видят только сотрудники.
- Согласие при первом открытии кошелька — короткая выжимка, ссылки на три документа и галочка «Принимаю». Без согласия вывод, обмен, переводы, «Получить» и обмен на баланс закрыты и на сайте, и в API. Хранится, кто, когда, с какими редакциями, на каком языке, с какого IP согласился (только добавление, миграция 0045). Новая русская редакция любого документа или новая редакция перевода, который клиент принял, — согласие спрашивается снова («Документы обновились»). Повторные нажатия не плодят записей; ответ с документами кошелька не кешируется. Переключатель «Требовать согласие» — в «Настройки → Кошелёк», по умолчанию включён.
- KYC кошелька — по правам на KYC, выводы и пополнения — по праву «Выплачивать».
- Вывод на адрес подозрительного аккаунта — на проверку при любом регистре адреса, по адресам из заявок, выводов и адресной книги, а также если баланс пришёл переводом от подозрительного.
Статистика
- Чистая прибыль — новый блок на «Обзоре»: доход минус расходы выполненных заявок (кто бы их ни платил), начисления партнёрам и постоянные расходы периода. Рядом — «Куда уходят деньги»: расходы по видам и категориям. В «Юнит-экономике» — «Чистая на сделку».
- Свои даты — рядом с «Сегодня · 7 дней · … · Всё время» кнопка «Даты»: с какого по какой день (по Москве, оба включительно). Работает во всех разделах статистики и в воронке «Людей», при переходе между разделами даты сохраняются. Сравнение — с отрезком той же длины прямо перед ним; один-два дня — график по часам.
- «?» у каждого блока — в кружке у заголовка: что это, откуда цифры и как считаются, формула. У дохода и маржи сказано, что расходы в них не вычтены — они в «Чистой прибыли».
- Точки графиков — только внутри периода — крайние точки недели и месяца больше не захватывают дни до начала и после конца выбранных дат, сумма точек равна итогу.
- Списки и разбивки за период теперь с правой границей — направления, страны, сделки, способы оплаты, причины отмен, операторы, оценки и партнёры раньше брали всё с начала периода по сегодня; со своими датами в прошлом это было бы неверно.
- «Вернулись после отмены» считает людей правильно — первая гостевая заявка заводит кабинет, а следующие на ту же почту шли без него, и такой клиент не узнавался. Теперь один человек — тот же аккаунт или та же почта. Считается тремя быстрыми поисками (аккаунт, почта без учёта регистра, адрес) с индексом по почте, миграция 0034.
Сервер и выкатка
- Ключ шифрования секретов —
SETTINGS_SECRETв.envна сервере: им шифруются пароль почты и ключи платёжных систем.
1.6.0-beta — 2026-10-23
Интерфейс и оформление
- Новая иконка «O.» — для вкладки браузера и иконки на iPhone, в тех же цветах.
Сервер и выкатка
- Домен задаётся одной командой —
04-deploy.sh доменсам прописывает домен сайта и поддомен админки в.env; сертификаты Caddy получает сам. - Вебхуки — заголовки подписи и события теперь
X-OneSwaper-Signature,X-OneSwaper-Event,X-OneSwaper-Delivery,X-OneSwaper-Timestamp.
1.5.0-beta — 2026-10-22
Посетители и подсказки по вероятности
- Действия посетителей записываются — заход (экран, часовой пояс, язык; сервер добавляет браузер, систему и страну по Cloudflare), выбор направления и как выбрали (левая панель, список, «поменять», подсказка, ссылка), вставка адреса не той сети, созданная заявка. Посетитель — случайный номер в куке
vidна год, не отпечаток устройства; адресов, сумм и IP не храним. Таблицаvisitor_events, миграция 0032. - Подсказки подстраиваются под человека — кнопки «Это адрес сети … Переключить на» сначала показывают направления, которые этот посетитель уже выбирал (заявка весит втрое), потом правила вероятности, потом популярное у всех.
- «Статистика → Посетители» (только владельцу) — сколько посетителей и действий, что и как выбирают, где путаются с адресом, с каких устройств; список посетителей словами («Телефон · Safari · iOS · Россия»), по нажатию — карточка: устройства, аккаунт, заявки со ссылками, все действия по порядку.
- Раздел «Люди» (владелец и оператор) — воронка «Посетители → Выбирали направление → Создали заявку → Клиенты» по одним и тем же браузерам (процент не больше 100) и отдельной строкой «всего по базе» с заявками без куки. Три списка: посетители, зарегистрированные, клиенты, с поиском. Поиск ищет % и _ как обычные символы; пустая выдача — «ничего не найдено». Одна карточка человека, склеенная из браузеров, аккаунта, почты и Telegram: этап, устройства, заявки со ссылками, хронология.
- Склейка только по надёжным связям — гостевая заявка с чужой почтой не приклеивает браузер гостя к владельцу почты: в его карточке такой браузер помечен «связь не подтверждена», а его действий нет в хронологии.
- Потолок и срок хранения действий — не больше 500 действий на браузер в сутки (лишнее молча не пишем), записи старше года удаляет фоновый обработчик раз в сутки.
- Политика конфиденциальности — по умолчанию описывает куку статистики (если текст уже правили в админке, строку нужно добавить туда).
Интерфейс и оформление
- Левая панель направлений прокручивается сама — на ПК она закреплена под шапкой и не выше экрана: колесо над ней листает список, докрутили — дальше страница.
- Карточки — «стекло» — у всех карточек сайта (форма обмена, панель направлений, «Почему OneSwaper», карточки заявки и поддержки) фон на 72 % плотности с размытием того, что сзади.
Безопасность и защита
Контрольная сумма адреса выплаты — на сайте и на сервере: TRON и старые адреса BTC/LTC (base58check), bc1…/ltc1… (bech32), TON (CRC16). Выдуманный адрес вроде «TNo2177448278…» по формату проходил, теперь нет. На сайте отдельный текст: «В адресе ошибка: скопируйте его заново целиком». Ethereum и USDT ERC20 — по регистру букв (EIP-55), нулевой адрес не принимаем; адрес целиком в одном регистре суммы не несёт и проходит по формату.
Настоящий IP для лимитов и банов — API верит заголовку X-Forwarded-For только от своего прокси во внутренней сети; запрос в обход Caddy с подделанным заголовком больше не обходит лимиты.
Страну посетителя подделать нельзя — заголовок страны CF-IPCountry Caddy принимает только от адресов Cloudflare; запрос в обход Cloudflare его не подставит (страна влияет на проверку заявки и статистику).
Обмен и заявки
- Сумма больше не подставляется сама — в пустом поле серым стоит минимум с монетой («0,0005 BTC»). Пока вводят, монета остаётся серым сразу за суммой («0,01 BTC»). Минимум и максимум — в строке под полем.
- Сумму можно вводить и снизу — пишете, сколько хотите получить, и форма считает, сколько отдать (с округлением вверх, чтобы получить не меньше).
- Маска ввода — только цифры и один разделитель; точка превращается в запятую, два пробела подряд — тоже в запятую. Знаков после запятой не больше, чем у монеты.
- Смена направления не сбрасывает сумму — остаётся сумма в той монете, в которой её ввели, даже если монета переехала вверх или вниз (кнопка «Поменять местами»); второе поле пересчитывается по курсу. Если эта монета ушла из направления, держится поле, чья монета не сменилась.
- Список монет: выбранная наверху и сумма в каждой строке — выбранная монета первой под «Выбрано». Справа в строке — сколько выйдет в этой монете: в «Получаете» — сколько получите, в «Отдаёте» — сколько отдать, чтобы получить то же. Сеть — под кодом монеты. Над списком всегда подписи столбцов: «Монета · Валюта · Получите» (в «Отдаёте» — «Отдадите»). Пока сумма не введена, справа просто валюта: RUB, USDT, BTC.
- Список монет не обрезается краем окна — если снизу мало места, а сверху больше, он раскрывается вверх (под шапкой сайта); высота списка подстраивается под свободное место. Сам список полупрозрачный (72 %, как карточки) с размытием фона, рамки мягче.
- Вкладка «Популярные» в списке монет: USDT TRC20, BTC, СБП, Сбербанк, Т-Банк, ETH, USDT ERC20, TON, Alipay.
- Обратный отсчёт курса — «Курс обновится» и кольцо с секундами вместо отдельной строки «Курс обновится через N с» (полный текст — в подсказке при наведении). После курса — «i» в кружке с подсказкой «Курс фиксируется на 15 минут после создания заявки»; строка под кнопкой убрана.
- Адрес другой сети — предложим переключить — если вставленный адрес не подходит выбранной монете, но подходит другой сети, под полем: «Это адрес сети TRON. Получать: [USDT TRC20]». Предлагаем только направления, доступные для отдаваемой монеты; адрес и сумма остаются. «0x…» подходит и ETH, и USDT ERC20 — тогда кнопки обеих. Переключить некуда (адрес TRON, а USDT TRC20 клиент и отдаёт) — подсказка объясняет: «за USDT TRC20 на него ничего не получить, нужен адрес LTC».
- Переключение, если за эту монету сеть не получить — адрес TRON, а USDT TRC20 клиент и отдаёт: кнопки по вероятности: первой — то, что стоит в «Получаете» (в «Получаете» BTC — «BTC → USDT TRC20»), затем та же монета в другой сети («USDT ERC20 → USDT TRC20»), другая крипта, рубли и юани. Подпись — «Переключить на:».
- Сумма не путается при смене направления через адрес страницы (кнопка «назад» в браузере) — переносится так же, как при выборе монеты.
- Сумма переживает уход со страницы — ушли на «Помощь» и вернулись «назад» — сумма на месте (хранится во вкладке до создания заявки). Если в новом направлении этой монеты нет, поле пустое.
- Вместо белого экрана — «Страница не загрузилась» и кнопка «Обновить» — если страница упала при отрисовке (сбой сети на полпути, расширение-переводчик).
- Курс в рублях — до копеек («1 BTC = 6 843 973,42 RUB»), а не восемь знаков после запятой.
- Лимиты сразу под полем — «Минимум 30 USDT TRC20» / «Максимум …» у того поля, где вводили; «Продолжить» неактивна, пока сумма вне лимитов.
Сотрудники: одна роль «оператор»
- Роль «поддержка» слита с «оператором»: один сотрудник ведёт и заявки, и обращения. Миграция 0031 переводит существующих сотрудников поддержки в операторы; в выборе роли и таблице прав остались владелец и оператор.
- Из меню «Поддержка» убран пункт «Мои обращения» — это тот же фильтр «Мои» (назначенные на меня) на странице обращений.
1.4.0-beta — 2026-10-22
Карта проекта и команда ИИ в документации админки, фильтр направлений в курсах, сайт и админка во всю ширину экрана. Вторая цифра — новые функции.
Документация
- Карта проекта — первый документ в «Документации»: нажимаемая схема, а не таблица. Три вкладки: путь клиента, путь сотрудника и команда ИИ. В теме админки, во всю ширину экрана.
Настройки
- Фильтр направлений в курсах — кнопки монет «Отдаёт» и «Получает» и «Все с RUB» теперь скрывают остальные направления: видно «показано N из M» и «Показать все». Отметить для массовой правки можно только показанные.
Интерфейс и оформление
- Админка во всю ширину — на большом мониторе таблицы и карта не зажаты в колонку 1152px; на телефоне виджеты статистики во всю ширину, вкладки статистики прокручиваются.
- Сайт во всю ширину — шапка, главная, подвал и база знаний без ограничения ширины; панель направлений на главной во всю длину без внутренней прокрутки (страница прокручивается сама, форма прилипает к верху), до 30% ширины экрана.
- Конец списка — в курсах и заявках внизу анимация с галочкой «Это всё — N направлений / заявок», чтобы было видно, что список не оборвался.
- Статистика — строки в «Типах операций» и «Географии» больше не накладываются друг на друга при многих направлениях: список прокручивается.
1.3.1-beta — 2026-10-22
Резервы на главной списком по валютам; инструменты для локальной разработки. Первая версия по новому правилу: третья цифра — правки того, что уже есть.
Интерфейс и оформление
- Резервы списком — в «Почему OneSwaper» карточка «Наши резервы» снова без графика: общая сумма в долларах и список, сколько какой валюты (количество и ≈ в долларах), у банков логотип и сумма в рублях.
Сервер и выкатка
1.3.0-beta.10 — 2026-10-22
Правки после ревью формы обмена и мобильной версии.
Обмен и заявки
- Сумма не сбрасывается — при смене валюты получения введённая сумма остаётся, если она в лимитах нового направления; сбрасывается к минимуму только при смене отдаваемой валюты.
- upd 1.5.0-beta: изменено — сумма больше не подставляется сама и не сбрасывается к минимуму: остаётся в той монете, в которой её ввели, при любой смене направления.
- Список валют открывается на выбранной — после смены вкладки и повторного открытия.
Интерфейс и оформление
- Загрузка в панели направлений — пока курсы грузятся, серые строки-заглушки вместо «Ничего не нашлось»; если курсы не загрузились, заголовок главной остаётся.
- Подвал на телефоне — без эффекта выезда: кнопки «Обменять» и «Задать вопрос» больше не прячутся под страницей и нажимаются сразу.
- Шапка на телефоне — язык и тема переехали в выезжающее меню, шапка больше не шире экрана.
1.3.0-beta.9 — 2026-10-22
Главная по образцу BestChange: выбор направления слева, суммы по центру; новый список валют в форме.
Интерфейс и оформление
- Выбор направления слева — на широком экране слева две колонки «Отдаю» и «Получаю» с иконками монет и банков, у каждой свой поиск, сверху вкладки по типу валюты и кнопка «поменять местами». В правой колонке — только то, на что меняется выбранная слева. По центру — заголовок и форма с суммами. На телефоне панели нет, валюта выбирается в форме.
- Список валют в форме — раскрывается под полем во всю его ширину: поиск, вкладки «Банки РФ», «Стейблкоины», «Криптовалюта», «Платёжные системы», во «Все» — с заголовками групп. В строке иконка, код, название и сеть справа; у выбранной — галочка. На телефоне название скрыто, чтобы не обрезались коды.
1.3.0-beta.8 — 2026-10-20
Личный кабинет по почте из заявки, проверка адреса сразу в форме, понятная аннулированная заявка и фавикон.
Обмен и заявки
- Кабинет по почте из заявки — гость указал email, и для него сразу создаётся личный кабинет: заявка и её чек уже там. Если аккаунт с этой почтой есть, второй не создаётся и заявка в него сама не попадает.
- Проверка адреса на первом шаге — формат адреса для выбранной сети проверяется прямо в поле: красная рамка и подсказка «Адрес не подходит для этой сети». Раньше ошибка появлялась только при создании заявки.
- upd 1.5.0-beta: исправлено — выдуманный адрес с верным форматом (например «TNo2177448278…») проходил: теперь проверяется и контрольная сумма адреса, а адрес другой сети предлагается переключить.
- Сумма на втором шаге — в строке «Почти готово» вместо «не число» теперь сумма к получению.
- Аннулированная заявка — красный штамп «Аннулирована» на чеке, причина (время на оплату истекло или заявку отклонили после проверки) и кнопка «Создать новую заявку». Комментарий оператора клиенту не показывается.
- Курс зафиксирован — вместо «истёк» понятное сообщение и ссылка на новую заявку; после «Я оплатил» — «Проверяем оплату».
- Чек — строка «Валюта» перед сетью, «Куда придут деньги» вместо «Куда выплата», «Получите» вместо «К получению».
Уведомления
- Письмо «Личный кабинет создан» — в цветах сайта: логин, номер заявки со ссылкой и кнопка «Задать пароль и войти». Пароля в письме нет: ссылка одноразовая и действует 2 часа. Письма клиентам теперь умеют HTML (с текстовой версией).
- Ссылка устарела — страница по старой ссылке сразу говорит «Ваша ссылка устарела» и высылает новую на ту же почту; так же работает ссылка «Забыли пароль».
Интерфейс и оформление
- Фавикон — плитка «C.» как логотип: для вкладки браузера и иконки на iPhone.
1.3.0-beta.7 — 2026-10-20
Оплата прямо в чеке заявки: сеть, сумма и адрес с копированием и QR, «Я оплатил» и чек об оплате; страница 404 и тема «по часам».
Обмен и заявки
- Оплата в чеке заявки — ссылка на заявку, сеть (или банк), сумма и адрес (или реквизиты) теперь внутри чека, у каждой строки своя кнопка «копировать», плюс «Скопировать всё». Отдельные блоки «Сохраните ссылку» и «Отправьте ровно» убраны.
- QR в чеке — два вида: адрес оплаты (сканирует кошелёк) и ссылка на эту заявку (открыть на телефоне и оплатить оттуда, страница на компьютере обновится сама).
- Этапы заявки — Создана → Счёт (адрес выдан) → Проверка (клиент нажал «Я оплатил» или заявка на проверке) → Выплата → Готово.
- «Я оплатил» для любых заявок — кнопка появляется, как только выставлен счёт: и для крипты, и для рублей.
- Чек об оплате — клиент прикладывает скриншот или PDF из банка или кошелька: перетащить, выбрать файл или вставить из буфера (⌘V на Mac, Ctrl+V на Windows и Linux). Тип файла проверяет сервер по содержимому, до 8 МБ; новый файл заменяет прежний и сам ставит отметку «Я оплатил».
Сотрудники
- Чек об оплате в карточке заявки — ссылка «Скриншот / PDF от …» открывает файл клиента; файл видят только оператор и владелец, каждый просмотр пишется в журнал.
Интерфейс и оформление
- Страница 404 — по образцу page-not-found: прыжок сквозь звёзды, мимо пролетают человечки с монетами, «Назад» и «На главную»; на трёх языках. Раньше неизвестный адрес открывал пустой экран.
- Тема «по часам» — четвёртый вариант в переключателе темы, в меню админки и в «Настройки → Дизайн»: с 6:00 до 18:00 светлая, остальное время тёмная, меняется сама без перезагрузки.
- Без числа заявок на главной — в карточке оборота только сумма; число выполненных заявок сервер больше не отдаёт.
Сервер и выкатка
- Миграция 0030 — поле с чеком об оплате у заявки.
- Файлы клиентов в отдельном томе — документы KYC и чеки об оплате теперь лежат в томе kyc-data и не пропадают при выкатке (раньше хранились внутри контейнера).
1.3.0-beta.6 — 2026-10-19
Сайт на английском и китайском, новое верхнее меню сайта, проверка адреса AML для клиентов, обмен рублей через банки РФ и вкладки в выборе монеты.
Обмен и заявки
- Рубли через банки РФ — в обмене появились Сбербанк, Т-Банк, Альфа-Банк, ВТБ и СБП (по номеру телефона), у каждого своя иконка. Это отдельные валюты с кодами BestChange: SBERRUB, TCSBRUB, ACRUB, TBRUB, SBPRUB. Направления крипта ⇄ рубли (USDT TRC20, BTC, ETH, LTC, TON) заведены для каждого банка выключенными: их включает владелец в «Настройки → Курсы», когда готовы карты и резерв.
- Курс рубля — USDT/RUB берём с Rapira, Bybit P2P и CoinGecko и пропускаем через тот же контур, что и монеты: медиана, отсев площадки, чья цена дальше допустимого расхождения, минимум площадок. Площадки рубля опрашиваются, только когда включено хоть одно рублёвое направление.
- Выплата в рубли — клиент вводит номер карты (проверяется по Луну) или телефон для СБП и имя с фамилией получателя. Выплачивает оператор вручную, можно несколькими платежами: каждую часть он записывает с номером операции в банке, клиент видит «Выплачено X из Y». «Выполнена» — только когда части дали всю сумму и оператор отметил, что сверил получателя.
- Приём рублей — клиент указывает карту или телефон, с которых платит, и имя владельца. Оператор выдаёт реквизиты для перевода (в тексте должна быть карта или телефон), клиент нажимает «Я оплатил» — оператору приходит уведомление. Оплату оператор подтверждает, только сверив имя отправителя: перевод с чужой карты — риск блокировки по 115-ФЗ.
- Лимиты на карту — не больше заданной суммы рублей и числа заявок в сутки на одну карту или телефон клиента (по умолчанию 300 000 ₽ и 3 заявки). Для лимита доверия и KYC рублёвая заявка теперь тоже считается в USDT.
- Язык заявки — заявка запоминает, на какой версии сайта её создали (русская, английская, китайская). В согласии с условиями теперь записаны и номера редакций, и язык каждого текста: пока перевода нет, клиент принимает русскую редакцию, и это видно в заявке.
- Вкладки в выборе монеты — над списком «Отдаёте» и «Получаете»: Все, RUB (банки), Stable (USDT во всех сетях), Coin (BTC, ETH, LTC, TON), $/€/¥ (появится вместе с такими валютами). Пустые вкладки не показываются, вкладка работает вместе с поиском, выбранная валюта видна строкой «Выбрано: …».
- Форма обмена в два шага — на первом экране «Отдаёте / Получаете», адрес получения, курс и «Продолжить»; почта, рублёвые реквизиты и согласие с условиями — на втором шаге, со сводкой обмена и кнопкой «Назад».
- Курс обновляется сам, с обратным отсчётом — под курсом кольцо и «Курс обновится через N с»: форма знает, когда воркер обновил курс и как часто он это делает, и подтягивает новый без перезагрузки страницы. Раньше курс на странице стоял таким, каким загрузился.
- Вкладки валют видны всегда — «Все / RUB / Stable / Coin / $/€/¥» в выборе валюты есть всегда; пустая вкладка пишет «Скоро добавим». Выбранная валюта — с заливкой и галочкой в кружке, её видно сразу. Без ссылки форма открывается на «крипта → крипта».
- Юани: Alipay и WeChat Pay — новые валюты во вкладке «$/€/¥» (коды BestChange ALPCNY и WCTCNY), направления крипта ⇄ юани, комиссия 3%, выплата вручную. Заведены выключенными — включаются в «Настройки → Курсы». Реквизит клиента — аккаунт кошелька: телефон, почта или ID; имя получателя можно иероглифами. Оператор выдаёт аккаунт для оплаты текстом — сервер находит в нём телефон, почту или ID. Суточный лимит в рублях к юаням не применяется, лимит числа заявок — применяется. Миграция 0028.
- Курс юаня — USDT/CNY с OKX P2P и HTX P2P (медиана десяти объявлений о продаже USDT) и CoinGecko; те же медиана и отсев по расхождению, что у остальных. Новые площадки опрашиваются, только когда включено фиатное направление.
- Логотипы банков и кошельков — у Сбербанка, Т-Банка, Альфа-Банка, ВТБ, СБП, Alipay и WeChat Pay в выборе валюты — их настоящие знаки на белом круге (банки — с Wikimedia Commons, Alipay и WeChat — из Simple Icons).
- Курс в рубли и юани — до копеек — «1 BTC = 535 042,94 CNY» вместо шести знаков после запятой.
- Чек в живом чате — открыли чат на странице заявки или в переписке, привязанной к заявке, — сверху её чек, компактный, без этапов.
Уведомления
- Письма и бот на языке заявки — письма о шагах заявки и сообщения бота в Telegram приходят на языке, на котором создана заявка, а ссылка ведёт на ту же языковую версию (/en/order/…, /zh/order/…). Письма аккаунта (подтверждение почты, новый пароль, ссылка на заявку) — на языке страницы, с которой их запросили.
- Бот на английском и китайском — приветствие, кнопка «Обменять», команды и ответы бота — на языке Telegram клиента (английский, китайский), остальным — по-русски.
Настройки
Оборот вне сайта — в «BestChange и мониторинги» кнопки +$5, +$50, +$500, +$5 000 и своя сумма: внесения за день складываются и прибавляются к обороту на главной (карточка и график). Минус — исправить ошибку, ниже нуля день не уходит. Каждое внесение пишется в журнал действий.
Юридические тексты на английском и китайском — в «Настройки → Юридические тексты» у каждого документа вкладки «Русский», «English», «中文». У перевода свои номера редакций и счётчик согласий. Пока перевода нет, на английской и китайской версиях сайта показывается русский текст с пометкой «Translation in progress».
Банки в «Платёжных системах» — отдельный блок «Банки РФ: рубли»: включить или выключить банк и задать суточные лимиты на карту клиента. Банк нельзя привязать к платёжной системе монет.
Рубли в «Курсах» — у рублёвых направлений метка RUB и быстрый выбор «Все с RUB»; массовое изменение работает и с ними. Режим выплаты у них только «вручную», сервер не даст поставить автовыплату.
Файл BestChange с рублями — рублёвые направления попадают в файл с кодом банка и признаком manual. Признак card2card по правилам BestChange ставится только для карт Visa/Mastercard (CARDRUB), у банков его нет.
Интерфейс и оформление
Экраны входа по образцу sign-in-1 — карточка по центру с плиткой логотипа: на сайте основная кнопка Telegram, «или», вход по почте раскрывается, «Обменять без входа»; в админке почта, пароль и код 2FA. Код из приложения вводится с маской «123-456» (и в приглашении сотрудника).
Почему OneSwaper — карточки с цифрами — блок на главной собран полупрозрачными карточками с размытием по образцу features-8: ряд из трёх с графиками и ряд из четырёх. Курс BTC, ETH и TON за неделю: крупная цена с изменением в процентах, график зелёный при росте и красный при падении. «Наши резервы» — сумма резервов BestChange в долларах с графиком за неделю. «Оборот за всё время» — нарастающий итог выполненных заявок по дням. Ниже — «15 минут» (курс зафиксирован), среднее время обработки заявки 5–30 минут, проверка оплаты, обмен без регистрации. Цифры только настоящие: историю за неделю (почасовые цены и сумма резервов) копит воркер курсов, без новой таблицы; оборот появляется сам, когда набирает порог. Что показывать и порог задаёт владелец в «Настройки → BestChange и мониторинги». Пока резервов и оборота нет, на их месте — карточка поддержки.
Английская и китайская версии сайта — все клиентские страницы на английском и упрощённом китайском: главная и форма обмена (включая рубли), заявка, KYC, вход и регистрация, «Мои заявки», «Найти заявку», «Как это работает», поддержка и чат, кабинет партнёра, проверка адреса AML, подвал, ошибки сервера, которые видит клиент. Русский — основной: русская версия без изменений и без префикса в адресе, английская — /en/…, китайская — /zh/…. Даты и числа — в формате языка. Админка остаётся на русском.
Поисковики видят языковые версии — у каждой страницы ссылки hreflang на русскую, английскую и китайскую версии и атрибут языка страницы.
Меню на телефоне — кнопка-бургер, меню выезжает справа. Группы раскрываются как аккордеоны, группа текущей страницы открыта сразу. На ширине от 360px нет горизонтальной прокрутки.
Поддержка: блок «Контакты» — почта, Telegram и реквизиты из «Настройки → Юридические тексты». Ссылки из меню «Обращение» и «Контакты» ведут к нужному блоку страницы.
Шапка едет вместе со страницей — при прокрутке она становится плашкой с закруглёнными углами: полупрозрачная, с размытием того, что под ней, и лёгкой тенью. Наверху страницы — обычная шапка без фона.
Язык и тема — значок и стрелка — без подписей: у языка флаг, у темы значок текущей (солнце, луна, монитор), рядом стрелка вниз — видно, что раскрывается. Тема теперь выбирается так же, как язык: кнопка перетекает в окно «Светлая / Тёмная / Как в системе», новая тема расходится кругом от кнопки.
Логотипы в ленте «Нас рекомендуют» — иконки площадок с их официальных сайтов (BestChange, Exnode, Kurs Expert, Glazok, OKchanger, WellCrypto, Crypto.ru, Profinvestment, Searchengines.guru, InvestSocial); у Bitcointalk и Bits.media на сайтах только иконки 16×16 — у них первая буква. Свой логотип из настроек важнее встроенного. Серую подложку под лентой убрали.
Свечение за курсором — на клиентских страницах за мышью плывёт лёгкое тёплое свечение по фону; на телефонах, в админке и при «уменьшить движение» его нет.
Квадратная точка в логотипе — «OneSwaper.» теперь с оранжевым квадратом вместо круглой точки: в шапке, подвале, на входе в админку и в приглашении сотрудника.
Выбранная валюта — первой в списке — открыли выбор валюты — выбранная стоит сверху с заливкой, остальные ниже.
Путь в админке без «OneSwaper» — вверху теперь «Настройки / Курсы»: слово «OneSwaper» никуда не вело и убрано; разделы пути, кроме текущей страницы, — ссылки, как и раньше.
База знаний — новая страница /help (и /en/help, /zh/help): шесть разделов — обмен, сроки и лимиты, рубли и юани, проверки AML и KYC, «если что-то пошло не так» (с возвратами), аккаунт и поддержка; 22 статьи на трёх языках. Вверху поиск по статьям и карточки разделов, на широком экране слева оглавление. Лимиты живые: минимум и максимум по каждому направлению, лимит заявки нового клиента, порог KYC, суточный лимит рублей и заявок на карту (строки про рубли и юани — только если такие направления включены). Внизу — вопросы на вкладках.
Лимиты для клиентов в API —
GET /api/limitsотдаёт из настроек суточный лимит на карту или телефон, лимит заявки нового клиента и порог KYC; лимит «подозрительного» клиента наружу не уходит.Ссылки на базу знаний — в меню: «Сроки и лимиты» в группе «Обмен», «База знаний» в группе «Поддержка»; в подвале — «База знаний» и «Сроки и лимиты»; на главной под вопросами — «Больше ответов — в базе знаний».
Больше вопросов и ответов — во вкладках 28 вопросов вместо 15 и новая вкладка «Рубли и юани»: банки, как получить и оплатить рубли, оплата с чужой карты, лимит по карте, юани на Alipay и WeChat Pay; ещё — минимальная сумма, почему меняется курс, не та сеть или сумма, документы для KYC, смена адреса выплаты, уведомления о статусе, связь с поддержкой.
Безопасность и защита
Вход на сайт через Telegram — кнопка «Войти через Telegram» на странице входа: окно oauth.telegram.org, подпись данных проверяет сервер (ключ — sha256 от токена бота), данные старше 10 минут не принимаются. Новый клиент заводится без почты, заявки из Telegram Mini App с тем же telegram id попадают в «Мои заявки». Сотрудника так не войти. Чтобы кнопка появилась, боту в @BotFather нужен домен сайта (/setdomain).
Проверка адреса AML для клиентов — страница /aml-check: клиент вводит адрес кошелька и сеть (сеть подставляется по виду адреса), мы спрашиваем AMLBot и показываем низкий, средний или высокий риск по порогам из «Настройки → Безопасность → AML и KYC». Пока нет ключей AMLBot (AMLBOT_ACCESS_ID и AMLBOT_ACCESS_KEY), страница так и пишет: проверка временно недоступна. Каждая проверка платная, поэтому лимит — 5 запросов за 10 минут с одного IP. Ответ по одному адресу держим в памяти 10 минут, в базу адреса не пишем.
1.3.0-beta.5 — 2026-10-19
Массовое изменение направлений на вкладке «Курсы», подготовка к листингу на BestChange и лента «Нас рекомендуют».
Настройки
- Массовое изменение направлений — в «Настройки → Курсы» у направлений появились галочки, «выбрать все» и быстрый выбор по монете («Отдаёт: BTC», «Получает: USDTTRC20»). Выбранным разом: комиссию поставить, прибавить или убавить, «серый» процент поставить или убрать, мин. и макс. (когда у всех одна монета «отдаю» — лимиты в ней), режим выплаты, включить или выключить. До применения видно, сколько строк изменится и что получится; если правило не проходит хоть у одного направления (комиссия в минус, максимум меньше минимума), не меняется ни одно. В журнал действий — запись по каждому направлению с пометкой «массово».
Интеграции
- Файл курсов для BestChange — по адресу /api/export/bestchange.xml в формате монитора: курс клиенту с комиссией, резерв, мин. и макс., сколько держится курс, значки «ручной» (пока адрес оплаты или выплату делает оператор) и «верификация» (если включён KYC). Собирается на каждый запрос без кэша — BestChange спрашивает каждые 5–8 секунд. В файле только включённые направления со свежим курсом и резервом. По умолчанию выключен.
- «Настройки → BestChange» — включить файл, резервы по монетам, ссылка «Мы на BestChange» в подвале с номером партнёра BestChange, что сейчас в файле и чек-лист условий листинга: полгода работы, резерв от $10 000 (считается по курсам), файл, ссылка, партнёрская программа, чат, почта, русская версия. Изменения — в журнале действий.
Интерфейс и оформление
- Лента «Нас рекомендуют» на главной — бесконечная бегущая строка площадок, где у обменника есть страница (мониторинги, форумы), по образцу Ticker с motion.dev: две строки навстречу друг другу, без шва, на наведении замедляется; при «уменьшить движение» стоит на месте. Площадки — в «Настройки → BestChange и мониторинги»: заведены BestChange, Exnode, Kurs Expert, Glazok, OKchanger, WellCrypto, Crypto.ru, Bits.media, Bitcointalk, Profinvestment, Searchengines.guru, InvestSocial — все выключены, пока там нет нашей страницы; включённой площадке нужна ссылка https на нашу страницу, логотип — по желанию. Можно добавить свою площадку. Изменения — в журнале действий.
1.3.0-beta.4 — 2026-10-19
Курс TON снова есть: биржи переименовали монету в GRAM. Два новых источника курса.
Обмен и заявки
- Курс TON вернулся — биржи переименовали TON в GRAM. Старая пара TONUSDT на Binance остановлена, её цена застыла на 1.60 при рыночной около 1.35, а у OKX пары под старым именем нет вовсе. Поэтому защита по расхождению не ставила курс, и направления с TON стояли без курса. Теперь у бирж спрашиваем GRAM, и все пять площадок сходятся.
- Bybit и KuCoin — новые источники курса — теперь их пять: Binance, OKX, Bybit, KuCoin, CoinGecko. Новые включены сразу, выключаются в «Настройки → Курсы». Чем больше площадок, тем надёжнее медиана и тем спокойнее, когда одна из них не отвечает.
- Остановленные пары не дают курс — цену пары, у которой нет заявок на покупку или давно не было сделок (Binance, Bybit, KuCoin), не засчитываем. Застывшая цена больше не попадёт в курс.
1.3.0-beta.3 — 2026-10-19
Чат поддержки на сайте и другие доработки для клиентов.
Поддержка
- Чат поддержки на сайте — плавающая кнопка в углу всех страниц сайта (кроме админки и страниц поддержки), по ней открывается окно переписки, со страницы уходить не нужно. Пишет гость (почта необязательна) или клиент с аккаунтом. Первое сообщение открывает тикет в отделе поддержки, следующие идут в него же; код тикета запоминает браузер. Ответ оператора появляется в окне за несколько секунд; если окно свёрнуто, на кнопке счётчик новых ответов. На странице заявки её номер прикрепляется к тикету. После закрытия тикета следующее сообщение открывает новый. Enter отправляет, Shift+Enter — новая строка.
Обмен и заявки
- Обмен в Telegram (Mini App) — в боте кнопка «Обменять» (в сообщении /start, команде /exchange и в меню слева от поля ввода) открывает форму обмена сайта прямо в Telegram. Та же форма и та же страница заявки; кнопка Telegram «Назад» возвращает к форме. Светлая или тёмная тема — по Telegram, цвета наши: шапку и фон Telegram красим в наш фон. Заявка привязывается к telegram id клиента: сервер проверяет подпись данных Telegram (HMAC с токеном бота, данные не старше суток), без верной подписи заявку из Mini App не принимает. По этому id воркер сможет слать клиенту статусы в бот. Миграция 0024.
- Аккаунт клиента — в шапке сайта «Войти», после входа — меню аккаунта (Мои заявки, Найти заявку, выход удержанием). Регистрация по email и паролю сразу входит и присылает письмо для подтверждения почты. «Забыли пароль?» — ссылка на новый пароль приходит письмом, действует час, после смены все прежние входы завершаются. Сотрудникам сброс по письму не работает. Миграция 0020.
- Мои заявки — страница /account/orders: обмены клиента, новые сверху, с номером, суммами, датой и статусом; каждая ведёт на карточку заявки. Заявка, созданная после входа, попадает сюда сразу, почта для неё берётся из аккаунта.
- Гость не теряет заявку — у заявки появился номер для людей (№10001…). На странице заявки крупно показана постоянная ссылка с кнопкой «Скопировать». В форме обмена у гостя есть необязательное поле email. Страница «Найти мою заявку» (/find-order) принимает номер и email и присылает ссылку письмом: сразу её не показываем, иначе чужой человек, зная email, открыл бы заявку. Ссылку собирает общая функция orderUrl() — её же используют письма.
- Прошлые заявки переходят в аккаунт — когда клиент подтверждает почту по ссылке из письма, заявки и обращения в поддержку, оформленные на этот email без входа, привязываются к аккаунту. Без подтверждения ничего не привязывается, поэтому чужие заявки нельзя забрать, зарегистрировавшись на чужой email.
- Реферальная программа — клиент с аккаунтом становится партнёром на странице /account/partner и получает ссылку
?ref=КОД. Код запоминается в куке на 30 дней и пишется в заявку; переход считается один раз на браузер. За выполненную заявку по ссылке партнёр получает процент от нашей комиссии (то, что отдал клиент, минус выплаченное, в $ по рынку); свои заявки не засчитываются. Начисления — в отдельной таблице, одно на заявку. По умолчанию программа выключена. Миграция 0023. - Кабинет партнёра — ссылка с кнопкой «Скопировать», переходы, заявки (выполнено из созданных), заработано, выплачено и доступно к выводу, история начислений и выводов. Коды и адреса чужих заявок партнёр не видит.
- Вывод заработанного — партнёр оставляет заявку на вывод в USDT TRC20 или ERC20 (не меньше минимальной суммы и не больше доступного). Оператор в «Партнёры → Выплаты» отмечает «Выплачено» с хэшем перевода или отклоняет с причиной — тогда сумма возвращается в доступное. О новой заявке — уведомление «Партнёр просит выплату».
- Раздел «Партнёры» в админке — владелец включает программу, задаёт долю партнёра и минимальный вывод, меняет процент отдельного партнёра и отключает его; оператор видит партнёров и проводит выплаты. Все действия — в журнале действий.
- Согласие с условиями перед заявкой — в форме обмена (и в Telegram Mini App) галочка «Согласен с условиями обмена, обработкой персональных данных и AML/KYC-политикой», ссылки открываются в новой вкладке. Без галочки кнопка «Обменять» неактивна, а сервер отвечает terms_required. В заявку пишутся время согласия и номера редакций всех трёх текстов. Миграция 0025.
Безопасность и защита
- AML-проверка входящих монет — оператор вписывает хэш входящей транзакции или адрес отправителя (в блоке «AML-проверка» на карточке заявки или при отметке «Оплата получена»), воркер проверяет их в AMLBot и получает оценку риска 0–100. Низкий риск — заявка идёт дальше; средний — уходит «На проверку» оператору; высокий — заявка замораживается, владельцу приходит уведомление «Заявка заморожена по AML» (колокольчик и Telegram). Замороженную заявку двигает только владелец, с причиной, — его решение снимает заморозку. Пока проверка идёт, выплату не одобрить; ошибки AMLBot повторяются через 1–16 минут. Результаты, оценка и история проверок — на карточке заявки, решения — в журнале действий. Провайдер подключается через общий интерфейс, AMLBot — первый.
- Без ключа — как раньше — ключи AMLBOT_ACCESS_ID и AMLBOT_ACCESS_KEY только в .env на сервере (вписаны в .env.example). Пока их нет, проверка выключена и заявки проходят без неё.
- KYC по сумме заявки — если заявка дороже порога, клиент на странице заявки видит экран верификации и загружает фото документа (или PDF) и селфи с ним. Файлы проверяются по содержимому (не больше 8 МБ) и лежат в закрытой папке на сервере (KYC_STORAGE_DIR), не в папке сайта; отдаёт их только админка оператору и владельцу, каждый просмотр пишется в журнал. Оператор одобряет или отклоняет документы на карточке заявки; причину отказа видит клиент и присылает документы заново. Адрес оплаты — только после одобрения. Клиент с аккаунтом проходит KYC один раз. Решения — в журнале действий. Внешний сервис (Sumsub) подключается тем же интерфейсом провайдера KYC.
- «Настройки → Безопасность → AML и KYC» — владелец включает проверку и задаёт пороги среднего и высокого риска (по умолчанию от 40 и от 75 из 100) и порог суммы для KYC в USDT (по умолчанию 0 — KYC выключен). Миграция 0022.
Статистика
- Статистика → Партнёры — переходы по ссылкам, заявки по ним и конверсия, оборот, наш доход с этих заявок, начислено партнёрам и сколько остаётся нам, сколько мы должны партнёрам и сколько ждёт выплаты, новые партнёры, графики по дням и лучшие партнёры. Деньги в $.
Сервер и выкатка
- Резервные копии базы — воркер снимает полную копию (pg_dump, сжатая) под владельцем базы по расписанию по Москве: по умолчанию каждый час в :00, можно каждые 2–12 часов или раз в сутки в ЧЧ:ММ. Копия зашифрована паролем BACKUP_PASSWORD из .env (AES-256, открывается обычным openssl), лежит в /home/deploy/backups/auto — вне папка установки, выкатка её не трогает. Пароль и папку создаёт 04-deploy.sh. Миграция 0019.
- Копия в Telegram — файл уходит боту в чат из «Интеграции и уведомления». Больше 50 МБ — частями по 45 МБ или только сообщение «копия снята, лежит на сервере», как выбрано.
- Хранение и место на диске — все копии за 48 часов, затем последняя за день 14 дней и последняя за неделю 4 недели, старше 30 дней удаляются; можно ограничить число копий (новая перезаписывает самую старую). Свободно меньше порога (1 ГБ) — самые старые удаляются раньше срока и приходит предупреждение; места нет и так — копия не снимается, чтобы не заполнить диск.
- «Настройки → Бэкапы» — для владельца: включение, расписание, сколько хранить, порог места, Telegram, «Снять копию сейчас», список копий (время по Москве, размер, отправлена ли, ошибка) и скачивание. Изменения, ручной запуск и скачивание — в журнале действий.
- Ошибки копий в уведомлениях — события «Ошибка бэкапа» и «Мало места для копий»: колокольчик и Telegram (уже сохранённые настройки уведомлений получают их сами). В «Состоянии системы» новая часть «Резервные копии»: давно не было копии, последняя не снялась или не ушла в Telegram.
- Восстановление — команды проверки копии на отдельной базе и возврата рабочей базы к копии — в документации «Запуск», там же как завести бота для Telegram. Обе проверены на PostgreSQL 18.6: данные после восстановления совпали с исходными.
Уведомления
- Клиент знает о каждом шаге заявки — адрес для оплаты выдан, оплата получена, выплачено, заявка отменена: клиенту приходит письмо на почту из заявки (у клиента с аккаунтом без почты в заявке — на почту аккаунта). Если клиент пришёл из Telegram Mini App или связал Telegram с аккаунтом, бот пишет и туда. В сообщении — суммы, адрес оплаты или хэш выплаты и ссылка на страницу заявки. Комментарий оператора при отмене клиенту не уходит, при отмене по таймеру — «оплата не пришла вовремя».
- Отправка через воркер, с повторами и без дублей — уведомления встают в общую очередь доставок, воркер шлёт письма по SMTP и сообщения через бота; при сбое повторяет через 1, 2, 4, 8 минут, адрес, который почтовый сервер отверг навсегда, не повторяет. Один шаг по одному каналу ставится один раз (ключ от дублей в очереди), а воркер забирает доставку себе перед отправкой — второй проход её не отправит. Миграция 0021.
- Почта через .env — SMTP_HOST, SMTP_PORT, SMTP_SECURE, SMTP_USER, SMTP_PASSWORD, SMTP_FROM (добавлены в .env.example). Без них письма не уходят, в журнале доставки — понятная ошибка. Через эту же очередь уходят письма аккаунта клиента (подтверждение почты, новый пароль).
- «Уведомления клиентам» в настройках — в «Настройки → Интеграции и уведомления» владелец включает и выключает письма и Telegram, видит, задан ли SMTP и токен бота, последние отправки с ошибками и кнопку «Проверить почту» (письмо себе). Изменения — в журнале действий.
- Оценка обмена после выплаты — на странице выплаченной заявки клиент ставит 1–5 звёзд и комментарий, один раз; письмо о выплате зовёт это сделать. Оценка видна в админке на карточке заявки. Владелец может выключить оценки или включить ссылку на мониторинг обменников (адрес https:// и название) — её клиент видит после оценки.
Интерфейс и оформление
- Юридические страницы — /legal/offer (пользовательское соглашение, оферта), /legal/privacy (политика обработки персональных данных по 152-ФЗ), /legal/aml (AML/KYC-политика). Реквизиты подставляются в текст из настроек; старая редакция открывается по ?version=N с пометкой «прежняя редакция».
- «Как это работает» — страница /faq: шаги обмена, сроки (фиксация курса, подтверждение, выплата, автоотмена, проверка), лимиты по каждому направлению из текущих настроек, что делать, если отправил не ту сумму, опоздал с оплатой, ошибся сетью или адресом, и частые вопросы. Ссылка на неё — под вопросами на главной.
- Подвал сайта — на главной, в поддержке, на юридических страницах и в «Как это работает»: ссылки на три документа, «Как это работает», поддержку, почту и Telegram, название юрлица и ИНН.
- «Войти» на всех страницах сайта — кнопка входа и меню аккаунта теперь и в шапке юридических страниц и «Как это работает», как на главной.
Настройки
- «Настройки → Юридические тексты» — для владельца: реквизиты и контакты (юрлицо, ИНН, ОГРН, адрес, почта, Telegram, сайт), которые подставляются вместо [НАЗВАНИЕ ЮРЛИЦА], [ИНН], [EMAIL] и других плейсхолдеров и показываются в подвале. Тексты трёх документов правятся в Markdown с предпросмотром; видно, какие плейсхолдеры не заполнены. Стартовые тексты — шаблоны-черновики для криптообменника: над ними плашка «Черновик, нужен юрист» (её видно только в админке), снимает её переключатель «Проверено юристом». Каждое сохранение — новая редакция, прежние не меняются и не удаляются (роли приложения запрещено), рядом видно, сколько заявок согласились с какой редакцией. Изменения — в журнале действий.
1.1.0-beta.1 — 2026-10-19
Вторая бета: статистика и юнит-экономика, отдел поддержки с Telegram, настройки и безопасность (сотрудники со своими IP, дизайн сайта), состояние системы, журнал действий, уведомления.
Поддержка
- Обращения с сайта — страница «Поддержка» (ссылка в шапке главной): ответы из базы знаний с поиском и форма обращения. Гость пишет с почтой, клиент с аккаунтом — без неё. Со страницы заявки обращение открывается с номером заявки и привязывается к ней. Клиент получает ссылку на обращение (код угадать нельзя, как у заявки) и видит там переписку; страница обновляется сама.
- Тикеты и переписка — номер тикета (#1001…), тема, клиент (аккаунт или гость по почте), заявка, статусы: новый, в работе, ждёт клиента, решён, закрыт. Ответ сотрудника переводит в «ждёт клиента», ответ клиента — снова в «в работе». Заметки для сотрудников клиент не видит. Канал (сайт, позже Telegram) записан в тикете. Миграции 0011, 0012.
- Очередь в админке — меню «Поддержка»: открытые тикеты сверху по времени ожидания, фильтры «Мои», «Без оператора», по статусу, поиск по номеру, теме и почте; отметка просроченного SLA. Счётчик «ждут ответа» в меню и сигнал с миганием вкладки на новое обращение.
- Карточка тикета — переписка, ответ или заметка, вставка шаблона, статус после ответа, смена статуса, «Взять себе» и «Отпустить»; владелец назначает любого сотрудника (видно статус «в сети» и сколько у него открытых тикетов). Справа клиент, заявка, очередь, таймеры SLA первого ответа и решения, оценка, другие обращения клиента и история действий.
- Оценка клиента (CSAT) — после решения клиент ставит 1–5 звёзд и комментарий, один раз. Решённый тикет без ответа клиента закрывается сам через 3 дня (настраивается; фоновый обработчик раз в час).
- Журнал тикетов — для владельца: оператор, тема, клиент, число сообщений, дата и время, время первого ответа и решения, нарушения SLA, оценка. Фильтры по датам, оператору, статусу и поиск; сводка (медиана и среднее, CSAT) и выгрузка в CSV для Excel.
- Шаблоны ответов и автоответ — шаблоны правит любой сотрудник. Автоответ сразу после обращения с номером тикета (в статистике первым ответом не считается), текст меняет владелец.
- База знаний — статьи для клиентов (на странице поддержки) и для ИИ. Правят владелец и операторы. Четыре стартовые статьи и четыре шаблона.
- Подсказка ответа от ИИ — кнопка «Подсказать ответ» в карточке тикета: Claude (по умолчанию claude-sonnet-5-5, модель выбирается в настройках) читает переписку, заявку и статьи «для ИИ» и предлагает текст; оператор правит и отправляет сам. Ключ ANTHROPIC_API_KEY только в .env на сервере. Если модель откажет по правилам безопасности, сервер Anthropic сам повторит запрос на запасной модели.
- Настройки поддержки — для владельца: «ждёт клиента» после ответа, назначать только тем, кто «В сети», дни до автозакрытия, автоответ, ИИ. Очереди: свои SLA первого ответа и решения, сотрудники, автоназначение. Новый тикет назначается сотруднику очереди «В сети» с наименьшим числом открытых тикетов; никого нет в сети — ждёт в очереди.
- Журнал действий — ответы, заметки, смены статуса, назначения, смена очереди, подсказки ИИ, правка шаблонов, статей, настроек и очередей; автоназначение и автозакрытие — как действия системы.
- Обращения из Telegram — клиент пишет боту, и создаётся тикет с каналом «Telegram» тем же путём, что с сайта: номер, очередь по умолчанию, автоназначение, SLA, автоответ (приходит в чат). Следующие сообщения клиента добавляются в ту же переписку, решённый тикет открывается заново; после закрытия — новое обращение. Ответ сотрудника из админки уходит клиенту в Telegram (заметки — нет). После решения бот просит оценку кнопками 1–5, она идёт в CSAT. В карточке тикета видно @имя клиента в Telegram. Бот передаёт сообщения в API по внутренней сети (снаружи путь закрыт, запросы подписаны секретом из токена бота), ответы отправляет воркер через очередь доставок. Миграция 0014.
Настройки
- Раздел «Настройки» для владельца — меню «Настройки»: «Курсы», «Платёжные системы», «Безопасность», «Интеграции и уведомления», «Дизайн». Видит и меняет только владелец; каждое изменение пишется в журнал действий со старым и новым значением (в журнале — «поле: было → стало»). Миграция 0013.
- Курсы: откуда берутся — площадки Binance, OKX, CoinGecko включаются и выключаются, минимум площадок для цены, частота обновления (15 секунд — 10 минут), допустимое расхождение от медианы, через сколько курс устаревает. Воркер читает это из базы, а не из кода. Видно, ответила ли каждая площадка при последнем опросе и каких направлений не хватило.
- Курсы: направления — комиссия, «серая» комиссия, минимум и максимум, режим выплаты (вручную, авто, авто до лимита) и включение — прямо в таблице. У каждого направления последний курс, с каких площадок он собран и как давно.
- Платёжные системы и способы оплаты — WestWallet включается, только если её ключи заданы в .env на сервере; в админке видно лишь «ключ задан / не задан». Для каждой монеты и сети — через какую систему принимаем или «вручную». Ручная оплата оператором включается отдельно: если её выключить, на сайте остаются только монеты включённой системы.
- Уведомления в Telegram — чат или канал, какие события (новая заявка, оплачена, выполнена, отменена, ошибка курса, неудачный вход в админку, бан IP), кнопка «Проверить» и последние отправки. Токен бота — только TELEGRAM_BOT_TOKEN в .env.
- Системные уведомления — лента событий в админке, какие события в неё попадают — выбирает владелец.
- Вебхуки — адрес (только https и не во внутреннюю сеть), события, включение. Тело подписано HMAC-SHA256 секретом (заголовки X-OneSwaper-Signature и X-OneSwaper-Timestamp); секрет целиком показывается один раз, его можно заменить. Журнал доставок: код ответа, время, ошибка, повторы через 1, 2, 4, 8 минут.
- Очередь доставок — API только ставит уведомление в очередь, отправляет воркер раз в 5 секунд: так сбой Telegram или чужого сервера не задерживает заявку.
- Дизайн сайта — вкладка «Дизайн» вместо «Брендинга». Готовые темы одним щелчком: «Тёплая» (как сейчас: кремовый, графит, оранжевый), «Графит», «Песок», «Медь». Свои цвета фона, поверхности, текста, серого текста, рамок и акцента для светлой и тёмной темы — через выбор цвета с полем HEX. Цвет текста акцентом и текст на кнопке подбираются сами по контрасту; проверка контраста по WCAG: ниже 3:1 сохранить нельзя, от 3 до 4.5 — предупреждение. Скругления, шрифт (Inter, Manrope, Golos Text, IBM Plex Sans, системный), тема для клиентов по умолчанию, название, логотип и иконка вкладки.
- Живой предпросмотр — главная сайта в двух рамках, светлая и тёмная, меняется сразу при правке, до сохранения.
- История версий дизайна — каждое сохранение и возврат — версия; «Вернуть как было» и «Вернуть эту» для любой версии. В журнале действий — что поменялось. Сайт получает дизайн при загрузке (CSS-переменные с сервера), без перезагрузки сервера и правки кода. Миграция 0015.
Статистика
- Раздел «Статистика» для владельца — четыре вкладки: «Обзор», «Юнит-экономика», «Платежи», «Поддержка». Периоды: сегодня (по часам), 7, 30, 90 дней, год, всё время; у каждого показателя сравнение с прошлым таким же периодом. Дни по московскому времени.
- Обзор — оборот и доход в USDT, заявки (создано и выполнено, конверсия), прибыль на заявку и средний чек, новые пользователи, клиенты с аккаунтом и гости. Графики оборота и дохода, заявок; типы операций (направления), аккаунт или гость, география клиентов.
- Юнит-экономика — прибыль на сделку (средняя и медиана), средний чек, маржа, разброс прибыли, графики по времени, таблица по направлениям и последние 50 сделок: сколько получили от клиента, сколько отдали, рыночный курс, комиссия и прибыль.
- Платежи — попытки оплаты (выдан адрес), оплачено, не оплачено, вернулись и оплатили после отмены, медианное время до оплаты, ждут оплаты. Воронка оплаты, причины отмен (таймер или оператор), платёжные системы и способы оплаты с конверсией.
- Вкладка «Поддержка» — обращений за период, сегодня и с начала месяца, сегодня по часам; первый ответ и время решения (медиана и среднее, доля в SLA); CSAT и доля довольных (4–5), распределение оценок и комментарии; очередь сейчас (ждут ответа, без оператора, просрочено); таблица по сотрудникам: тикеты, решено, ответы, первый ответ, решение, CSAT.
- Суммы в долларах — в статистике $7 800 вместо «7 800 USDT»; под числом всегда процент изменения (с нуля — +100%).
- Мини-график в каждой карточке — справа в карточке показателя, даже в маленькой. Цвет по смыслу: к лучшему — зелёный, к худшему — красный, меньше 1% изменения — жёлтый; так же окрашен процент рядом. Где меньше — лучше (не оплачено, время до оплаты), рост красный. Сравнение с прошлым таким же периодом, для «всего времени» — вторая половина периода с первой. Новые карточки: конверсия и маржа в «Обзоре», конверсия оплаты в «Платежах».
- Сетка виджетов bento-grid — карточки и графики можно перетаскивать и растягивать, раскладка запоминается в браузере. Графики — recharts, грузятся только на страницах статистики.
- Данные для статистики в заявке — рыночный курс, комиссия и стоимость сторон в USDT на момент заявки, страна клиента (от Cloudflare); время шагов оплаты ставит база. Старые заявки заполнены по журналу и курсу. Миграция 0008.
Сотрудники
- Статус в профиле — «В сети», «Отошёл», «Не в сети». Выбор пишется в журнал действий.
- Статус в меню профиля — строка на всю ширину меню: «В сети», «Отошёл», «Не в сети» с цветной точкой в «таблетке» с отступами, как у темы; выбранный подсвечен. Одна полоска над «Выйти» вместо двух.
- Автоматический статус — 30 минут без действий в админке: «Отошёл», если за компьютером работают, и «Не в сети», если компьютер без действий или экран заблокирован. Про компьютер браузер сообщает с разрешения сотрудника (строка «Простой компьютера» в меню профиля; Chrome, Edge, Яндекс, Opera). Без разрешения — сразу «Не в сети». Закрыл админку — через 3 минуты «Не в сети». Миграции 0009, 0010.
- Меню помнит раскрытые разделы — что сотрудник раскрыл или свернул в меню админки, таким и остаётся после перехода и перезагрузки; у каждого сотрудника своё.
- Подразделы журнала по ролям — «Владелец», «Операторы», «Поддержка», «Система» в меню журнала действий.
Безопасность и защита
- Очередь задач воркера под ролью приложения — схема pgboss передана роли приложения (миграция 0018), иначе воркер не запускался под ограниченной ролью. Журналы это не затрагивает.
- Сессии сотрудников — в «Настройки → Безопасность» видно, где открыта админка: сотрудник, IP, браузер, вход и последняя активность. Владелец завершает любую сессию — сотрудник сразу выходит.
- Разрешённые IP админки — список из ADMIN_ALLOWED_IPS и ваш текущий адрес; меняется пока только на сервере.
- Блокировки после неудачных входов — сколько попыток и на сколько закрывать вход задаёт владелец; список заблокированных и «Снять блокировку». Много неудачных входов в админку с одного IP за 15 минут — бан этого IP.
- Уровни доверия клиентов — «новый», «проверенный» (после N выполненных заявок), «подозрительный» (высокий риск AML, страна из списка, слишком много заявок за сутки). У каждого уровня свой лимит заявки в USDT; заявка подозрительного помечается на ручную проверку. Владелец может выставить уровень вручную. В заявке сохраняются IP клиента и уровень.
- Защита от злоупотреблений — не больше N заявок в час с одного IP и на один адрес выплаты. Сканеры (много ответов «не найдено», запросы к /.env, /wp-admin и подобным) банятся сами на заданное время. Баны вручную с причиной и сроком, снятие бана, список самых частых адресов за час. Сотрудников и адреса админки бан не касается.
- Сотрудники — вкладка в «Настройки → Безопасность»: почта, роль, в сети ли, 2FA, последний вход, свои разрешённые адреса. Добавить сотрудника: почта, роль и адреса (IP или подсеть с подписью, например «VPN операторов»); сервер выдаёт одноразовую ссылку на 24 часа, по ней сотрудник ставит пароль и подключает 2FA по QR. Второй владелец — только с подтверждением своим кодом 2FA. Роль и адреса меняются, 2FA сбрасывается новой ссылкой, сотрудника можно отключить (сессии завершаются сразу) и включить; удалить нельзя — на него ссылается журнал. Себя и последнего владельца не отключить и не понизить. Всё — в журнале действий, события «Новый сотрудник» и «Вход с чужого IP» — в уведомления. Миграция 0017.
- Свои адреса сотрудника — вход и каждый запрос админки проверяются по адресам этого сотрудника; пусто — только общие (ADMIN_ALLOWED_IPS). Владельца аварийные общие адреса пускают всегда.
- Роли доступа — таблица: что может владелец, оператор и поддержка. Пока только просмотр.
- Журнал действий сотрудников — меню «Журнал действий» в админке, видит только владелец. Пишутся входы, неудачные попытки входа (в том числе на несуществующую почту), выходы, настройка 2FA, выдача адреса оплаты, смена статуса заявки, автоотмена и создание владельца с сервера. У каждой записи IP и браузер.
- Фильтры журнала — сотрудник, действие (или все с заявками), поиск по заявке, почте, адресу или IP, даты. Щелчок по сотруднику или действию в таблице включает фильтр.
- Журнал нельзя изменить или удалить — правку, удаление и очистку (TRUNCATE) запрещает база, для журнала денег тоже.
- Отдельная роль базы для приложения — приложение подключается ролью приложения без прав менять журналы и снимать с них защиту. Выкатка сама создаёт пароль роли (APP_DB_PASSWORD в .env), миграции идут под владельцем базы.
- Проверка целостности журнала — номер, время и отпечаток записи ставит база, каждая запись хранит отпечаток предыдущей. На странице журнала видно, цела ли цепочка. Миграция 0007.
Уведомления
- Уведомления открывают подробности — нажатие на уведомление ведёт туда, где видно, что случилось: заявка — в её карточку, ошибка курса — в «Настройки → Курсы», неудачный вход — в журнал входов с этой почтой, бан — в «Злоупотребления», сотрудник — во вкладку «Сотрудники», сбой — в «Состояние системы». Под текстом — пояснение простыми словами; ошибка курса пишется как «Курс не обновился: не ответили Binance, OKX». Операторам ссылки только на заявки.
Интерфейс и оформление
- Полосы прокрутки везде — во вкладках, таблицах, списках и окнах тонкие, без светлой дорожки и видны только при наведении.
- Выбор цвета — образец цвета и поле HEX: можно вставить «#ec6727», «ec6727», короткое «ec6», с решёткой или без. Неверный ввод подсвечивается красным с подсказкой и прежний цвет не затирает. По щелчку на образец — поле оттенка и яркости, полоса цветов и готовые цвета палитры. Для вкладки «Дизайн».
- Полоса загрузки вверху страницы — на сайте и в админке, по образцу progress bar из HeroUI: при переходе быстро до середины, дальше ползёт медленно, когда всё загрузилось — быстро до конца и гаснет. Показывается, только если загрузка дольше 0,15 секунды; фоновые обновления её не включают.
- Таблицы по образцу settings64 — таблицы в админке и документации в одном стиле: скруглённая рамка, шапка на фоне страницы, основная строка и серая подпись в ячейке. Цвета наши.
Документация
- Версии проекта — одна версия на всё в корневом
package.json, сейчас 1.0.0-beta.1. Видна в «Что нового» (выпуск с датой, пометка «Бета» и «текущая версия»), внизу меню админки и в/api/health. Тест проверяет, что верхний выпуск истории совпадает с версией. - «Что нового» по темам — история изменений как документ: выпуски с «#», под ними темы и пункты «что сделано — подробности», справа оглавление «На этой странице». Сверху фильтр по теме и поиск.
- Команды запуска и выкатки — в «Запуске» команды вынесены в блоки кода, добавлены команды тестов и выкатки.
Состояние системы
- Раздел «Состояние системы» — пункт меню для всех сотрудников: сверху общий статус («Все системы работают», «Частичный сбой», «Сбой»), под ним плитки частей — API и база, воркер, курсы, WestWallet, Telegram-бот, вебхуки и уведомления, диск и размер базы. У каждой: статус (работает, частично, не работает, нет данных), время отклика, причина и когда проверялась; у курсов — какие площадки ответили. Страница обновляется сама раз в 30 секунд.
- Проверки раз в минуту — воркер проверяет: запрос к базе и ответ API; время последнего прохода курсов, автоотмены и отправки уведомлений; свежесть курса по направлениям и ответы Binance, OKX, CoinGecko; WestWallet — включена ли, заданы ли ключи и отвечает ли API с подписью; Telegram-бот — токен и getMe; очередь доставок — сколько ждёт, не доставлено за час и последняя ошибка; место на диске и размер базы. Если воркер три минуты не присылал проверок, API сам показывает его как «не работает».
- Полосы доступности за 90 дней — у каждой части полоса по дням: зелёный — работала, жёлтый — были сбои, красный — не работала больше 1% дня, серый — нет данных; процент доступности за 90 дней. При наведении — дата, процент и сколько времени часть была в каждом статусе. Подробные проверки хранятся двое суток, итоги по дням — 90 дней. Миграция 0016.
- Лента сбоев — сбой открывается сам, когда проверка падает две минуты подряд (одиночный тайм-аут сбоем не считается), обновляется, если стало хуже или лучше, и закрывается с записью «Восстановилось». Владелец пишет сбой вручную (часть или весь обменник, «не работает» или «частично»), добавляет записи с этапом «Расследуем» → «Нашли причину» → «Следим» → «Решено» и закрывает. Открытый ручной сбой тоже меняет общий статус. Каждое действие — в журнале действий; автоматические — от имени системы.
- Уведомления о смене статуса — новое событие «Состояние системы»: в Telegram и колокольчик в шапке админки, когда часть перестаёт работать или восстанавливается. Включено по умолчанию в новых настройках; если уведомления уже настроены, его нужно отметить в «Настройки → Интеграции и уведомления».
- Общий статус в /api/health — открытый адрес теперь отдаёт ещё
status: ok, degraded или down — без подробностей по частям.
1.0.0-beta.1 — 2026-10-18
Первая бета: обмен по 9 направлениям, выбор монеты, админка с заявками, звук новых заявок, темы, документация.
Обмен и заявки
- Выбор монеты с поиском и иконками — в форме обмена список монет с иконками (BTC, ETH, USDT, LTC, TON; у USDT значок сети). Поиск по коду, сети и названию по-русски и по-английски. Управление стрелками, Enter и Esc.
- Анимация выбора монеты — кнопка перетекает в окно, строки появляются по очереди.
- Ядро обменника — курсы по 9 направлениям, заявки, статусы.
- Раздел заявок в админке — список и карточка заявки, адрес оплаты в заявке (миграция 0006).
- Автоотмена — неоплаченные вовремя заявки отменяются сами.
- Кнопка монеты в тон полям — прямоугольная со скруглёнными углами, стоит в поле с одинаковым отступом 7px со всех сторон.
Уведомления
- Звук новых заявок — админка проверяет заявки раз в 15 секунд и на новую играет сигнал.
- Режимы звука — в меню профиля: без звука, дневной (тихо), средний, ночной (на полную и трижды). При выборе играет пример. Режим свой у каждого сотрудника.
- Мигание вкладки — если звук выключен или вкладка не открыта, мигает её заголовок («● Новая заявка»).
Интерфейс и оформление
- Переключатель темы на сайте — switch-button вместо кнопки «Светлая / Тёмная».
- Три значка темы в меню профиля админки — светлая, тёмная, как в системе.
- Смена темы кругом — новая тема расходится кругом от нажатой кнопки.
- Меню профиля из Kokonut UI — тема и выход удержанием кнопки.
- Новое меню админки — профиль наверху. «Заявки» и «Документация» раскрываются в подпункты, у статусов заявок счётчики. На компьютере меню сворачивается до иконок, над страницей путь до неё.
- Блоки Kokonut UI на будущее — сетка виджетов (для статистики), стопка уведомлений, загрузка файлов, кнопка со сменой текста, кнопка подписки с колокольчиком, кнопка комментария, кнопка с отменой. Серая гамма переведена на наши цвета.
- Меню админки слева — версия 6e3ed32.
- Обновление анимаций — библиотека motion обновлена до 12-й версии.
Документация
- Длинный код не раздвигает страницу — прокручивается вбок внутри блока.
- Разделы документации — история изменений, архитектура, план, запуск, защита, компоненты — отдельными пунктами меню.