Lost royalties on Blur — a problem familiar to NFT collection owners. Enforcing NFT royalties on Blur is only possible through the OperatorFilterRegistry. Without it, even the ERC-2981 standard does not guarantee payments. We set up protection in an hour, restoring secondary sale income. Based on experience with 50+ collections, we prepared a step-by-step guide.
Blur officially confirms mandatory royalty enforcement for contracts registered in OperatorFilterRegistry. The problem is that most developers rely solely on ERC-2981, counting on marketplace honesty. But Blur does not check ERC-2981 without the additional filter. OperatorFilterRegistry solves this: a contract with the onlyAllowedOperator modifier blocks transfers through unauthorized platforms.
How does enforced royalty work on Blur?
Mandatory enforcement relies on two mechanisms: implementing the ERC-2981 standard and registering in the OperatorFilterRegistry. The ERC-2981 standard defines on-chain royalties, while the OperatorFilter enforces them on Blur. For already deployed contracts without ERC-2981 support, use the Manifold Royalty Registry — a retroactive solution without code changes.
ERC-2981: on-chain royalties
ERC-2981 is a minimal standard: the contract implements royaltyInfo(tokenId, salePrice), returning the recipient and amount. If a contract is already deployed without ERC-2981, adding it to an immutable contract is impossible. Options: deploy a new contract with migration or register royalties through off-chain registries (Manifold).
Manifold Royalty Registry is a universal solution: the owner of the old contract registers the recipient and percentage without code changes. Supported by Blur, OpenSea, Rarible. For new contracts, use ERC2981 from OpenZeppelin with _setDefaultRoyalty(receiver, feeNumerator) in the constructor. feeNumerator out of 10000: 500 = 5%.
Why does OperatorFilter guarantee payments?
Blur requires registration in the OperatorFilterRegistry for enforced royalties. A contract using OpenZeppelin's OperatorFilterer overrides transfer functions with the onlyAllowedOperator modifier. This mechanism blocks trading by unauthorized marketplaces that do not respect royalties. For already deployed contracts without upgrade, enforced enforcement is impossible — only ERC-2981 via Manifold as a best effort.
| Method | Enforceable | Implementation Complexity | Retroactive |
|---|---|---|---|
| ERC-2981 | No (on Blur) | Low (1-2 days) | No |
| OperatorFilter | Yes | Medium (2-4 hours) | No |
| Manifold Registry | Partial | Low (1 hour) | Yes |
OperatorFilter enforces royalties in 100% of cases on Blur, while ERC-2981 without the filter gives 0% guarantee. This is a key difference — choosing OperatorFilter is 3 times more effective for protecting revenue. Lost royalties can reach significant amounts monthly; setup pays off quickly.
Code example: integrating 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); } } What if your contract is already deployed?
If the contract is immutable and does not support ERC-2981, use the Manifold Royalty Registry. This is an off-chain registry: you register the recipient and percentage, and Blur and other marketplaces read data from there. The process takes 1-2 hours and does not require redeployment. However, it does not give 100% enforcement — some marketplaces may ignore the registry.
Setup process
- Contract analysis (1-2 hours). Check for ERC-2981, OperatorFilter, upgradeability.
- Method selection. If new contract — integrate OperatorFilter + ERC-2981. If existing — Manifold or migration.
- Implementation. For new — add
DefaultOperatorFiltererandERC2981. For existing — callsetRoyalties()via Manifold. - Testing on testnet. Verify correct royalties on Blur via a test sale. Use Sepolia.
- Verification. After deployment, ensure the collection displays the royalty percentage on the marketplace page.
Checks on testnet: royaltyInfo function for different tokenIds, transfers through unauthorized addresses (should be rejected with NotAllowedOperator error), royalty display in Blur testnet interface. Use Tenderly for transaction simulation and Slither for static analysis.
Royalty support comparison across marketplaces
| Marketplace | Enforced royalties via OperatorFilter | Respects ERC-2981 without filter |
|---|---|---|
| Blur | Yes | No |
| OpenSea | Yes | Yes |
| X2Y2 | Yes | No |
| LooksRare | Yes | Yes |
What is included in the work
- Audit of the current smart contract: standards check, upgradeability, code.
- Recommendations for the optimal royalty implementation method.
- Writing and integrating code (OperatorFilter, ERC-2981, Manifold).
- Testing on testnet (Sepolia, Goerli).
- Documentation and team training.
We have been working with blockchain projects for over 5 years, implemented more than 50 NFT collections on Ethereum, Polygon, and BNB Chain. We guarantee correct royalty operation on all supported marketplaces. All engineers have Solidity certifications and passed internal audits. Contact us for a project assessment — we will find the optimal solution in 1 hour. Order setup today and protect your collection's revenue.







