defi

Blend, XOXNO и SODAX: сравнение lending-пулов

Lending-пул это аналог банковского вклада в блокчейне: вкладчик вносит USDC или XLM, их занимают другие, а ему идут проценты. Банка при этом нет, его работу выполняет смарт-контракт. Blend, SODAX и XOXNO реализуют такой вклад для сети Stellar, и каждый по-своему. Ниже сравнение этих трёх реализаций.

Оглавление
  1. Как устроен lending-пул
  2. Три пула
  3. Куда идёт разница между ставками
  4. Кто управляет кодом и параметрами
  5. XOXNO
  6. SODAX
  7. Blend
  8. Оракулы
  9. Исходники, аудиты, документация
  10. Инциденты и текущее состояние
  11. Сводная таблица
  12. Итог
Данные сняты из сети 3–4 октября 2026 и могут измениться.

Как устроен lending-пул #

В lending-пул кладут актив, чтобы его занимали другие. Поставщик вносит, например, USDC и получает проценты. Заёмщик вносит залог в другом активе и берёт USDC из того же пула. Встречной сделки между ними нет: все поставщики одного актива делят общий запас и общий доход.

Ставку задаёт утилизация, доля запаса, которая сейчас занята. Чем она выше, тем дороже заём и тем больше получает поставщик. В рынке USDC у SODAX на день снятия занято 83% запаса: заёмщик платит 7.7% годовых, поставщик получает 5.8%. Разница складывается из незанятой части и доли, которую пул удерживает.

Заём всегда меньше залога. Сколько можно занять под залог, задаёт параметр пула, а стоимость залога пул узнаёт у оракула, контракта, который сообщает цены. Если залог дешевеет до порога, позицию ликвидируют: любой может погасить долг и забрать залог со скидкой. Если цена упала быстрее, чем прошла ликвидация, остаётся плохой долг, который залог не покрывает. Его гасят из страхового слоя, если он есть, а иначе делят между поставщиками.

Вывести депозит можно, пока в пуле есть незанятый запас. Когда занято всё, вывод ждёт, пока заёмщики вернут долг или появятся новые депозиты. В обычных условиях до этого доходит редко: с ростом утилизации растёт ставка, заёмщикам становится дорого держать долг, а новых поставщиков привлекает доходность.

Swap-пулы я разбирал в прошлой статье. Lending-пул отличается от них тем, что внесённый актив остаётся тем же: внесли USDC, заберёте USDC с процентами.

Сохранность депозита зависит от четырёх вещей, по ним и идёт сравнение:

  • код: контракт, в котором лежит запас, и возможность его заменить;
  • параметры: кто решает, что принимается в залог и на каких условиях;
  • оракул: неверная цена залога позволяет занять больше, чем он стоит;
  • страховой слой: кто платит за плохой долг.

Три пула #

Blend SODAX XOXNO Lending
Где работает пул Stellar Sonic, вход из Stellar через мост Stellar
Основа собственные контракты, изолированные пулы контракты Aave v3, судя по их составу собственные контракты; схема hub и spoke, как в Aave v4
Размер 163 млн $ 2.8 млн $, общий для всех сетей; в рынке USDC 0.88 млн $ внесено 0.13 млн $ в Stellar
Контракты развёрнуты V2: апрель 2025 хранилище на Stellar с апреля 2025 август 2026
Ставка по USDC на день снятия 6.7% в пуле Fixed 5.8% 1.4%
Страховой слой backstop у каждого пула, сейчас обесценен нет: отдельного страхового контракта в пуле нет нет; плохой долг делится между поставщиками

Blend это фабрика пулов: любой может развернуть свой пул со своим набором активов, оракулом и админом. Почти весь объём лежит в пуле Fixed: 151 млн $ в XLM, которые почти никто не занимает, и 55 млн $ в USDC, из которых 43 млн заняты. Размер в таблице посчитан без занятого. Дальше сравниваются два пула Blend, Fixed и YieldBlox, потому что устроены они по-разному.

SODAX держит пул в сети Sonic. Пользователь из Stellar отдаёт токены контракту AssetManager в Stellar, на Sonic выпускается их обёртка, и в пул кладётся она. Вывод идёт в обратном порядке, по сообщению с Sonic.

XOXNO Lending работает в двух сетях, MultiversX и Stellar; здесь речь только о развёртывании в Stellar. Депозиты лежат в одном контракте Pool. Активы в нём разделены на три общих запаса, в терминах протокола hub: Core, RWA и AMM. Вносить залог и занимать можно через один из восьми наборов рынков, в терминах протокола spoke. У каждого набора свои правила: что принимается в залог, что можно занять и на каких условиях. Наборы такие: Blue Chip, Stables & FX, AMM Collateral, Aquarius Ecosystem, Commodities и три для токенизированных облигаций, Etherfuse RWA, Centrifuge RWA и Ondo RWA. Например, в наборе Aquarius Ecosystem залогом служат AQUA и LP-токены Aquarius, а занять можно USDC, XLM, EURC и PYUSD. Так же устроен Aave v4. В репозитории XOXNO Aave не упоминается, код там свой, написан на Rust.

Куда идёт разница между ставками #

Заёмщик платит больше, чем получает поставщик, по двум причинам. Первая арифметическая: проценты платит только занятая часть запаса, а делятся они на весь запас. Вторая: пул удерживает долю процентов, и у каждого из трёх она уходит в своё место.

Пример на рынке USDC у SODAX. Заёмщики платят 7.7% на 83% запаса, на весь запас это 6.4%. Пул удерживает десятую часть, поставщикам остаётся 5.8%.

Доля с процентов Кому Где записано
Blend Fixed 20% вкладчикам backstop, через аукцион bstop_rate в Config пула CAJJ…BXBD
Blend YieldBlox 0% всё получают поставщики bstop_rate в Config пула CCCC…GYFS
SODAX 10% у всех активов в контракт treasury 0x9967…D24a в Sonic getReserveConfigurationData у 0x775A…82Ed; RESERVE_TREASURY_ADDRESS у aToken актива
XOXNO 10% у USDC, EURC и USDT0, 20% у XLM, 30% у AQUA на аккаунт GAVW…EEBP, тот же, что владеет Governance reserve_factor в markets.json; Accumulator в хранилище Controller CAUC…E5JX

У Blend удержанная доля это плата за страховой слой: её получают те, кто первым теряет при плохом долге. Пул копит её в самом активе, в поле backstop_credit резерва. Когда накоплено от 200 $, любой может запустить аукцион: покупатель забирает накопленные проценты и платит токенами backstop, а эти токены зачисляются вкладчикам backstop пула.

После инцидента с Comet аукцион не запускается. Его стартовая цена считается через оценку токена backstop, а она теперь нулевая, и запуск завершается ошибкой. Доля продолжает копиться в пуле: на день снятия в Fixed лежит 78.9 тысячи USDC, которые никому не выплачены.

У XOXNO и SODAX удержанная доля это доход протокола, страхового слоя за ней нет. У XOXNO к нему добавляются часть залога при ликвидации и комиссия за мгновенные займы, 0.09%. Средствами treasury у SODAX распоряжается контракт FeeTreasury 0xf2E2…b3A4 (getFundsAdmin()), а его владелец это обычный адрес с одним ключом.

Кто управляет кодом и параметрами #

Контракт в Soroban может заменить собственный код, если в нём есть функция, которая это делает. Адрес остаётся прежним, все вызовы идут в новый код, а вызвать предыдущую версию по тому же адресу нельзя. Поэтому для депозита важны три вещи: можно ли заменить код, кто это может и сколько времени проходит между решением и исполнением.

У аккаунта Stellar подписанты и пороги записаны в сети. У контракта подписантов нет, у него есть владелец, записанный в хранилище. Проверка сводится к цепочке: владелец контракта, владелец владельца, и так до аккаунта с ключами. Один подписант с весом 1 при нулевых порогах это одиночный ключ; ключ с весом 0 ничего подписать не может.

XOXNO #

Контрактом Pool CBXR…BKXO владеет Controller CAUC…E5JX, им владеет Governance CC44…C2AD, а Governance принадлежит команде.

По документации и ответу разработчика3 управление задумано так:

  • Любое изменение проходит через Governance как отложенная операция: её предлагают, она ждёт задержку, после чего исполнить её может кто угодно.
  • Заменить код Pool, Controller и самого Governance может предложить только владелец, и ждёт такая операция 7 дней. Остальные изменения ждут 24 часа.
  • Владелец это мультисиг.
  • Без задержки можно только ужесточать: роль GUARDIAN ставит паузу и закрывает рынки, роль ORACLE сужает допуск цен. Снять паузу или ослабить параметры можно только отложенной операцией.
  • Оракул XOXNO CDA3…22JM и swap aggregator CCVE…F3TR в Governance не входят: команда считает их отдельными от основного протокола и хочет менять без задержки, агрегатор ради новых DEX, оракул ради активов, которых нет у Reflector и RedStone. Владеть ими будет тот же мультисиг.
Это ещё не развёрнуто. Пока идёт аудит, владелец Governance это аккаунт GAVW…EEBP с одним ключом (по словам разработчика, холодный кошелёк), а задержка для любых операций 12 леджеров, около минуты: поле MinDelay в хранилище Governance, в constants.rs это названо значением на период аудита. Оракулом и swap aggregator тот же ключ управляет напрямую. С развёртывания 27 августа код Governance и Controller меняли трижды, Pool дважды.

SODAX #

Что Значение в сети Где записано
Sonic: владелец PoolAddressesProvider, который может заменить код пула Safe 0x36BB…fd6f owner() у 0x036a…8c7b
Sonic: ACL admin, pool admin, emergency admin тот же Safe getACLAdmin() там же; isPoolAdmin, isEmergencyAdmin у ACLManager 0x33C1…4Dc1
Sonic: владелец ProxyAdmin и AssetManager тот же Safe owner() у 0x1263…9Bb6 и 0x60c5…37C0
Sonic: Safe 2 из 3, модулей нет getThreshold(), getOwners(), getModulesPaginated()
Sonic: владелец Hub Manager 0x8417…cB77 адрес 0x6be3…e2e2 без кода, один ключ owner()
Stellar: админ AssetManager CCGF…HCJ3 аккаунт GDNT…HGBJ: три подписанта с весом 1, пороги 2 / 2 / 2, основной ключ с весом 0 Admin в хранилище; страница аккаунта
Stellar: замена кода AssetManager функция upgrade; четыре версии, последняя от 8 сентября 2026 вкладка Interface и поле Versions

Три владельца Safe это обычные адреса, модулей у Safe нет. Таймлока нет ни в Sonic, ни в Stellar: владельцами записаны сам Safe и сам аккаунт, без контракта задержки между ними, так что две подписи исполняют замену кода сразу. Одиночных ключей на замене кода нет. Роль pool admin, кроме Safe, держат ещё два контракта: GhoSteward, которым владеет тот же Safe, и 0x243b…d18e, служебный контракт настройки рынков; кто может его вызвать, я не выяснил. Ролей risk admin и asset listing admin не держит никто (события RoleGranted у ACLManager). Что может Hub Manager, из документации узнать нельзя.

Депозит из Stellar попадает в пул через мост, и у моста свои ключи.

Что Значение в сети Где записано
Проверка сообщений с Sonic 2 валидатора, порог 2 Validators, ValidatorThreshold в хранилище Connection CDFQ…OPEP
Доставка сообщений аккаунт GCHC…7OHA, один ключ Executor в хранилище AssetManager
Лимиты на вывод у bnUSD 20 000 с восстановлением 10 000 в сутки, у SODA 500 000 и 250 000 в сутки; ещё у обёрнутых токенов других сетей MaxAvailable, RatePerSecond в хранилище RateLimit CD7Q…DV3R

Сообщение с Sonic принимается по подписям валидаторов, так что подделать его может тот, кто контролирует оба ключа. Состав валидаторов и порог меняет админ контракта (функции update_validators, set_validators_threshold), тот же мультисиг 2 из 3. USDC и XLM эти лимиты не ограничивают.

Запас USDC у каждой сети свой, и между сетями он не перераспределяется. На день снятия вывести в Stellar можно было около 1.5 тысячи USDC при 148 тысячах свободных в пуле; большая сумма выводится в другую сеть или частями.

Blend #

В развёрнутых контрактах пула, backstop, фабрики и эмиттера нет функции замены кода, и в исходниках нет вызова, который её выполняет. Хеши wasm пула, backstop CAQQ…3IM7 и фабрики CDSY…4QSU в сети равны файлам релиза v2.0.0. Оба пула работают на том же wasm, с которым были созданы.

Вместо владельца кода у каждого пула есть админ с ограниченными правами. Он может менять параметры активов и добавлять новые, но только через очередь с задержкой 7 дней. Может остановить займы или займы вместе с депозитами; вывод и погашение при этом остаются. Забрать средства или изменить код админ не может.

Это подход без доверия: условия, на которых внесён депозит, не зависят ни от чьего ключа. В Fixed нет и админа, так что правила пула те же, что в день его создания.

Fixed YieldBlox Где записано
Пул CAJJ…BXBD CCCC…GYFS
Код wasm a41fc53d…1350e, одна версия тот же wasm, одна версия поля Hash и Versions; pool_v2.0.0.wasm в релизе
Админ пула аккаунт GAX2…JMPC с единственным ключом веса 0 контракт голосования CANS…A6FQ Admin в хранилище пула
Путь изменения параметров нет, параметры заморожены 2 дня до голосования, 3 дня голосование, 2 дня таймлок, затем 7 дней очереди Settings контракта голосования: vote_delay 34 560, vote_period 51 840, timelock 34 560 леджеров
Совет нет аккаунт GBCA…ZSS4, 4 из 7 Council там же; страница аккаунта
Статус On-Ice On-Ice status в Config пула, значение 3

Оракулы #

Цена залога определяет, сколько под него можно занять. Тот, кто управляет ценой, может вывести деньги из пула, не трогая его код, поэтому оракул сравнивается отдельно.

Источники цены Кто может изменить Где записано
Blend Fixed Reflector через адаптер CCVT…OATS никто: админ адаптера это аккаунт эмитента BLND GDJE…EZYY, ключ веса 0 при порогах 88 oracle в Config пула; Admin и Oracles в хранилище адаптера
SODAX цены Pyth через адаптеры, один источник на актив, запасного оракула нет Safe 2 из 3 как pool admin, сразу getSourceOfAsset() и getFallbackOracle() у оракула 0x1283…50B9
Blend YieldBlox Reflector, фид DEX, через адаптер CD74…MXXR аккаунт GBCA…ZSS4, мультисиг 4 из 7, без задержки; может добавлять источники новым активам, но не менять заведённые oracle в Config пула; Admin и Oracles в хранилище адаптера; add_asset в исходниках
XOXNO у XLM, USDC, EURC и USDT0 два независимых источника, Reflector и RedStone, с допуском расхождения 5–10%; у части активов один источник; у AQUA Reflector и собственный оракул XOXNO агрегатор цен CBGU…NSMV через Governance; собственный оракул CDA3…22JM напрямую владельцем, без задержки markets.json; Owner в хранилище агрегатора и оракула

У XOXNO для основных активов цена сверяется по двум источникам, и это сильнее, чем один источник у Blend; так настроены не все активы, и состав источников я брал из конфигурации в репозитории, с сетью не сверял. Собственный оракул XOXNO и swap aggregator в цепочку Governance не входят: ими владеет тот же аккаунт напрямую. По словам разработчика, так и останется: после аудита они перейдут под общий мультисиг, но без задержки. Собственный оракул при этом задуман как дополнительный источник для активов, которых нет у Reflector и RedStone; сейчас через него идёт цена AQUA.

У Blend адрес оракула записан в конфигурации пула при создании, и функции его сменить нет. Адаптер тоже не даёт заменить источник уже заведённого актива: add_asset отклоняет повторное добавление, а функций удаления и замены в нём нет. Остаётся сам Reflector. Обоими его контрактами, CAFJ…4DLN и CALI…LE6M, управляют аккаунты с семью подписантами и порогом 4. У контрактов есть функция update_contract, код меняли трижды. Так что замороженный пул Fixed всё же зависит от одного изменяемого контракта, источника цен.

Исходники, аудиты, документация #

Blend SODAX XOXNO
Исходники контрактов blend-contracts-v2 публичных не нашёл; открыт только SDK rs-lending-xlm
Код в сети сверяется с исходниками да, хеши wasm равны файлам релиза v2.0.0 сверить не с чем да, хеши wasm равны файлам релиза v1.0.1
Отчёты аудита Code4rena и Certora: аудит и формальная верификация восемь отчётов, включая контракты Soroban спецификации Certora; отчётов в репозитории не нашёл
Адреса контрактов docs.blend.capital docs.sodax.com networks.json
Управление описано в документации да, pool management нет да, threat model, с предупреждением проверять развёрнутые значения

Документация XOXNO сама говорит, что владельцев и задержку надо проверять в сети, и называет нынешнюю задержку временной. У SODAX об управлении в публичной документации нет ничего: кто держит ключи Safe, узнать из неё нельзя.

Инциденты и текущее состояние #

22 февраля 2026 из пула YieldBlox в Blend вывели больше 10 млн долларов. Код Blend при этом не меняли и не взламывали. Атакующий поднял цену USTRY на неликвидном рынке примерно в сто раз, с 1.06 до 107 долларов, оракул принял эту цену, и под залог стоимостью меньше 200 тысяч долларов были заняты около 1 млн USDC и 61 млн XLM1. Причиной разборы называют настройку пула: актив с неликвидным рынком был принят в залог по цене с DEX. Пул Fixed с замороженными параметрами этот случай не затронул.

25 августа 2026 пострадал Comet CAS3…VEAM, пул BLND-USDC, токен которого Blend использует как обеспечение backstop2. Comet в Blend не входит: это отдельный AMM со взвешенными пулами, код которого перенесён на Soroban с Balancer V1, протокола из сети Ethereum. Ошибка появилась при переносе. Функция обмена не проверяла, что входной и выходной токен различаются; при обмене токена на самого себя запись о его запасе сохранялась дважды, вторая затирала первую, и учёт пула расходился с балансом. Разницу можно было забрать через ввод и вывод ликвидности. В исходном Balancer V1 такой обмен безвреден, потому что обе записи указывают на одну ячейку хранилища. Атакующий вывел 717 519 USDC, остаток, около 190 тысяч USDC и 23 млн BLND, забрали тем же способом участники сообщества, чтобы вернуть. Для атаки использовались мгновенные займы из пула Fixed, сами пулы Blend уязвимости не содержали.

Токен backstop после этого не держит стоимость, поэтому backstop возвращает нулевую оценку (вызов pool_data отдаёт blnd 0 и usdc 0), пулы не проходят порог обеспечения и стоят в статусе On-Ice: новые займы отключены, вывод и погашение работают. Первого слоя защиты от плохого долга нет, и если плохой долг возникнет, он будет разделён между поставщиками пула.

Исправить это нельзя по той же причине, по которой Blend не требует доверия. Comet нельзя ни обновить, ни остановить, потому что аккаунт его админа заблокирован, а заменить токен backstop в Blend V2 нельзя. По словам Script3, команды, которая развивает Blend, V2 со временем будет свёрнут, и обсуждается V3.

У SODAX публичных инцидентов я поиском не нашёл. У XOXNO в Stellar их тоже нет, но это мало о чём говорит: развёртыванию на день снятия пять недель, в пуле 0.13 млн $, и протокол ещё толком не запустился.

Сводная таблица #

Blend Fixed SODAX Blend YieldBlox XOXNO
Размер 163 млн $ 2.8 млн $ по всем сетям 0.15 млн $ 0.13 млн $
Ставка по USDC 6.7% 5.8% 8.6% 1.4%
Доля пула с процентов по USDC 20%, в backstop 10%, в treasury 0% 10%, владельцу
Замена кода пула невозможна 2 из 3, сразу; вход через мост на двух валидаторах невозможна по плану мультисиг и 7 дней; до конца аудита один ключ и 1 минута
Смена параметров невозможна 2 из 3, сразу голосование, около 2 недель по плану мультисиг и 24 часа; до конца аудита один ключ и 1 минута
Оракул заморожен, один источник; сам Reflector под мультисигом 4 из 7 один источник, Pyth; меняет Safe 2 из 3, сразу один источник; заведённые активы не меняются два источника; свой оракул у владельца, без задержки
Исходники сверяются с сетью да публичных не нашёл да да
Инциденты backstop обесценен в августе 2026, On-Ice не нашёл 10 млн $ в феврале 2026; backstop обесценен, On-Ice нет, но пул работает пять недель

Доверие в этих пулах устроено по-разному. В Blend Fixed доверять никому не нужно: правила заданы кодом и не меняются, но и исправить ничего нельзя. В YieldBlox доверие перенесено на голосование и на мультисиг, который управляет оракулом. В SODAX вкладчик доверяет двум ключам из трёх и двум валидаторам моста, в XOXNO мультисигу команды с задержкой в 7 дней, а до конца аудита одному ключу.

Итог #

alex0007:~$ tldr stellar-lending-pools
  • Чтобы убедиться в свойствах пула, придётся самому прочитать его контракты и посмотреть, кто ими управляет. Всё это есть в сети
  • Сначала выяснить, можно ли заменить код: есть ли у контракта функция замены и сколько версий уже было
  • Пройти цепочку владельцев до аккаунта с ключами и посмотреть подписантов и пороги
  • Посмотреть, какая задержка записана в сети между решением и исполнением и успеет ли вкладчик за это время вывести деньги
  • Выяснить, на какие контракты задержка не распространяется: оракул цен владелец часто может заменить сразу
  • Узнать, откуда пул берёт цену залога: сколько источников, кто может их менять и ликвиден ли рынок актива
  • Узнать, кто платит за плохой долг и чем обеспечен страховой слой, если он есть
  • Выписать чужие контракты, от которых зависит пул: токены, мост, источники цен. У каждого свой код и свои владельцы
  • Сверить хеш кода в сети с файлами релиза, если исходники опубликованы
  • В Blend вкладчику нужно доверять меньше всего: код не меняется, а в Fixed закреплены и параметры. При этом из трёх пулов он пострадал сильнее всех: два инцидента за 2026 год, оба через внешние контракты, оракул и токен backstop
¹ Инцидент YieldBlox DAO. BlockSec: blocksec.com. Halborn: halborn.com.
² Script3. Comet BLND-USDC LP Incident, Post Mortem, 28 августа 2026: x.com/script3official.
³ XOXNO. Ответ разработчика в Discord проекта, 4 октября 2026, на вопросы о задержке, владельце Governance, оракуле и swap aggregator.
Обсуждение в r/Stellar. Blend liquidity pool holders have lost 10M USDC.
Данные. Хранилище контрактов Stellar прочитано через RPC, подписанты и пороги аккаунтов через Horizon, история версий через API stellar.expert. Контракты Sonic прочитаны через RPC: владельцы, слоты прокси EIP-1967, порог и владельцы Safe, балансы токенов USDC каждой сети в корзине. Доли с процентов: у Blend `bstop_rate` в конфигурации пула и `backstop_credit` резерва в сети, запуск аукциона проверен симуляцией `new_auction`, у SODAX reserve factor и адрес treasury из контрактов в Sonic, у XOXNO reserve factor, состав hub и spoke из конфигурации в репозитории (их число совпадает с `LastHubId` и `LastSpokeId` в хранилище Controller) и адрес получателя из хранилища Controller. Размеры и ставки Blend и XOXNO: API DefiLlama, ставка поставщика без токенов-наград; доля Blend Fixed посчитана от суммы lending-протоколов Stellar там же. Размер пула SODAX: сумма по всем 31 активу из `getATokenTotalSupply` и `getTotalDebt` по ценам оракула пула, 5.7 млн $ внесено и 2.9 млн $ занято. Ставка и объём рынка USDC в SODAX: интерфейс xlm.domains, 881 904 USDC внесено, 731 638 занято. Исходники: XOXNO/rs-lending-xlm, blend-capital/blend-contracts-v2. Адреса и аудиты SODAX: docs.sodax.com, icon-project/sodax-sdks.
Что не проверено. Логика кода ни одного из протоколов; отчёты аудита я не читал, только их наличие. Соответствие wasm исходникам пересборкой: для XOXNO и Blend сверены хеши с файлами релизов, сами релизы я не пересобирал; код оракул-адаптера Blend и Reflector с исходниками не сверял. Источники цен XOXNO взяты из конфигурации в репозитории, с сетью не сверены. Остальные пулы Blend, у каждого свой админ и свой оракул. У SODAX: валидаторы на стороне Sonic, полномочия Hub Manager и то, кто может вызвать второй служебный контракт с ролью pool admin. Как ключи хранятся вне сети.