Setup of NFT Royalties on OpenSea
Since the end of 2022, NFT royalties are no longer guaranteed. Blur launched an aggressive zero-royalty policy to attract traders, and OpenSea was forced to respond—by 2023, both marketplaces made creator royalties optional at the platform level. Result: most secondary sales happen with zero royalties unless the collection uses on-chain enforcement mechanisms.
Two Approaches to Royalties and Their Reality
Off-chain Royalties (Marketplace Standard)
EIP-2981 is an on-chain standard for declaring royalties. The contract implements royaltyInfo(tokenId, salePrice), returning (receiver, royaltyAmount). OpenSea, Blur, and Rarible read this information and display it in the UI.
But enforcement is at the marketplace's discretion. Technically, any trading smart contract can ignore EIP-2981 and not remit royalties. Which most aggregators do.
On-chain Enforcement via Transfer Restrictions
The only way to guarantee royalties is to restrict NFT transfers: allow them only through a whitelist of contracts (marketplaces) that honestly pay royalties. This is Operator Filter Registry, which Yuga Labs introduced for BAYC in 2022.
Problem: transfer restrictions conflict with the ERC-721 standard. Aggregators not on the whitelist can't trade the tokens. Some users see this as a limitation of their ownership rights. As a result, Yuga Labs and OpenSea abandoned Operator Filter as a mechanism by 2024.
In practice: most new collections implement EIP-2981 for correct display in marketplaces but don't restrict transfers. Royalties are a gentlemen's agreement with the marketplace.
Practical Setup
Contract
OpenZeppelin provides the ERC2981 extension:
import "@openzeppelin/contracts/token/common/ERC2981.sol";
contract MyNFT is ERC721, ERC2981 {
constructor() {
_setDefaultRoyalty(msg.sender, 500); // 5% = 500 basis points
}
}
_setDefaultRoyalty sets royalties for the entire collection. _setTokenRoyalty(tokenId, receiver, feeNumerator)—for individual tokens (relevant for 1/1 art with different authors).
OpenSea Collection Settings
Beyond on-chain ERC-2981, OpenSea lets you configure royalties in Collection Settings:
- Percentage (up to 10%)
- Recipient address
- Verification via owner's signature
If the contract lacks ERC-2981—OpenSea takes settings from the dashboard. If it has—on-chain data takes priority (depending on interface version).
Splitting Royalties Among Multiple Recipients
If royalties need to be split among the team—don't write split logic in the NFT contract. Use 0xSplits or Splits Protocol: deploy a split contract with shares, specify its address as the receiver in EIP-2981. When ETH arrives at the split address, anyone can call distribute()—funds are split according to configured shares automatically.
Timeline Estimates
Setting up EIP-2981 in an existing contract (if missing) and verifying on OpenSea—2-3 hours. Includes: checking the current contract, adding EIP-2981 if absent (or deploying a new one), configuring in OpenSea Collection Settings, verifying royalty display.







