Setup of NFT Royalties on Blur
Blur launched in October 2022 and offered zero trading fees + optional royalties. Collections lost 0-100% royalties depending on whether they blocked trading via Blur. OpenSea responded by reducing its own royalties to optional. The royalty wars of 2022-2023.
Today the situation has stabilized: Blur supports royalties for collections using OperatorFilterRegistry (Blur Operator Filter) or implementing ERC-2981. Setup takes several hours but requires understanding the mechanics.
ERC-2981: On-chain Royalties
ERC-2981 is minimal standard: the contract implements royaltyInfo(tokenId, salePrice) function returning the recipient and royalty amount.
If the contract is already deployed without ERC-2981—adding it to an immutable contract is impossible. Options: deploy a new contract with migration (expensive and complicated) or register royalties through off-chain registries (OpenSea Creator Fees via their dashboard, Manifold Royalty Registry).
Manifold Royalty Registry—the most universal solution for retroactive setup: lets the old contract owner register royalty recipient and percentage without changing the contract. Supported by Blur, OpenSea, Rarible, LooksRare.
For new contracts—ERC2981 from OpenZeppelin + _setDefaultRoyalty(receiver, feeNumerator) in constructor. feeNumerator out of 10000: value 500 = 5%.
Enforcement via OperatorFilter
Blur requires registration in OperatorFilterRegistry (0x000000000000AAeB6D7670E522A718067333cd4E on Ethereum) to receive enforced royalties on its platform.
OpenZeppelin 4.x and 5.x include DefaultOperatorFilterer and OperatorFilterer mixins. Add to the contract:
import {DefaultOperatorFilterer} from "operator-filter-registry/src/DefaultOperatorFilterer.sol";
contract MyNFT is ERC721, DefaultOperatorFilterer {
function transferFrom(address from, address to, uint256 tokenId)
public override onlyAllowedOperator(from) {
super.transferFrom(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId)
public override onlyAllowedOperator(from) {
super.safeTransferFrom(from, to, tokenId);
}
}
onlyAllowedOperator checks whether the calling contract is registered as a "clean" operator (complies with royalties). Blur Marketplace is registered in the registry.
For already-deployed contracts—if there's no OperatorFilter and no upgrade capability, enforcement is impossible. Only EIC-2981 via Manifold as best effort.
Setup Process
Contract Analysis (1-2 hours). Check: does it have ERC-2981, does it have OperatorFilter, is the contract upgradeable.
Setup (2-4 hours). For new contract—integration during development. For existing—Manifold Registry via their UI or direct setRoyalties() call from owner wallet.
Verification. Verify on Blur that the collection displays the correct royalty percentage. Testnet test sale if available.
Cost depends on the state of the existing contract and the required work volume.







