Как это работает

Что гарантирует код, а не маркетинг

Каждое утверждение ниже — с указанием контракта и функции. Не «надёжная архитектура», а конкретные инварианты, которые вы или автоматический оценщик проверяете сами. Границы и слабые места названы прямо.

1 · Архитектура и граница доверия

Где что живёт — и что через границу не проходит

Схема: три зоны и красная линия, которую ключ не пересекает
Устройство клиента
Приватный ключсоздан из seed, лежит только здесь
Подпись транзакцийпроисходит на устройстве
ключ не переходит
На цепи (zkSync)
Токен обязательствавыпуск/сжигание, потолок
Обеспеченностьпубликует потолок, аттестация
Биржа · стейкингобмен, накопление
Вне цепи (сервер)
Индексаторчитает события цепи для ленты
APIне хранит ключ; из кошелькового — адрес

Сервер не может подписать за клиента и не хранит средства — он читает цепь и обслуживает интерфейс. Полномочие тратить средства есть только у ключа на устройстве.

2 · Инварианты, которые обеспечивает код

Проверяемые утверждения — с контрактом и функцией

Исходный код всех контрактов опубликован и верифицирован — совпадает с репозиторием байт-в-байт. Откройте адрес, где лежат средства, и прочитайте Solidity сами: не «поверьте, что код такой», а «проверьте». Каждый инвариант ниже держит сеть, а не приложение — обойти через интерфейс или через нас нельзя.

Выпуск не может превысить подтверждённый потолок

Чеканка отклоняется, если totalSupply() + amount больше подтверждённого резерва. Проверка — в контракте токена; интерфейс её не обходит.

контракт OLTINфункция mintпотолок — контракт 0x9413F602…

Устаревшее подтверждение останавливает выпуск само

Если аттестация старше 1 часа (maxAgeReserve = 3600), чеканка ревертит. Перестали подтверждать — выпуск замирает. Отказ в безопасную сторону.

контракт OLTINфункция mint · maxAgeReserve

Вклад заперт на 7 дней — досрочно не может никто

Каждый депозит создаёт лот с lockedUntil = now + 7 дней. Вывод берёт только из разблокированных лотов. Ни администратор, ни кто-либо другой не снимает раньше срока.

контракт Стейкингфункция unstake · LOCK_PERIOD

Администратор не может тронуть чужой вклад

Вывод работает только с лотами msg.sender — ограничение вшито в саму функцию, а не в правила приложения. У администратора нет пути к средствам вкладчика.

контракт Стейкингфункция unstake (msg.sender)

Ключ клиента не покидает устройство

Кошелёк выводит ключ из seed на устройстве и подписывает локально. Сервер не хранит ключ и не может подписать; из кошелькового у него — только публичный адрес (учётные данные вроде Telegram-id хранятся, но не дают доступа к средствам).

клиент lib/walletбэкенд — только wallet_address
Путь денег

Что происходит при покупке, обмене и продаже

Схема: восемь шагов, каждый подписан действием
1
Клиент вносит сумычерез фиатные рельсы партнёра
2
Разрешает бирже списатьподпись на устройстве
3
Покупает обязательствобиржа чеканит токен — но только в пределах подтверждённого потолка
4
Держит в некастодиальном кошелькеключ у клиента
5
Переводит другомуили вносит в стейкинг под доход
6
Продаёт обратнобиржа сжигает токен
7
Получает сумы из казны биржирасчёт на цепи
8
Выводит через рельсы партнёрафиат на стороне эмитента
Роли и полномочия

Кто что может — и чего не может никто

Может

Публикатор — устанавливает потолок обеспечения (в проде это партнёр)
Биржа — чеканит/сжигает токен, в пределах потолка. Роль MINTER держит ровно один адрес — контракт биржи, не человеческий ключ (проверяется воспроизведением событий RoleGranted/RoleRevoked)
Клиент — подписывает только свои операции

Не может никто

Выпустить токен сверх потолка
Снять чужой вклад до срока
Подписать за клиента / достать его ключ
3 · Стек с обоснованием

Каждый выбор — с причиной, а не логотип

Почему zkSync Era

Стоимость транзакции

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

Почему некастодиальный кошелёк

Эмитент не держит чужие средства

Ключ у клиента — меньше операционной и регуляторной нагрузки на партнёра, нет «горячего» хранилища чужих денег.

Почему без апгрейд-механизма

Правила нельзя поменять задним числом

Контракты неизменяемы — ни мы, ни кто-либо не перепишет логику под уже выпущенное. Цена размена: исправление требует нового контракта и миграции.

4 · Дисциплина разработки

Проверяемо в открытом репозитории

405
тестов · 204 контракты · 165 бэкенд · 36 фронт
CI на PR
гейты до слияния, без глушилок
Экшены запинены по SHAsquash-only + автоудаление ветокpush protection

Процесс ревью — часть продукта: значимые блокеры (дренаж средств, обход аутентификации, гонка на резерве, двойная эмиссия) пойманы адверсариальным ревью. Всё это читается в репозитории напрямую.

Открыть репозиторий на GitHub →
5 · Ограничения — прямо

Что мы называем сами

Точная самооценка — не слабость, а сигнал зрелости. Проект без слабых мест читается как реклама.
Тестовая сеть.zkSync Era Sepolia; токены не имеют реальной стоимости — это доказательство работоспособности, не боевой выпуск.
Внешнего аудита не было.Внутренний адверсариальный ревью-процесс работает; независимый аудит — до боевого запуска.
Контракты неизменяемы.Намеренно — правила не переписать задним числом. Цена: исправление требует нового контракта и миграции живых позиций.
Управление на одном ключе.Административные роли пока на едином EOA. Под паузой пользователь не может ничего (вклад/вывод/награда) — а наградный фонд администратор при этом вывести может (withdrawRewardPool не под паузой). Принципала и потолка это не касается: изъять чужой вклад или выпустить сверх потолка нельзя. Вынос в мультисиг запланирован, это приоритет перед монетизацией.
Индексатор не устойчив к реорганизациям цепи.Лента истории строится чтением событий; при реорганизации может кратко отставать — на балансы и инварианты цепи это не влияет.