Прозрачность
Что контракт может и чего не может — по строкам кода, а не по маркетингу. Параметры доверия, методология «лучшей цены» и как сообщить об уязвимости.
Параметры доверия
Значения ниже прочитаны из задеплоенных контрактов (сеть Ethereum Sepolia) и совпадают с опубликованным исходным кодом.
| Параметр | Как в коде | Значение |
|---|---|---|
| Обновляемость (proxy) | Зависимости роутера — immutable, прокси нет | Не обновляется Смена логики = новый деплой, а не подмена существующего. |
| Потолок комиссии | MAX_FEE_BPS — константа | 30 / 10 000 = 0,30%. Не поднять никому, включая владельца. |
| Текущая комиссия | feeBps | 0 — обмен без комиссии. |
| Кто меняет комиссию | onlyOwner, проверка ≤ MAX_FEE_BPS | Владелец FeeSwitch, и только в пределах потолка. |
| Задержка на изменения | ParamTimelock.DELAY / GRACE_PERIOD | 2 суток ожидания, окно исполнения 14 суток. Заявка видна заранее; execute() может вызвать кто угодно — контроль это задержка, а не вызывающий. renounceOwnership отключён. |
| Смена роутера свопов | swapRouter — immutable | Невозможна в существующем контракте. Другой роутер — это другой деплой по другому адресу. |
| Отказ от владения | renounceOwnership() переопределён на revert | Запрещён: осиротевший таймлок оставил бы созревшие заявки, которые никто не отменит. |
Точно о текущем тестнете. Таймлок и мультисиг — это целевая топология для мейннета. Прямо сейчас в тестовой сети владелец FeeSwitch — один ключ деплойера (0xda60…fede), а таймлок задеплоен, но ещё не назначен владельцем и ни к чему не привязан (feeSwitch = 0x0). Это сделано намеренно: пока комиссия равна нулю, параметры теста должны оставаться настраиваемыми без двухсуточного ожидания. Передача владения таймлоку — отдельный осознанный шаг перед мейннетом.
Методология «лучшей цены»
«Лучшая» здесь означает наибольший нетто-выход — что вы получите на руки после всех издержек, — а не наименьшую заявленную цену без учёта комиссии.
Какие источники опрашиваются
Движок котировок параллельно спрашивает пул Uniswap v3 (через SwapRouter02) и любой v2-совместимый пул — как чужой, так и наш собственный. Опрос параллельный; если часть источников недоступна, ответ помечается как degraded, а не отбрасывается целиком.
Как считается комиссия
Ставка в базисных пунктах читается с контракта FeeSwitch (не зашита в клиента) и вычитается из выхода. Показанное число — уже нетто. Сейчас ставка равна нулю.
Как показывается и защищается minOut
Вы задаёте минимально приемлемый выход. Контракт проверяет его после вычета комиссии: userAmountOut < amountOutMinimum → revert. Комиссия не может протолкнуть вас ниже согласованного минимума — иначе обмен отменяется целиком.
Защита от MEV и «сэндвичей»
Защита сегодня — это amountOutMinimum и deadline в самой транзакции: вы не получите меньше своего минимума, а просроченная сделка не исполнится. Честно: приватного потока ордеров (private relay) пока нет. Поэтому на живой сети гарантируется нижний порог, а не точное равенство котировке.
Публичный дашборд точности
Публичного дашборда котировок пока нет — это план. Сейчас свойство «котировка = факт» подтверждается воспроизводимыми тестами на форке (расхождение ноль).
Некастодиальность
«Мы не можем распорядиться вашими средствами» — не пункт соглашения, а свойство конструкции: у сервиса нет счетов, на которых лежали бы ваши деньги, и нет ваших ключей. Токены входят и выходят в пределах одной транзакции, поэтому между транзакциями сервису красть нечего — даже при полном взломе инфраструктуры.
Аудит и сообщение об уязвимостях
Внешнего аудита пока нет. Он предшествует мейннету, и до него в проекте нет реальных средств, реальной кастодии и мейннет-ключей. Публичная программа вознаграждений (Immunefi/HackenProof) — план после аудита.
Нашли проблему безопасности — напишите в Telegram @trufill. Машиночитаемые контакты и политика — в security.txt. Пожалуйста, дайте разумное время на исправление до публичного раскрытия.