Skip to main content

Enforcing royalties


How are royalties enforced on Immutable zkEVM?

Royalties are enforced on Immutable zkEVM via the following controls.

Via collection

All NFT collections must inherit the royalty enforcement functions contained within Immutable's ERC721 and ERC1155 preset contracts.

Immutable's presets utilize the IOperatorAllowlist interface, allowing compliant NFTs to implement the function isAllowlisted() to check whether the supplied address respects the following rules:

  • Assets can be transferred from any users externally owned wallets to another (i.e. peer to peer trading is allowed between 2 players Metamask wallets).
  • Assets can be transferred from an approved user's smart contract wallets to another. Immutable's Passport is such a wallet.
  • Only Marketplaces who respect royalty fees can be "approved" to sell assets.

Here is an example of the Operator Allowlist being implemented in a ERC721 and ERC1155 collection.

Via settlement contract

All settlement contracts that facilitate the buying and selling of NFTs on Immutable's platform will need to be approved by Immutable that they respect the payment of royalty fees to content creators. The use of Immutable's standard Seaport settlement contract is the preferred method this is achieved.

Via Immutable's allowlist

To safeguard the integrity of royalty payments, Immutable employs an allowlist of addresses to verify and ensure that royalties are duly respected. This allowlist serves as a point of reference for the isAllowlisted() function, which outlines compliant contracts and marketplaces.

By maintaining this external list, separate from the NFTs themselves, any updates made to the allowlist promptly take effect across all compliant NFTs. This seamless integration enables immediate support for Immutable's Web3 gaming community, facilitating a smooth and uninterrupted experience for all stakeholders involved.

See the Operator Allowlist contract specification for an in-depth guide.

Using Immutable's allowlist

For content creators

  1. Deploy ImmutableERC721.sol or ImmutableERC1155.sol. The deploying account is the DEFAULT_ADMIN_ROLE
  2. Use the deploying account to call setOperatorAllowlistRegistry, passing in the address of the registry managed by Immutable (i.e. the allowlist)

Here is an example of the Operator Allowlist being implemented in a ERC721 and ERC1155 collection.

For marketplaces

  1. Speak to your Immutable account representative to ensure your platform is permissioned on the allowlist
  2. Ensure your platform uses Immutable's Seaport settlement contract, or another approved settlement contract

Allowlist details

Enforcement flows

approve(target) approveForAll(target)Allowed
Approval target is an EOATrue
Approval target is an address that has had its bytecode approvedTrue
Approval target is an address that has had its address approvedTrue
Approval target is an SC wallet that hasn't had its bytecode and implementation approvedFalse
Approval target is a SC that hasn't had its address approvedFalse
transferFromAllowed
Caller is EOATrue
Caller is an SC wallet that hasn't had its bytecode and implementation approvedTrue
Caller is a SC that has its address approved, e.g. MarketplaceTrue
Caller is a SC wallet that hasn't had its bytecode approved and implementationFalse
Caller is a SC that hasn't had its address approvedFalse