Интеграция с NFTfi
NFTfi — это peer-to-peer протокол кредитования под залог NFT. Заёмщик блокирует NFT в смарт-контракте, получает ETH или USDC от конкретного кредитора, и обязуется вернуть через фиксированный срок с процентом. Если не возвращает — NFT переходит кредитору. Никакого ликвидационного oracle, никакого AMM: чистый fixed-term loan с NFT как collateral.
Интеграция нужна в двух сценариях: вы строите лендинг-платформу поверх NFTfi или хотите дать пользователям вашего маркетплейса / NFT-проекта возможность брать займы под коллекцию напрямую из интерфейса.
Архитектура протокола и точки интеграции
NFTfi работает через два ключевых контракта: NftfiHub (реестр и роутер) и DirectLoanFixedOffer (конкретный тип займа с фиксированной ставкой). С версии v2.1 протокол добавил DirectLoanFixedOfferRedeploy с поддержкой ERC-1155.
Основной flow:
-
Borrower вызывает
approveдля NFT на адрес контракта NFTfi, затем принимает оффер черезacceptOffer - Lender создаёт подписанный off-chain оффер (EIP-712 structured data), который хранится в базе NFTfi или вашем backend
- При
acceptOfferконтракт переводит NFT в себя, отправляет tokens заёмщику, минтит обликацию lender-у в виде promissory note NFT (ERC-721) - По истечении срока:
payBackLoanот заёмщика илиliquidateOverdueLoanот кредитора
Структура оффера (EIP-712)
Интеграция через подпись офферов — это место, где чаще всего ошибаются. Оффер содержит:
struct Offer {
uint256 loanPrincipalAmount;
uint256 maximumRepaymentAmount;
uint256 nftCollateralId;
address nftCollateralContract;
uint32 loanDuration; // в секундах
uint16 loanAdminFeeInBasisPoints;
address loanERC20Denomination;
address referrer;
}
Подпись создаётся через signTypedData в ethers.js или viem, используя domain separator контракта NFTfi. Критично: domain separator включает chainId — оффер, подписанный для Ethereum mainnet, не валиден на Goerli, даже если адрес контракта совпадает.
Типичная ошибка: неправильная обработка промежуточных статусов займа
Займ может находиться в состояниях: Active, Repaid, Liquidated, или попасть в edge case — когда блок с payBackLoan майнится после истечения loanDuration, но liquidateOverdueLoan ещё не вызван. Контракт принимает оба вызова в короткое окно. Если фронтенд не обновляет статус атомарно — пользователь видит активный займ, который уже ликвидирован.
Решение: слушаем события LoanStarted, LoanRepaid, LoanLiquidated через ethers.js provider.on или подписку через The Graph subgraph (NFTfi поддерживает официальный субграф). Subgraph предпочтительнее для UI — даёт возможность делать сложные запросы (все активные займы по коллекции, история займов адреса).
Что входит в интеграцию
SDK / библиотека. NFTfi предоставляет официальный JavaScript SDK (@nftfi/js), который абстрагирует работу с контрактами. Для кастомных интеграций часто проще работать напрямую через ABI — полный контроль над параметрами и gas estimation.
Subgraph запросы. GraphQL для получения списка активных офферов, истории займов, данных по конкретной коллекции. Интегрируем через @apollo/client или urql.
Валюты займа. NFTfi поддерживает ETH, USDC, DAI и другие одобренные ERC-20. Нужна логика approve для каждой валюты от lender перед созданием оффера.
Referral система. Протокол поддерживает referrer address в офферах — способ монетизировать интеграцию через комиссию от протокола.
Процесс работы
Изучение ABI и тестирование на Goerli (1 день). Разворачиваем тестовый NFT, создаём займ вручную через контракт, проверяем все события.
Backend интеграция (1-2 дня). Хранение и трансляция офферов, webhooks на события займов.
Frontend компоненты (1-2 дня). Форма создания оффера, отображение активных займов, flow погашения.
Ориентиры по срокам
Базовая интеграция — создание и принятие офферов, мониторинг займов — 3-5 дней. Полноценный lending UI с аналитикой по коллекциям и автоматическим созданием офферов — 1-1.5 недели.







