Все кейсы

Fortulox2026fortulox.com

Крипто-лотерея на USDT, где каждый розыгрыш можно проверить самому

Суть за 10 секунд

Лотерея на USDT, где результат каждого розыгрыша может пересчитать любой человек. Из архива бэкенда мы за два дня собрали сайт, кабинет, админку, верификатор и Telegram-бота.

28
страниц: сайт, кабинет, админка
73
эндпоинта API
59
таблиц в базе
10/10
проверок честности розыгрыша
66
автотестов
72
публичных URL на двух языках
3
домена: сайт, кабинет, админка
2
дня от архива до демо
Fortulox

Задача

Нужно было построить поверх готовой экономики всё, что видит игрок и оператор, и сделать честность проверяемой: чтобы результат розыгрыша мог пересчитать любой человек, а не только мы.

Результат

Рабочее демо полного цикла на трёх доменах: игрок регистрируется, покупает пропуск, участвует в розыгрыше и сам проверяет результат. Реальные деньги выключены до лицензии и юридических данных заказчика.

Что сделано

  • Бренд и дизайн-система Luck Observatory: знак, палитра, типографика, страница design-lab с живыми компонентами
  • Публичный сайт на Next.js 16 и React 19: главная, «как это работает», честность, розыгрыши, результаты, статус, справка, ответственная игра, 9 юридических страниц, EN и RU
  • Кабинет игрока на отдельном домене: регистрация и вход, покупка пропуска, билеты, кошелёк, вывод, адресная книга, настройки
  • Сессии в базе с cookie HttpOnly, Secure, SameSite=Strict только на домене кабинета; пароли argon2id
  • Оркестратор розыгрышей: commit-reveal сида, снимок участий с деревом Меркла, выбор победителей без смещения, пакет доказательств
  • Независимый верификатор: проверка розыгрыша в браузере и из командной строки, 10 проверок на каждый розыгрыш
  • Админка на третьем домене за тремя замками: basic auth, закрытый шлюз в nginx, пароль и TOTP; 7 ролей, двойное подтверждение выводов, неизменяемый журнал
  • Ответственная игра: лимиты, самоисключение, проверка права на участие в транзакции покупки под блокировкой
  • API на NestJS: 26 контроллеров и 73 эндпоинта, идемпотентность платежей, блокировки на уровне базы
  • Telegram-бот с вебхуком и Mini App для просмотра розыгрышей
  • Инфраструктура: три службы systemd, nginx на пять server-блоков, Let's Encrypt, скрипт выкладки, журнал проверок EVIDENCE и журнал решений DECISIONS в репозитории

Экраны

Изучить детали — полная картина

С чего начали

Заказчик принёс архив: экономика, леджер, платежи и выводы, написанные прежним исполнителем. Сайта не было, кабинет был заглушкой, сессии жили в памяти процесса. Экономику менять запретили: всё должно работать ровно как в архиве.

Мы завели в репозитории три документа и вели по ним всю работу: список задач, журнал проверок с доказательствами и журнал решений на случай, когда архив, заказчик и техзадание говорят разное.

Сайт и бренд

Дизайн-система Luck Observatory: тёмная сцена, кислотный акцент, знак в виде разрезанной диафрагмы. Отдельная страница design-lab показывает живые компоненты. Сайт на Next.js 16, английский и русский, 72 публичных адреса без единой битой ссылки.

На телефоне блоки не «всплывают» при прокрутке. В каждой секции одно движение, которое сообщает факт, и оно играет, когда блок в середине экрана.

Кабинет и админка

Кабинет вынесен на отдельный домен, чтобы cookie сессии не была видна основному сайту. Игрок регистрируется, покупает пропуск, видит билеты и кошелёк, выводит выигрыш на адрес из адресной книги, ставит себе лимиты или самоисключение.

Админка живёт на третьем домене и закрыта тремя замками: basic auth в nginx, секретный заголовок-шлюз и пароль с TOTP. Семь ролей, выводы подтверждают двое, журнал действий нельзя изменить.

Честность, которую можно проверить

До розыгрыша публикуется обязательство по сиду. После розыгрыша публикуются сид, снимок участий с корнем дерева Меркла и пакет доказательств. Победители выбираются без смещения.

Верификатор написан отдельным пакетом и не использует код розыгрыша. Проверить результат можно в браузере на странице розыгрыша или из командной строки. На каждый розыгрыш десять проверок.

Инженерия

API на NestJS: 26 контроллеров и 73 эндпоинта. База PostgreSQL: 59 таблиц, 132 индекса, четыре триггера. Деньги хранятся только целыми микро-USDT. Покупка идёт в транзакции под блокировкой, платежи идемпотентны.

66 автотестов и 59 сценарных скриптов на живой базе. Выкладка одним скриптом, три службы systemd, пять server-блоков nginx.

Честно о том, что не доделано

  • Это демо без реальных денег: платежи и выводы симулируются до лицензии и юридических данных заказчика.
  • Источник случайности пока публичная фикстура. Для боевого режима выбран путь через внешний маяк случайности, решение записано, реализации ещё нет.
  • Сайт закрыт от индексации до запуска, поэтому SEO, карта сайта и аналитика впереди.

Стек Next.js 16React 19NestJSDrizzle ORMPostgreSQLRedis / BullMQTypeScriptVitestTelegram Bot APInginx / systemd

заявка

Расскажите идею. Пары строк достаточно.

Ответим в течение рабочего дня в удобном вам мессенджере. Никаких рассылок.

Или сразу в Telegram: @lovelysup

Сюда нужен @ник, телефон или почта — иначе мы вас не найдём.
Удобный способ связи

Отправляя, вы соглашаетесь с обработкой данных для ответа на заявку.