Trufill
Доверие

Прозрачность

Что контракт может и чего не может — по строкам кода, а не по маркетингу. Параметры доверия, методология «лучшей цены» и как сообщить об уязвимости.

Стадия: Base mainnet — ограниченный срез; тестовые сетиИсторические замеры: 9–10 сентября 2026; редакция 28 сентября

Параметры доверия

Таблица описывает опубликованный код и исторические тестнет-замеры. Актуальное владение, привязка таймлока, ставка комиссии и версия каждого развёртывания требуют новой проверки в выбранной сети.

ПараметрКак в кодеЗначение
Обновляемость (proxy)Зависимости роутера — immutable, прокси нетНе обновляется Смена логики = новый деплой, а не подмена существующего.
Потолок комиссииMAX_FEE_BPS — константа30 / 10 000 = 0,30%. Не поднять никому, включая владельца.
Текущая комиссияfeeBps0 на Base mainnet (28.09.2026) и в тестовых замерах — без комиссии агрегатора; gas и комиссия пула сохраняются.
Кто меняет комиссиюonlyOwner, проверка ≤ MAX_FEE_BPSВладелец FeeSwitch, и только в пределах потолка.
Задержка на измененияParamTimelock.DELAY / GRACE_PERIOD2 суток ожидания, окно исполнения 14 суток. Заявка видна заранее; execute() может вызвать кто угодно — контроль это задержка, а не вызывающий. renounceOwnership отключён.
Смена роутера своповswapRouter — immutableНевозможна в существующем контракте. Другой роутер — это другой деплой по другому адресу.
Отказ от владенияrenounceOwnership() переопределён на revertЗапрещён: осиротевший таймлок оставил бы созревшие заявки, которые никто не отменит.

Governance проверяется по адресу и сети. Наличие ParamTimelock не означает, что FeeSwitch принадлежит ему. Нужно проверить владельцев, привязку FeeSwitch, Safe и подписантов. Исторические тестовые конфигурации менялись. Таблица не удостоверяет текущее владение — проверяйте по адресам ниже.

Развёртывание Base mainnet · chainId 8453 · 28.09.2026

Контракты верифицированы (Sourcify exact match и Basescan), исходники — закреплённая ревизия 637cffc839bba8000c94835a665720f064a4d658:

  • AggregatorRouter — 0x877A4Bb039c8146cfB8daAe36CfB5AE1e9BD1060
  • FeeSwitch — 0x802F0CA0F62bD66c2117B4392d8350578E442cdc · feeBps = 0, потолок 30 bps в байткоде;
  • ParamTimelock — 0x9a8F32F16FB9d99Ba26EE957d5Ca53798Ebf256C · задержка изменения комиссии 2 суток;
  • Владелец таймлока и получатель комиссии — Safe 0x7999EF46136a40A6769B1c2226510426689c22E7. Сегодня это 1-из-1: один ключ, то есть не мультисиг — компрометация одного ключа означает контроль над параметрами в пределах потолка и таймлока. Второй независимый ключ планируется до включения любой ненулевой комиссии.

Граница между контрактом и политикой. Ограничение первого среза одной парой (WETH / нативный USDC) и одним пулом Uniswap v3 обеспечивают шлюз и интерфейс, а не контракт: AggregatorRouter permissionless, прямой вызов с другой парой или пулом никем не блокируется. Onchain-списка разрешённых пар, лимита капитала и «выключателя» у контракта нет — обещать их значило бы приписать контракту свойства, которых в байткоде нет.

Методология «лучшей цены»

«Лучшая» означает наибольший ожидаемый выход среди доступных подключённых маршрутов для запроса после комиссии агрегатора и пула. Gas не вычтен из этой суммы. Это не сравнение со всеми агрегаторами или всеми площадками.

Какие источники опрашиваются

Шлюз опрашивает подключённые источники Uniswap v3 через QuoterV2 и v2-совместимые пулы выбранной сети. Набор ограничен конфигурацией; при недоступности части источников ответ может быть помечен degraded. Ни полнота рынка, ни отсутствие иных маршрутов этим не доказываются.

Как считается комиссия

Ставка в базисных пунктах читается с контракта FeeSwitch (не зашита в клиента) и вычитается из выхода. Показанное число — после этой комиссии. На Base mainnet и в опубликованном тестовом режиме ставка нулевая; gas и комиссия пула не исчезают.

Как показывается и защищается minOut

Для поддерживаемых токенов вы задаёте минимально приемлемый выход. Контракт проверяет его после вычета комиссии: userAmountOut < amountOutMinimum → revert. Комиссия не может протолкнуть вас ниже согласованного минимума — иначе обмен отменяется целиком. Риск токенов с комиссией на исходящем переводе раскрыт отдельно в рисках.

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

Защита от MEV и «сэндвичей»

Для поддерживаемых токенов защита сегодня — это amountOutMinimum и deadline в самой транзакции: вы не получите меньше своего минимума, а просроченная сделка не исполнится. Честно: приватного потока ордеров (private relay) пока нет. Поэтому на живой сети гарантируется нижний порог для поддерживаемой пары, а не точное равенство котировке.

Публичный дашборд точности

Страница точности котировок показывает сведённые сделки тестовых сетей; сделки Base mainnet появятся там после финализации и сверки второй, независимой реализацией (execheck) — производитель снимка для Base включается после первой финализированной сделки. Пока сделок Base в снимке нет, покрытие Base страницей не утверждается. Страница показывает поддерживаемый снимок с проверенным hash и допустимым возрастом сборки, разделяет показанное, минимум и выход из события, а также неопределённые случаи. Равенство в форк-тесте не гарантирует будущую цену.

Некастодиальность

Обмен не требует депозита на счёт сервиса, приватный ключ остаётся в кошельке. Это не исключает ошибку контракта, вредоносную подмену интерфейса или чрезмерное разрешение на перевод токенов. Проверяйте сеть, адрес и calldata перед подписью.

Аудит и сообщение об уязвимостях

Внешнего аудита нет. Первый mainnet-срез Base открыт 28.09.2026 при этом статусе. Статический анализ (Aderyn, Slither) аудитом не является. Проверки исходников, тесты и локальный форк не исключают уязвимостей; работа с реальными средствами без внешнего аудита несёт риск их потери. Публичная программа вознаграждений за уязвимости пока не запущена.

Исторический автоматический анализ не заменяет аудит. В проекте записан запуск Slither 10.09.2026. Его результаты относятся к тому исходному коду; они не удостоверяют новый релиз или безопасность системы целиком.

В исходниках есть тесты нестандартных токенов, повторного входа и ограничений swap. Даже успешный запуск на выбранных сценариях не доказывает, что риск ограничен одной транзакцией. Новый кандидат требует проверки на своём SHA.

Нашли проблему безопасности — напишите в Telegram @trufill. Машиночитаемые контакты и политика — в security.txt. Пожалуйста, дайте разумное время на исправление до публичного раскрытия.