Как это работает
Что гарантирует код, а не маркетинг
Каждое утверждение ниже — с указанием контракта и функции. Не «надёжная архитектура», а конкретные инварианты, которые вы или автоматический оценщик проверяете сами. Границы и слабые места названы прямо.
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 не под паузой). Принципала и потолка это не касается: изъять чужой вклад или выпустить сверх потолка нельзя. Вынос в мультисиг запланирован, это приоритет перед монетизацией.
Индексатор не устойчив к реорганизациям цепи.Лента истории строится чтением событий; при реорганизации может кратко отставать — на балансы и инварианты цепи это не влияет.