📌 Про Saturn мы разбирались в прошлых постах, да и вцелом много кто писал в пабликах. Напомню базу
🔵️ Логика Saturn: вкладываешь USDC → получаешь USDat (стейблкоин 1:1).
🔵️ Стейкаешь USDat → получаешь sUSDat (yield-vault, ≈11.5% годовых).
🔵️ Доходность идёт от STRC - привилегированных акций MicroStrategy с дивидендом, фондируемым через BTC-казну. TVL ≈$198M. Аудиты: Three Sigma + Certora (дважды).
💀 Но Kyp.one также присвоил протоколу Grade надежности: F, Score 0/100, уровень риска: Critical
🚩 Выявленны 3 критичных ред-флага:
1️⃣ Один человек с одним ключом контролирует все контракты
🤩 Три из четырёх ядровых контрактов (USDat, sUSDat, WithdrawalQueueERC721) управляются одним EOA — адрес
0x6101...6820. Этот же ключ держит DEFAULT_ADMIN_ROLE на vault'е sUSDat, где хранятся все деньги пользователей.🤩 На практике: один человек, один приватный ключ, одна транзакция - и $198M можно вывести куда угодно. Никакого согласования, никакой задержки, никакого второго подписанта.
🤩 Контракты написаны через UUPS upgradeable proxy - это архитектура, где логику контракта можно заменить. Владелец прокси-апгрейда (тот одиночный кошелек) может поставить новую имплементацию, которая, например, переводит все токены на его адрес. Это занимает один блок (≈12 секунд на Ethereum).
2️⃣ Оракул цены можно подменить мгновенно
🤩 Есть контракт
StrcPriceOracle - он определяет, сколько стоит STRC относительно USDat. От этой цены зависит NAV (net asset value) vault'а и соответственно, сколько ты получишь при выводе.🤩 Функция
updateOracle() - смена адреса оракула - не имеет timelock'а. Атакующий (или сам владелец EOA) может мгновенно подменить оракул на свой, выставить произвольную цену STRC, и либо обрушить NAV (все выводят меньше), либо задрать его до небес и выкачать ликвидность.🤩 Для сравнения: SwapFacility (контракт для mint/redeem) защищён TimelockController с 72-часовой задержкой. Оракул — нет.
3️⃣ 20% допуск на конвертацию USDat <>STRC
🤩 Параметр
toleranceBps = 2000 означает, что конвертации между USDat и STRC могут проходить с отклонением до 20% от «справедливой» цены. Этот параметр контролирует off-chain PROCESSOR_ROLE без каких-либо on-chain ограничений скорости.🤩 Проще говоря: невидимый оффчейн-оператор может проводить конвертации с 20%-м дисконтом/премией к рынку. KYP рекомендует сократить до 5–10%.
🗒 Что хорошо (для справедливости)
🟢️Chainlink-оракул STRC с перепроверкой актуальности цены;
🟢️10/10 контрактов публичны и верифицируемы;
🟢️ReentrancyGuard везде (защита от повторного вызова контракта в процессе работы);
🟢️Защита от inflation attack в ERC4626;
🟢️USDat обеспечен 1:1 через M-токен (токенизированные трежери через M0).
🤓 Выводы
🤩 Код написан грамотно - два Tier-1 аудита (Certora), правильные паттерны, правильная математика.
🤩 Проблема не в коде, а в управлении: всё завязано на один одиночный кошелек без каких-либо сдержек. При $198M TVL это значит: протокол держится на доверии к одному конкретному человеку с одним ключом. Если ключ угонят (фишинг, компромат, инсайд) - деньги уходят за 12 секунд. Без хака, без эксплойта, без предупреждения.
🤩 KYP.one ставит это как автоматический dealbreaker именно потому, что это не риск «если взломают», а риск «когда ключ попадет не в те руки».