Настройка роялти NFT на OpenSea
С конца 2022 года роялти NFT перестали быть гарантированными. Blur запустил агрессивную политику нулевых роялти для привлечения трейдеров, OpenSea был вынужден ответить — и в 2023 году оба маркетплейса сделали creator royalties опциональными на уровне платформы. Результат: большинство вторичных продаж проходит с нулевыми роялти, если коллекция не использует on-chain enforcement механизмы.
Два подхода к роялти и их реальность
Off-chain роялти (стандарт маркетплейсов)
EIP-2981 — стандарт on-chain объявления роялти. Контракт реализует royaltyInfo(tokenId, salePrice), возвращает (receiver, royaltyAmount). OpenSea, Blur, Rarible читают эту информацию и отображают в UI.
Но исполнение — на усмотрение маркетплейса. Технически любой смарт-контракт для торговли может игнорировать EIP-2981 и не перечислять роялти. Что большинство агрегаторов и делает.
On-chain enforcement через transfer restrictions
Единственный способ гарантировать роялти — ограничить трансфер токена: разрешать его только через whitelist'ed контракты (маркетплейсы), которые платят роялти. Это Operator Filter Registry, который Yuga Labs ввела для BAYC в 2022 году.
Проблема: рестрикции на трансфер конфликтуют с ERC-721 стандартом. Агрегаторы, не попавшие в whitelist, не могут торговать токенами. Часть пользователей воспринимает это как ограничение прав на собственный актив. В итоге Yuga Labs и OpenSea к 2024 году отказались от Operator Filter как механизма.
На практике: большинство новых коллекций реализуют EIP-2981 для корректного отображения в маркетплейсах, но не ограничивают трансферы. Роялти — джентльменское соглашение с маркетплейсом.
Практическая настройка
Контракт
OpenZeppelin предоставляет ERC2981 extension:
import "@openzeppelin/contracts/token/common/ERC2981.sol";
contract MyNFT is ERC721, ERC2981 {
constructor() {
_setDefaultRoyalty(msg.sender, 500); // 5% = 500 basis points
}
}
_setDefaultRoyalty устанавливает роялти для всей коллекции. _setTokenRoyalty(tokenId, receiver, feeNumerator) — для отдельного токена (актуально для 1/1 арта с разными авторами).
OpenSea collection settings
Помимо on-chain EIP-2981, OpenSea позволяет настроить роялти в Collection Settings:
- Процент (до 10%)
- Адрес получателя
- Верификация через подпись владельца контракта
Если в контракте нет EIP-2981 — OpenSea берёт настройки из панели. Если есть — on-chain данные имеют приоритет (в зависимости от версии интерфейса).
Сплитование роялти между несколькими получателями
Если роялти нужно делить между командой — не пишем логику сплита в NFT-контракте. Используем 0xSplits или Splits Protocol: деплоим сплит-контракт с долями, его адрес указываем как receiver в EIP-2981. При поступлении ETH на адрес сплита любой может вызвать distribute() — средства разделяются по настроенным долям автоматически.
Ориентиры по срокам
Настройка EIP-2981 в существующем контракте (если нет) и верификация в OpenSea — 2-3 часа. Включает: проверку текущего контракта, добавление EIP-2981 если отсутствует (или деплой нового), настройку в OpenSea Collection Settings, проверку отображения роялти.







