Прозрачность
Что контракт может и чего не может — по строкам кода, а не по маркетингу. Параметры доверия, методология «лучшей цены» и как сообщить об уязвимости.
Параметры доверия
Таблица описывает опубликованный код и исторические тестнет-замеры. Актуальное владение, привязка таймлока, ставка комиссии и версия каждого развёртывания требуют новой проверки в выбранной сети.
| Параметр | Как в коде | Значение |
|---|---|---|
| Обновляемость (proxy) | Зависимости роутера — immutable, прокси нет | Не обновляется Смена логики = новый деплой, а не подмена существующего. |
| Потолок комиссии | MAX_FEE_BPS — константа | 30 / 10 000 = 0,30%. Не поднять никому, включая владельца. |
| Текущая комиссия | feeBps | 0 на Base mainnet (28.09.2026) и в тестовых замерах — без комиссии агрегатора; gas и комиссия пула сохраняются. |
| Кто меняет комиссию | onlyOwner, проверка ≤ MAX_FEE_BPS | Владелец FeeSwitch, и только в пределах потолка. |
| Задержка на изменения | ParamTimelock.DELAY / GRACE_PERIOD | 2 суток ожидания, окно исполнения 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. Пожалуйста, дайте разумное время на исправление до публичного раскрытия.