Skip to main content
Immutable’s ecosystem enforces royalty fees to content creators when assets are bought and sold. Royalty fees are set during minting and configured in the smart contract.

Contracts Repository

View royalty implementation source code

How Royalties Work

When an NFT or SFT is sold on the secondary market, a royalty fee automatically directs a portion of the transaction value to the original creator.
ComponentDescription
Royalty PercentageSet at contract deployment (e.g., 5% = 500 basis points)
RecipientAddress that receives royalties (can be a Fee Splitter)
StandardEIP-2981 for on-chain royalty info
EnforcementVia Operator Allowlist
Royalty fees are optional—it’s up to the collection owner. If set, Immutable’s ecosystem enforces payment.

Setting Royalties

Via Hub

  1. Go to HubContractsDeploy
  2. Select your contract type (ERC-721 or ERC-1155)
  3. Configure:
    • Royalty Recipient: Address to receive royalties
    • Royalty Percentage: Percentage of sale price (e.g., 5%)
  4. Deploy contract

Via Code

import "@imtbl/contracts/contracts/token/erc721/preset/ImmutableERC721.sol";

contract MyNFT is ImmutableERC721 {
    constructor(
        address owner,
        string memory name,
        string memory symbol,
        string memory baseURI,
        string memory contractURI,
        address operatorAllowlist,
        address royaltyReceiver,  // Royalty recipient
        uint96 royaltyFeeNumerator // 500 = 5%
    ) ImmutableERC721(
        owner, name, symbol, baseURI, contractURI,
        operatorAllowlist, royaltyReceiver, royaltyFeeNumerator
    ) {}
}

Fee Splitter

For distributing royalties to multiple recipients, use the Fee Splitter contract.

Fee Splitter Contract

View the Fee Splitter source code

Key Features

  • Multi-Recipient Support: Allocate fees to multiple recipients
  • On-Chain Transparency: Wallet addresses and shares stored on-chain
  • Gas Efficiency: More efficient than real-time splitting

How It Works

  1. Set the Fee Splitter contract as your royalty recipient
  2. Configure recipients and their percentage shares
  3. Fees accumulate in the Fee Splitter contract
  4. Call releaseAll() to distribute accumulated fees
// Releasing fees to all recipients
feeSplitter.releaseAll([USDC_ADDRESS, WETH_ADDRESS]);

// Release only native token (IMX)
feeSplitter.releaseAll();

ERC-20 Allowlist

The Fee Splitter includes an allowlist for accepted tokens:
// Add token to allowlist
feeSplitter.addToAllowlist(ERC20_ADDRESS);

// Remove token from allowlist
feeSplitter.removeFromAllowlist(ERC20_ADDRESS);
Unlisted tokens sent to the Fee Splitter won’t be distributed until added to the allowlist.

Updating Allocation

Admin users can update fee allocation. When updated:
  • All unreleased fees are redistributed according to the new configuration
  • Existing minted assets automatically use the new configuration
Call releaseAll() before changing allocation to distribute fees according to the original configuration.

Multiple Fee Splitters

Different scenarios require separate Fee Splitter contracts:
ScenarioSolution
Different recipientsOne contract per unique recipient combination
Different percentagesOne contract per unique split ratio
Multiple gamesOne contract per game/collection

Royalty Enforcement

Royalties are enforced through the Operator Allowlist. Only allowlisted marketplaces (like Immutable’s Orderbook) can transfer tokens, ensuring royalties are always paid.