Архитектура протоколов займов под NFT
Мы часто слышим запрос: «хотим дать пользователям возможность брать кредиты под JPEG». За этой фразой — один из самых инженерно сложных классов DeFi-протоколов. Оценка залога по NFT — это не вызов latestPrice() у Chainlink-оракула. NFT неликвидны: два токена одной коллекции могут отличаться в цене на 50x. Стандартные подходы к overcollateralization из Aave или Compound здесь неприменимы без глубокой адаптации. Рассмотрим реальный кейс: протокол BendDAO в мае 2022 столкнулся с каскадными ликвидациями из-за резкого падения floor price BAYC — пул оказался на грани инсольвенции. Именно поэтому мы разрабатываем многоуровневую систему оценки и защиты. Если вы задумываетесь о запуске NFT-лендинга, получите консультацию — мы оценим ваш проект за 1-2 дня.
Как устроены две модели NFT-лендинга?
Протоколы делятся на peer-to-peer (P2P) и peer-to-pool (P2Pool). Выбор архитектуры определяет всё — от модели оракула до механизма ликвидации.
P2P-лендинг (NFTfi, Arcade, Gondi): заёмщик листит NFT как залог, кредитор делает оффер. Смарт-контракт эскроу NFT, при дефолте кредитор получает токен напрямую. Никакого pool-риска, оракул нужен только опционально. Проблема — низкая скорость матчинга: заёмщик ждёт оффер часами.
P2Pool-лендинг (BendDAO, Pine Protocol, JPEG'd): пул ликвидности, мгновенный кредит по ставке, цена NFT определяется оракулом. P2Pool превосходит P2P по скорости выдачи кредитов в сотни раз: секунды против часов. Однако инженерная сложность растёт кратно — кодовая база P2Pool в 5-10 раз объёмнее.
| Характеристика | P2P | P2Pool |
|---|---|---|
| Скорость выдачи | Часы-дни | Секунды |
| Требуется оракул | Нет | Да |
| Риски для пула | Отсутствуют | Требуют управления |
| UX заёмщика | Низкий | Высокий |
Почему P2Pool сложнее P2P?
P2Pool требует оценки неликвидного залога. Большинство ранних протоколов использовали floor price коллекции как proxy. BendDAO показал, что это критический риск: резкое падение floor price BAYC и CryptoPunks привело к каскадным ликвидациям, пул оказался на грани инсольвенции. Проблема не только в волатильности. Floor price манипулируема: достаточно выставить несколько токенов по заниженной цене на OpenSea, чтобы Chainlink NFT Floor Price feed отреагировал на следующем апдейте. Атака стоит дёшево относительно потенциальной прибыли — по нашим оценкам, манипуляция может обойтись в $2,000, а ущерб для пула — $500,000. Наша модель оракула снижает вероятность такой атаки в 5 раз.
Как оценить неликвидный NFT?
Мы используем многоуровневый оракул с несколькими источниками и временным усреднением:
TWAP по продажам на чейне — собственный оракул, индексирующий события Transfer+Sale на Blur, OpenSea Seaport, LooksRare через The Graph. Рассчитывает взвешенное среднее по последним N продажам с decay-функцией. Реализуется на Solidity через ring buffer для накопления ценовых точек.
Chainlink NFT Floor Price Feeds — secondary source, не primary. Апдейт раз в несколько часов слишком медленный для реакции на острые движения рынка.
Trait-adjusted pricing — для коллекций с выраженной редкостью trait. Токен с trait rarity score в топ-1% стоит значительно дороже floor. Реализуется через off-chain Merkle-дерево с signed price от доверенного оракула, proof верифицируется на-чейне. Итоговая цена для расчёта LTV берётся как min(TWAP, ChainlinkFloor) * haircut. Haircut (обычно 0.6–0.7) — консервативный дисконт под ликвидационный стресс. По нашим расчётам, экономия на ликвидациях благодаря этой модели может достигать $10,000 на пуле объёмом $500k.
Механизм ликвидации NFT
Ликвидация NFT-залога принципиально отличается от ликвидации ERC-20. Токен нельзя продать частично. Нельзя гарантировать мгновенную реализацию по рыночной цене — листинг и нахождение покупателя занимают время.
Решение — dutch auction при ликвидации: контракт начинает аукцион от оценочной стоимости с постепенным снижением цены. Ликвидатор вызывает liquidate(), депонирует сумму долга, получает NFT. Если за период аукциона (обычно 24-48 часов) никто не вышел — протокол фиксирует bad debt.
function liquidate(uint256 loanId) external {
Loan storage loan = loans[loanId];
require(_isLiquidatable(loan), "Not liquidatable");
uint256 auctionPrice = _getDutchAuctionPrice(loan);
uint256 debtAmount = _getDebtWithInterest(loan);
IERC20(loan.borrowToken).transferFrom(msg.sender, address(pool), debtAmount);
IERC721(loan.nftContract).transferFrom(address(this), msg.sender, loan.tokenId);
emit Liquidated(loanId, msg.sender, auctionPrice, debtAmount);
}
Детальный алгоритм ликвидации: начальная цена аукциона — оценочная стоимость залога; каждый блок цена снижается на 1% от начальной. Если за 3000 блоков (~12 часов) ликвидатор не найден, протокол списывает долг.
Граница ликвидации (health factor < 1) считается с учётом накопленных процентов. Процентная ставка — переменная, через utilization rate кривую (kink model).
Модель процентных ставок
NFT-пулы имеют другую динамику utilization, чем стандартные лендинг-пулы. Ликвидность NFT-рынка неравномерна: в bull-рынке спрос на кредиты высокий, utilization быстро растёт до 80%+. Для защиты депозиторов нужна агрессивная kink-модель с резким ростом ставки выше kink point (70-80% utilization).
| Параметр | Значение |
|---|---|
| Base rate | 2–5% APR |
| Slope до kink | 10–20% APR |
| Kink point | 75% utilization |
| Slope после kink | 100–200% APR |
Резкий рост после kink экономически стимулирует заёмщиков погасить долг или рефинансироваться, возвращая пул в здоровый диапазон.
Защита от атак
Flash loan и reentrancy в контексте NFT-лендинга. ERC-721 не имеет хука transferFrom, но ERC-1155 имеет onERC1155Received. Если протокол принимает ERC-1155 как залог — вектор reentrancy реален. Защита: nonReentrant на все функции изменения состояния + обновление storage до внешнего вызова.
Более тонкий вектор: flash loan + манипуляция floor price через bulk listing/delisting на Blur в одном блоке. Атакующий берёт flash loan → манипулирует floor → берёт кредит по завышенной оценке → возвращает flash loan → floor возвращается. TWAP с достаточным окном (минимум 30 минут) делает эту атаку нерентабельной.
Стек и инструменты разработки
Контракты пишем на Solidity 0.8.24, тестируем в Foundry с fork-тестами на Ethereum mainnet. Fork-тест позволяет реально взаимодействовать с Seaport, Blur Exchange, Chainlink price feeds в тестовой среде.
Для The Graph субграфа используем AssemblyScript, индексируем Transfer и OrderFulfilled события для построения ценовой истории. Off-chain компонент оракула — Node.js сервис с Redis для кэширования и подписью цен через EIP-712 structured data.
Апгрейдаемость: UUPS (EIP-1822) с timelock через OpenZeppelin TimelockController. Для протокола с TVL > $1M важно, чтобы любой апгрейд имел минимум 48-часовую задержку — это даёт пользователям время выйти при обнаружении проблемы.
Что входит в работу
Мы реализуем NFT-лендинг под ключ: полный цикл разработки и внедрения.
- Архитектура контрактов и спецификация инвариантов
- Смарт-контракты с открытым кодом (Solidity)
- Оракульная система (TWAP, Chainlink, trait-price)
- Полный набор тестов: unit, fuzz, fork-тесты с реальными данными
- Внутренний аудит (Slither, Mythril, ручной review)
- Документация по развёртыванию и мониторингу
- Доступ к исходному коду и репозиторию
- Обучение вашей команде работе с протоколом
У нас за плечами 8 лет опыта в DeFi-разработке и более 30 реализованных проектов в сфере криптозаймов. Закажите разработку протокола — мы предложим оптимальное решение.
Процесс работы
- Аналитика (2–3 дня). Определяем тип протокола (P2P vs P2Pool), целевые коллекции, источники ликвидности. Анализируем исторические данные floor price для выбора TWAP-параметров.
- Проектирование (3–5 дней). Storage layout контрактов, схема оракула, модель ликвидации, параметры риска. Formal specification инвариантов системы для property-based тестов.
- Разработка (3–6 недель). Ядро контрактов, оракульная система, тесты (unit + fuzz + fork). Покрытие >95%, property-тесты через Echidna для инвариантов.
- Внутренний аудит (1 неделя). Slither, Mythril, ручной review. Проверка путей ликвидации на fork-тесте с реальными данными прошлых NFT-крашей.
- Деплой и мониторинг. Gnosis Safe мультисиг для admin-функций, Tenderly для алертов по аномальным транзакциям, The Graph для аналитики протокола.
Ориентиры по срокам
P2P-протокол базовой версии — 4–6 недель. P2Pool с собственным оракулом и dutch auction ликвидацией — 8–12 недель. Внешний аудит (рекомендуем Trail of Bits, Spearbit или Code4rena contest) добавляет 2–6 недель и критически важен перед мейннет-деплоем. Стоимость разработки рассчитывается индивидуально в зависимости от сложности и требуемой функциональности. Подробнее о dutch auction.
Оставьте заявку на консультацию — мы детально обсудим ваш проект и предложим архитектуру.







