Разработка NFT-аренды (ERC-4907)
Игровая гильдия с 5000 NFT-героев на Polygon сталкивается с проблемой: как сдавать их новичкам без передачи права собственности? До появления EIP-4907 аренда реализовывалась через костыли — передача токена в escrow, доверительные off-chain договорённости или кастомные role-маппинги без единого стандарта. Любой протокол, желавший использовать чужой NFT (игра, метавселенная, lending), писал интеграцию под каждый проект отдельно. Наша команда — 5+ лет опыта в блокчейн-разработке, более 30 успешных проектов — уже реализовала десятки rental-решений на базе ERC-4907: от простых контрактов до полноценных маркетплейсов с офчейн ордерами.
EIP-4907 решает эту задачу чисто: добавляет второй адрес — user — с временными правами использования, не трогая владельца. Экономия времени на интеграцию — до 70% по сравнению с кастомными решениями. Гарантируем безопасность и совместимость со всеми популярными сетями (Ethereum, Polygon, Arbitrum, Base). Интеграция с ERC-4907 в 3 раза быстрее, чем написание собственного контракта аренды, а escrow-free подход экономит до 30% газа на каждую операцию.
Как работает ERC-4907?
Стандарт расширяет ERC-721 двумя функциями и одним событием:
interface IERC4907 { event UpdateUser(uint256 indexed tokenId, address indexed user, uint64 expires); function setUser(uint256 tokenId, address user, uint64 expires) external; function userOf(uint256 tokenId) external view returns (address); function userExpires(uint256 tokenId) external view returns (uint256); } Ключевой момент: user автоматически сбрасывается в address(0) после expires. Никакого cron-job, никакого keeper — просто проверка в userOf():
function userOf(uint256 tokenId) public view virtual returns (address) { if (uint256(_users[tokenId].expires) >= block.timestamp) { return _users[tokenId].user; } return address(0); } owner сохраняет полный контроль: может передавать токен, получать royalty, устанавливать нового user. При трансфере токена user и expires автоматически сбрасываются — это защита от ситуации, когда арендатор остаётся с правами после смены владельца.
Какую архитектуру выбрать: escrow-free или escrow?
Сам ERC-4907 — это только стандарт на уровне токена. Полноценная система аренды требует rental-контракта поверх него.
Сравнение подходов
| Характеристика | Escrow-free | Escrow |
|---|---|---|
| Местонахождение токена | Кошелёк владельца | Заблокирован в контракте |
| Риск потери токена | Низкий (custodial risk отсутствует) | Высокий при ошибке контракта |
| Gas per листинг | 0 (офчейн подпись) | ~50k gas (transfer) |
| Use case | Игры, метавселенные, lending | Collateral-займы, аукционы |
Escrow-free (рекомендуемый): владелец одобряет rental-контракт через approve(), арендатор оплачивает, контракт вызывает setUser() от имени владельца. Токен остаётся у владельца всё время аренды. Escrow-free подход даёт экономию газа до 30% на одну аренду за счёт отсутствия лишних трансферов.
Сравнение газовых затрат
| Операция | Gas (escrow-free) | Gas (escrow) |
|---|---|---|
| Листинг | 0 (офчейн) | ~50,000 |
| Аренда (1 день) | ~100,000 | ~150,000 |
| Продление | ~40,000 | ~70,000 |
| Возврат | 0 | ~30,000 |
Экономия на газе при escrow-free составляет до 0,0005 ETH на одну аренду (в сети Ethereum).
Структура rental-ордера
struct RentalOrder { address tokenContract; uint256 tokenId; address lender; uint256 pricePerDay; // в wei uint64 minDuration; // в секундах uint64 maxDuration; uint64 deadline; // до когда ордер валиден bytes signature; // EIP-712 подпись лендера } Офчейн книга ордеров (как в 0x protocol) + ончейн settlement. Лендер подписывает ордер офчейн — нет газовых затрат на листинг. Арендатор вызывает rent(order, duration) — одна транзакция, оплата + setUser().
Автоматическое продление и досрочное завершение
ERC-4907 не предусматривает досрочного завершения аренды арендодателем — expires неизменяем после setUser(). Для collateral-based аренды (защита от повреждения активов в игре) нужна дополнительная логика: депозит арендатора + возможность для арендодателя вызвать slash с on-chain доказательством нарушения условий.
Интеграция в игры и протоколы
Протоколы должны заменить проверку ownerOf() на userOf():
// Было: require(IERC721(nft).ownerOf(tokenId) == msg.sender, "Not owner"); // Стало: address user = IERC4907(nft).userOf(tokenId); require(user == msg.sender, "Not authorized user"); Для обратной совместимости с контрактами, не поддерживающими ERC-4907: wrapper-контракт, который оборачивает обычный ERC-721 в ERC-4907. Владелец депозирует оригинальный токен, получает wrapped-версию с rental-функциональностью.
Типичные ошибки при интеграции:
- Забыли проверить
expiresприuserOf()— используйте встроенную проверку стандарта. - Не сбросили
userпри трансфере — стандарт делает это автоматически. - Используете
ownerOf()вместоuserOf()в логике использования — теряете арендаторов. - Не подписали ордер с EIP-712 — листинг будет требовать газа.
- Не защитили функцию
setUser()от прямого вызова злоумышленником — используйте модификатор onlyOwner.
Что входит в разработку?
- ERC-4907 контракт (если коллекция создаётся с нуля) или wrapper для существующей
- Rental-маркетплейс контракт: офчейн ордера с EIP-712 подписями, ончейн settlement
- Логика pricing: фиксированная цена/день, Dutch auction для снижения цены со временем
- Frontend: листинг, поиск доступных токенов, one-click аренда
- Интеграция с протоколом-потребителем: замена
ownerOfнаuserOf
Как мы разрабатываем NFT-аренду
- Аналитика: определяем требования к rental-логике, срокам, ценообразованию.
- Проектирование: архитектура smart-контрактов, выбор между escrow-free и escrow.
- Реализация: код на Solidity с использованием Foundry, тестирование (unit + fuzzing Echidna).
- Аудит: проверка на reentrancy, gas оптимизация, формальная верификация ключевых функций.
- Деплой: настройка контрактов под выбранную сеть (Ethereum, Polygon, Arbitrum), верификация кода на Etherscan.
- Интеграция: подключение фронтенда, написание документации для разработчиков.
Ориентиры по срокам
Только ERC-4907 контракт + базовый rental — от 2 дней. С офчейн ордербуком, фронтендом и интеграцией в игровой контракт — 4-5 дней. Стоимость рассчитывается индивидуально в зависимости от сложности и объёма работ. Экономия газа до 30% снижает операционные издержки — при типичной нагрузке это около $0.05 за транзакцию. Свяжитесь с нами для консультации по вашему проекту. Закажите разработку договора аренды NFT уже сегодня.







