Потеря роялти на Blur — проблема, знакомая владельцам NFT-коллекций. Принудительное применение роялти NFT на Blur возможно только через OperatorFilterRegistry. Без него даже стандарт ERC-2981 не гарантирует выплат. Мы настроим защиту за час, восстановив доход от вторичных продаж. На основе опыта с 50+ коллекциями мы подготовили пошаговое руководство.
Blur официально подтверждает принудительное применение роялти для контрактов, зарегистрированных в OperatorFilterRegistry. Проблема в том, что большинство разработчиков ограничиваются ERC-2981, надеясь на добросовестность маркетплейсов. Но Blur не проверяет ERC-2981 без дополнительного фильтра. OperatorFilterRegistry решает это: контракт с модификатором onlyAllowedOperator блокирует переводы через неавторизованные площадки.
Как работает принудительное роялти на Blur?
Принудительное применение строится на двух механизмах: внедрение стандарта ERC-2981 и регистрация в OperatorFilterRegistry. Стандарт ERC-2981 задаёт on-chain роялти, а OperatorFilter принудительно применяет их на Blur. Для уже задеплоенных контрактов без поддержки ERC-2981 используйте Manifold Royalty Registry — ретроактивное решение без изменения кода.
ERC-2981: on-chain роялти
ERC-2981 — минимальный стандарт: контракт реализует функцию royaltyInfo(tokenId, salePrice), возвращающую получателя и сумму. Если контракт уже задеплоен без ERC-2981, добавить его в immutable контракт невозможно. Опции: задеплоить новый контракт с миграцией или зарегистрировать роялти через off-chain реестры (Manifold).
Manifold Royalty Registry — универсальное решение: owner старого контракта регистрирует получателя и процент без изменения кода. Поддерживается Blur, OpenSea, Rarible. Для новых контрактов используйте ERC2981 из OpenZeppelin с _setDefaultRoyalty(receiver, feeNumerator) в constructor. feeNumerator из 10000: 500 = 5%.
Почему OperatorFilter гарантирует выплаты?
Blur требует регистрацию в OperatorFilterRegistry для принудительных роялти. Контракт, использующий OpenZeppelin’s OperatorFilterer, переопределяет transfer-функции с модификатором onlyAllowedOperator. Этот механизм блокирует торговлю неавторизованными маркетплейсами, не соблюдающими роялти. Для уже задеплоенных контрактов без апгрейда принудительное применение невозможно — только ERC-2981 через Manifold как best effort.
| Метод | Принудительность | Сложность внедрения | Ретроактивность |
|---|---|---|---|
| ERC-2981 | Нет (на Blur) | Низкая (1-2 дня) | Нет |
| OperatorFilter | Да | Средняя (2-4 часа) | Нет |
| Manifold Registry | Частичная | Низкая (1 час) | Да |
OperatorFilter принуждает соблюдать роялти в 100% случаев на Blur, тогда как ERC-2981 без фильтра даёт 0% гарантии. Это ключевое различие — выбор OperatorFilter в 3 раза эффективнее для защиты доходов. Потеря роялти может достигать значительных сумм ежемесячно; настройка защиты окупается за короткое время.
Пример кода: интеграция DefaultOperatorFilterer
import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/common/ERC2981.sol"; import "operator-filter-registry/src/DefaultOperatorFilterer.sol"; contract MyNFT is ERC721, ERC2981, DefaultOperatorFilterer, Ownable { constructor() ERC721("MyNFT", "MNFT") { _setDefaultRoyalty(msg.sender, 500); // 5% } function _beforeTokenTransfer( address from, address to, uint256 tokenId, uint256 batchSize ) internal override(ERC721, OperatorFilterer) { super._beforeTokenTransfer(from, to, tokenId, batchSize); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC2981) returns (bool) { return super.supportsInterface(bytes4 interfaceId); } } Что делать, если ваш контракт уже задеплоен?
Если контракт immutable и не поддерживает ERC-2981, используйте Manifold Royalty Registry. Это off-chain реестр: вы регистрируете получателя и процент, а Blur и другие маркетплейсы считывают данные оттуда. Процесс занимает 1-2 часа и не требует повторного деплоя. Однако это не даёт 100% принудительности — некоторые маркетплейсы могут игнорировать реестр.
Процесс настройки
- Анализ контракта (1-2 часа). Проверяем наличие ERC-2981, OperatorFilter, возможность апгрейда.
- Выбор способа. Если контракт новый — интеграция OperatorFilter + ERC-2981. Если существующий — Manifold или миграция.
- Реализация. Для нового — добавление
DefaultOperatorFiltererиERC2981. Для существующего — вызовsetRoyalties()через Manifold. - Тестирование на testnet. Проверяем корректность роялти на Blur через тестовую продажу. Используем Sepolia.
- Верификация. После деплоя убеждаемся, что коллекция отображает процент роялти на странице маркетплейса.
Проверки на testnet: функция royaltyInfo для разных tokenId, переводы через неавторизованные адреса (должны быть отклонены с ошибкой NotAllowedOperator), отображение роялти в интерфейсе Blur testnet. Используем Tenderly для симуляции транзакций и Slither для статического анализа.
Сравнение поддержки роялти на маркетплейсах
| Маркетплейс | Принудительные роялти через OperatorFilter | Уважение ERC-2981 без фильтра |
|---|---|---|
| Blur | Да | Нет |
| OpenSea | Да | Да |
| X2Y2 | Да | Нет |
| LooksRare | Да | Да |
Что входит в работу
- Аудит текущего смарт-контракта: проверка стандартов, апгрейдаемости, кода.
- Рекомендации по оптимальному способу внедрения роялти.
- Написание и интеграция кода (OperatorFilter, ERC-2981, Manifold).
- Тестирование на testnet (Sepolia, Goerli).
- Документация и обучение команды.
Мы работаем с блокчейн-проектами более 5 лет, реализовали более 50 коллекций NFT на Ethereum, Polygon и BNB Chain. Гарантируем корректную работу роялти на всех поддерживаемых маркетплейсах. Все инженеры имеют сертификаты по Solidity и прошли внутренние аудиты. Свяжитесь с нами для оценки вашего проекта — мы подберём оптимальное решение за 1 час. Закажите настройку сегодня и защитите доходы своей коллекции.







