Разработка NFT-лендинга (залог NFT)

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1 услугВсе 1306 услуг
Разработка NFT-лендинга (залог NFT)
Сложная
~1-2 недели
Часто задаваемые вопросы
Направления блокчейн-разработки
Этапы блокчейн-разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1258
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1170
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    873
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1092
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    563
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    830

Разработка NFT-лендинга (залог NFT)

Клиент приходит с запросом: «хотим дать пользователям возможность брать кредиты под JPEGi». За этой фразой скрывается один из самых инженерно нетривиальных классов DeFi-протоколов. Оценка залога по NFT — это не просто вызов latestPrice() у Chainlink-оракула. NFT неликвидны по природе: два токена одной коллекции могут отличаться в цене на 50x. Это делает стандартные подходы к overcollateralization из Aave или Compound малоприменимыми без серьёзной адаптации.

Две модели и почему они решают разные задачи

Протоколы NFT-лендинга делятся на два принципиальных класса: peer-to-peer (P2P) и peer-to-pool (P2Pool). Выбор архитектуры определяет почти всё — от модели оракула до механизма ликвидации.

P2P-лендинг (NFTfi, Arcade, Gondi): заёмщик листит NFT как залог, кредитор делает оффер с конкретными условиями. Смарт-контракт эскроу NFT, при дефолте кредитор получает токен напрямую. Никакого pool-риска, оракул нужен только опционально (для UI). Проблема — низкая скорость матчинга и плохой UX для заёмщика, который ждёт оффер часами.

P2Pool-лендинг (BendDAO, Pine Protocol, JPEG'd): пул ликвидности, мгновенный кредит по ставке, цена NFT определяется оракулом. Здесь и начинается самое интересное с инженерной точки зрения.

Главная проблема P2Pool: оценка неликвидного залога

Floor price — недостаточная защита от манипуляций

Большинство ранних протоколов использовали floor price коллекции как proxy для стоимости залога. BendDAO в августе 2022 года показал, что это критический риск: резкое падение floor price BAYC и CryptoPunks привело к каскадным ликвидациям, пул оказался на грани инсольвенции, протокол экстренно изменил параметры ликвидации через governance.

Проблема не только в волатильности. Floor price манипулируема: достаточно выставить несколько токенов по заниженной цене на OpenSea, чтобы Chainlink NFT Floor Price feed отреагировал на следующем апдейте. Атака стоит дёшево относительно потенциальной прибыли от дренажа пула.

Что мы используем вместо простого floor price

Многоуровневый оракул с несколькими источниками и временным усреднением:

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) — консервативный дисконт под ликвидационный стресс.

Health factor и механизм ликвидации 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);
    
    // Ликвидатор покрывает долг, получает NFT
    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);
}

Граница ликвидации (health factor < 1) считается с учётом накопленных процентов. Процентная ставка — переменная, через utilization rate кривую, аналогичную Compound (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 экономически стимулирует заёмщиков погасить долг или рефинансироваться, возвращая пул в здоровый диапазон utilization.

Flash loan и reentrancy в контексте NFT-лендинга

ERC-721 не имеет хука transferFrom в отличие от ERC-777, но 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-часовую задержку — это даёт пользователям время выйти при обнаружении проблемы.

Процесс работы

Аналитика (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 недель и критически важен перед мейннет-деплоем с реальной ликвидностью.