Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
LABS
Guides

Setting Up Royalty Enforcement Mechanisms

A developer-focused guide implementing technical solutions for NFT creator royalties. Covers on-chain enforcement, marketplace policies, and protocol-level approaches with code examples and security considerations.
Chainscore © 2026
introduction
IMPLEMENTATION GUIDE

Setting Up NFT Royalty Enforcement Mechanisms

A technical guide for developers on implementing and configuring royalty enforcement for NFT collections, covering smart contract standards, marketplace integration, and on-chain enforcement strategies.

NFT royalties are a percentage of the sale price paid to creators on secondary market transactions. Enforcement is not automatic; it requires deliberate architectural decisions at the smart contract and marketplace levels. The primary standard is ERC-2981, which defines a universal interface (royaltyInfo) for retrieving royalty payment details. Implementing this standard is the first step, as it allows any compliant marketplace to discover and honor your royalty settings. However, ERC-2981 is an informational standard—it does not enforce payments, only reports them.

For true on-chain enforcement, you must integrate payment logic directly into the transfer mechanism. This is often done by overriding critical functions like _update (ERC-721) or _beforeTokenTransfer to require royalty payment as a condition of the transfer. Projects like Manifold's Royalty Registry provide a reference implementation and a central on-chain directory. Alternatively, you can use a royalty-enforcing token standard like ERC-721-C from Limit Break, which uses a configurable Royalty Policy contract to validate and execute payments before a transfer is finalized.

Marketplace integration is equally critical. Your smart contract must be compatible with the payment flow of major platforms. On OpenSea, for instance, the OperatorFilterRegistry allows creators to restrict sales to marketplaces that enforce fees. You subscribe your contract to a registry (like OpenSea's curated list) that blocks transfers to non-compliant marketplaces. For other platforms, ensure your royaltyInfo function returns data in the expected format, typically a recipient address and a basis points value (e.g., 500 for a 5% royalty).

Here is a basic example of implementing ERC-2981 in a Solidity smart contract:

solidity
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/interfaces/IERC2981.sol";
contract MyNFT is ERC721, IERC2981 {
    address private royaltyRecipient;
    uint256 private royaltyBps; // e.g., 750 = 7.5%
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external view override
        returns (address receiver, uint256 royaltyAmount)
    {
        receiver = royaltyRecipient;
        royaltyAmount = (_salePrice * royaltyBps) / 10000;
    }
    // ... rest of contract
}

This code snippet shows the minimal interface needed to report royalties.

Testing your implementation is essential. Use a forked mainnet environment with tools like Hardhat or Foundry to simulate sales on different marketplaces. Verify that: the royaltyInfo function returns correct values, on-chain enforcement logic reverts unauthorized transfers, and marketplace-specific filters work as intended. Consider edge cases like bundle sales and private transfers. Remember, the ecosystem is evolving; staying updated on new standards like EIP-7496 (NFT Royalty Redirection) and security audits for any enforcement logic is crucial for maintaining long-term revenue streams.

prerequisites
ROYALTY ENFORCEMENT

Prerequisites and Setup

A practical guide to the core components and initial configuration required to implement on-chain royalty enforcement for NFTs.

Effective royalty enforcement requires a foundational understanding of the NFT ecosystem's architecture. You must be familiar with ERC-721 and ERC-1155 token standards, as these define the core ownership and transfer logic. The critical component is the royaltyInfo function, introduced in EIP-2981, which returns the royalty recipient address and amount for a given sale price. Marketplaces and applications that support this standard query this function to pay creators. Setting up enforcement means ensuring your smart contracts and the platforms you integrate with correctly implement and respect this standard.

Your development environment must be configured for smart contract work. Essential tools include Node.js (v18+), a package manager like npm or yarn, and the Hardhat or Foundry framework for compiling, testing, and deploying contracts. You will also need access to a blockchain network for testing; a local Hardhat node is ideal for development, while testnets like Sepolia or Goerli are used for staging. Install the OpenZeppelin Contracts library, which provides audited, standard-compliant implementations of ERC-721 and the associated royalty functionality.

The first coding step is to write or modify your NFT collection's smart contract to include EIP-2981 support. Using OpenZeppelin, you can extend the ERC721 or ERC1155 contract with ERC2981. You must define the royalty recipient (often the contract owner or a dedicated wallet) and the royalty fee numerator (e.g., 750 for a 7.5% fee, as the basis is 10,000). Here is a basic setup snippet:

solidity
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/common/ERC2981.sol";

contract RoyaltyNFT is ERC721, ERC2981 {
    constructor() ERC721("RoyaltyNFT", "RNFT") {
        _setDefaultRoyalty(msg.sender, 750); // 7.5%
    }
    // Override supportsInterface for ERC2981
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

After deploying your contract, verification is crucial. Use block explorers like Etherscan or Polygonscan to verify and publish your contract source code. This transparency allows marketplaces to easily read the royaltyInfo function. Next, you must test integration. List an NFT on a testnet marketplace that supports EIP-2981, such as a test version of OpenSea or LooksRare. Conduct a simulated sale to confirm that the royalty payment is correctly calculated and that the funds are sent to the designated recipient address. This end-to-end test validates your setup.

For advanced enforcement, consider on-chain enforcement modules like Manifold's Royalty Registry or 0xSplits. These systems act as an override registry, allowing creators to set royalties that are respected even if the NFT contract itself does not implement EIP-2981. Integrating with these requires calling their registry contracts to register your collection. Furthermore, you may need to implement operator filter lists, such as those defined by OpenSea, to restrict sales to marketplaces that enforce fees, though the regulatory and technical status of such lists is evolving.

Finally, document your royalty policy clearly for users and integrators. Specify the percentage, payment address, and the standards you support. Monitor transactions using tools like Tenderly or custom scripts to ensure royalty payments are being made correctly over time. Remember, enforcement is a combination of technical implementation (EIP-2981), ecosystem cooperation (marketplace support), and optional defensive tools (registries, filters). A robust setup addresses all three layers to reliably protect creator revenue.

key-concepts-text
KEY CONCEPTS: HOW ROYALTIES WORK

Setting Up Royalty Enforcement Mechanisms

Royalty enforcement ensures creators are compensated on secondary sales. This guide explains the technical mechanisms for implementing and enforcing creator fees.

Royalty enforcement in NFTs is not automatic; it must be intentionally programmed into the smart contract. The primary mechanism is the royaltyInfo function, defined by standards like EIP-2981. This function returns the recipient address and the fee amount, typically calculated as a percentage of the sale price. Marketplaces that support the standard query this function and forward the fee to the creator. Without this on-chain hook, royalties become optional and rely on marketplace policy, leading to the "royalty enforcement problem" where platforms can bypass payments.

To implement EIP-2981, a contract must override the royaltyInfo function. Here is a basic Solidity example for an ERC-721 contract:

solidity
function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
    external
    view
    returns (address receiver, uint256 royaltyAmount)
{
    receiver = royaltyReceiver;
    royaltyAmount = (_salePrice * royaltyBasisPoints) / 10000;
}

In this code, royaltyBasisPoints represents the fee (e.g., 500 for 5%). The function is called by marketplaces during a sale to determine the required payment.

More robust enforcement strategies go beyond the standard. Transfer hooks, like those in the OpenZeppelin ERC721Royalty extension, can validate royalty payment before allowing a token transfer. Alternatively, on-chain royalty registries, such as Manifold's Royalty Registry or 0xSplits, provide a universal lookup for fee settings, separating the logic from the NFT contract itself. This allows for updating fees or recipients without migrating the entire collection, offering greater flexibility for creators.

For maximum enforcement, some projects use owner-operator models or custom sale contracts. In this model, all secondary sales must occur through a sanctioned, permissioned smart contract that programmatically distributes royalties. While effective, this approach reduces liquidity by restricting listings to specific platforms. The trade-off between enforceability and interoperability is a key design consideration. Projects must decide if strong guarantees for creators are worth potential friction for collectors.

Ultimately, setting up royalties involves choosing a technical strategy that aligns with project goals. Using EIP-2981 is the baseline for interoperability. Augmenting it with a royalty registry provides updatability, while transfer restrictions offer the strongest guarantee. Developers should clearly document their chosen mechanism, as transparency builds trust with creators and collectors in the ecosystem.

enforcement-approaches
DEVELOPER GUIDE

Royalty Enforcement Approaches

A technical overview of on-chain mechanisms for enforcing creator royalties, from protocol-level standards to marketplace-level enforcement.

05

Transfer Hooks with Fees

A proactive enforcement mechanism built directly into the NFT contract. Using hooks like _beforeTokenTransfer, the contract can intercept any transfer and require a fee to be paid to a designated address before proceeding.

  • Strong enforcement: Royalties are levied on every transfer, not just marketplace sales.
  • Implementation complexity: Requires custom NFT contract development, not compatible with simple ERC-721.
  • User experience impact: Can break compatibility with wallets and DApps that expect standard transfer behavior.
06

Evaluating the Trade-offs

Choosing an approach involves balancing enforcement strength, decentralization, and ecosystem compatibility. No single solution is perfect.

  • Maximum Enforcement: Transfer hooks or creator-owned marketplaces offer the strongest guarantees but limit liquidity.
  • Ecosystem Compatibility: ERC-2981 is the most widely supported but is informational only.
  • Centralization Risk: Systems like the Operator Filter Registry are effective but introduce a central point of control.

Developers must align the mechanism with the project's values, target audience, and tolerance for platform risk.

ON-CHAIN VS. OFF-CHAIN

Royalty Solution Comparison

Comparison of primary technical approaches for NFT creator royalty enforcement.

Feature / MetricOn-Chain EnforcementMarketplace PolicyRegistry with Fees

Enforcement Guarantee

Conditional

Technical Implementation

Smart contract logic

Platform ToS

Registry + Extension

Royalty Bypass Risk

Low

High

Medium

Gas Cost Impact

High (+20-50%)

None

Low (+5-15%)

Interoperability

Chain-specific

Market-specific

Standard-dependent (e.g., EIP-2981)

Upgrade Flexibility

Low (requires migration)

High

Medium

Example Protocols

Manifold, Zora

OpenSea, Blur

EIP-2981, Rarible Protocol

implement-eip2981
DEVELOPER GUIDE

How to Implement EIP-2981 Royalty Standard

A technical guide for NFT developers to integrate on-chain royalty payments using the EIP-2981 standard.

The EIP-2981: NFT Royalty Standard defines a universal, on-chain method for non-fungible tokens (NFTs) to declare royalty payment information. Before its introduction, royalty enforcement was fragmented, relying on individual marketplace policies or off-chain metadata, leading to inconsistent payouts for creators. This standard provides a single, smart contract-level function, royaltyInfo, that any marketplace or secondary sales platform can query to determine the correct payment recipient and amount. Its adoption is crucial for creating a sustainable creator economy within the NFT ecosystem, ensuring creators are compensated fairly for secondary sales across all compliant platforms.

At its core, EIP-2981 requires the implementation of a single function in your NFT's smart contract. The function signature is function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount). When called with a token ID and a sale price, it must return the address to send royalties to and the royalty amount to be paid. The royalty amount is typically calculated as a percentage of the sale price. This design is intentionally gas-efficient and flexible, allowing for per-token or collection-wide royalty logic, and enabling complex payout structures like splits between multiple addresses.

Here is a basic implementation example using Solidity, extending the popular ERC-721 standard from OpenZeppelin. This example sets a fixed royalty percentage for the entire collection.

solidity
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract RoyaltyNFT is ERC721, Ownable {
    address public royaltyReceiver;
    uint256 public royaltyBasisPoints; // e.g., 750 = 7.5%

    constructor(
        string memory name,
        string memory symbol,
        address _royaltyReceiver,
        uint256 _royaltyBasisPoints
    ) ERC721(name, symbol) {
        royaltyReceiver = _royaltyReceiver;
        royaltyBasisPoints = _royaltyBasisPoints;
    }

    function royaltyInfo(
        uint256 /*_tokenId*/,
        uint256 _salePrice
    ) external view returns (address, uint256) {
        uint256 royalty = (_salePrice * royaltyBasisPoints) / 10000;
        return (royaltyReceiver, royalty);
    }
}

The key is calculating the royalty correctly using basis points, where 10,000 basis points equal 100%. A 7.5% fee is represented as 750.

For more advanced use cases, you can modify the royaltyInfo function to support dynamic logic. This includes per-token royalty settings (where each NFT can have a different recipient or percentage), royalty splits (dividing payments between a creator and a DAO treasury), or tiered royalties that change based on sale price. It's important to ensure this logic remains gas-efficient, as it will be called during secondary sales. Always thoroughly test royalty calculations to prevent rounding errors that could lead to over or underpayment, which can be a source of disputes or failed transactions.

While EIP-2981 defines the information standard, enforcement depends on marketplace integration. Major platforms like OpenSea, Blur, and LooksRare support this standard and will automatically read the royaltyInfo function to facilitate payments. However, not all marketplaces or aggregators are compliant. For stronger enforcement, some projects combine EIP-2981 with transfer restrictions (like the OperatorFilterRegistry used by OpenSea) to block sales on non-compliant platforms. This creates a technical enforcement layer, though it remains a topic of debate within the community regarding decentralization and user choice.

To implement EIP-2981 effectively, follow these steps: 1) Integrate the royaltyInfo function into your NFT contract, 2) Decide on a fixed or dynamic royalty model, 3) Test the function extensively on a testnet using tools like Hardhat or Foundry, 4) Verify your contract's source code on block explorers like Etherscan, and 5) Clearly communicate your royalty policy to your community. Resources like the OpenZeppelin Contracts Wizard can help generate a starter contract, and the official EIP-2981 specification provides the definitive technical reference.

implement-transfer-hooks
TUTORIAL

Implementing Transfer Hooks for Enforcement

A practical guide to using token transfer hooks to programmatically enforce rules like royalties, fees, and access control on-chain.

A transfer hook is a smart contract function that is automatically called before or after a token transfer on a programmable token standard like SPL on Solana or ERC-721/1155 on Ethereum. This mechanism allows developers to inject custom logic—such as royalty enforcement, fee collection, or transfer restrictions—directly into the token's lifecycle. Unlike post-transfer market-level enforcement, hooks execute at the protocol level, making compliance inherent to the token itself. This is a foundational concept for creating enforceable digital assets where rules cannot be bypassed by trading on alternative platforms.

To implement a basic royalty enforcement hook, you first need a token that supports the hook interface. On Solana, this is commonly done with the Token-2022 extension or via the spl-transfer-hook interface. Your hook program will implement a function, typically named before_transfer or after_transfer, that receives the transfer context. Within this function, you can calculate the required royalty (e.g., 5% of the sale price), validate that the correct payment has been sent to a designated wallet, and abort the transaction if conditions are not met. The sale price must be passed into the transaction via additional accounts or instruction data.

Here is a simplified Solana Anchor framework example for a pre-transfer hook that validates a royalty payment:

rust
#[derive(Accounts)]
pub struct BeforeTransferHook<'info> {
    pub source: AccountInfo<'info>,
    pub destination: AccountInfo<'info>,
    pub mint: AccountInfo<'info>,
    pub royalty_wallet: AccountInfo<'info>, // The account to receive fees
    pub token_program: AccountInfo<'info>,
}

pub fn handler(ctx: Context<BeforeTransferHook>, sale_price: u64) -> Result<()> {
    let royalty_rate = 500; // Basis points (5%)
    let royalty_amount = sale_price * royalty_rate / 10000;
    // Verify transfer of royalty_amount to royalty_wallet occurred
    // ... validation logic ...
    if !royalty_paid {
        return Err(ProgramError::InvalidInstructionData.into());
    }
    Ok(())
}

The hook prevents the core token transfer from succeeding unless the royalty payment is verified.

Key considerations when designing transfer hooks include gas efficiency and composability. Hooks add overhead to every transfer, so logic should be minimal. Furthermore, your hook must account for the token's entire ecosystem: it should not break integrations with decentralized exchanges, wallets, or indexers. Testing is critical; simulate transfers through various pathways (marketplaces, direct sends, auctions) to ensure the hook behaves correctly and does not introduce vulnerabilities. Always audit the hook's logic for reentrancy and improper access control, as it handles valuable assets.

Beyond royalties, transfer hooks enable sophisticated on-chain behaviors. You can create time-locked tokens that cannot be transferred before a vesting date, soulbound tokens that are non-transferable, or tokens that require holder whitelists. The pattern is also used for auto-compounding staking rewards that trigger on transfer. By moving enforcement logic into the token's transfer pipeline, you create a single source of truth that is resilient to marketplace fragmentation, ensuring your token's economic and governance rules are preserved wherever it travels.

PROTOCOL GUIDES

Platform-Specific Implementation

Implementing on Ethereum, Polygon, and Arbitrum

For EVM-compatible chains, the ERC-2981 standard is the primary interface for on-chain royalty information. Most major NFT marketplaces (OpenSea, Blur, LooksRare) support it.

Key Steps:

  1. Your NFT contract (ERC-721/ERC-1155) must implement the IERC2981 interface.
  2. The royaltyInfo(uint256 tokenId, uint256 salePrice) function must return the recipient address and royalty amount.
  3. For maximum compatibility, also consider setting royalty metadata via the EIP-2981 method on OpenSea's shared storefront contract for collections deployed before the standard's adoption.

Example Implementation Snippet:

solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/interfaces/IERC2981.sol";

contract RoyaltyNFT is ERC721, IERC2981 {
    address private royaltyRecipient;
    uint96 private royaltyBasisPoints; // e.g., 500 for 5%

    constructor() ERC721("RoyaltyNFT", "RNFT") {
        royaltyRecipient = msg.sender;
        royaltyBasisPoints = 500;
    }

    function royaltyInfo(uint256 /*tokenId*/, uint256 salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        receiver = royaltyRecipient;
        royaltyAmount = (salePrice * royaltyBasisPoints) / 10000;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId);
    }
}
ROYALTY ENFORCEMENT

Frequently Asked Questions

Common technical questions and troubleshooting for developers implementing on-chain creator royalties.

The core distinction lies in the transaction flow and gas responsibility.

Push Model: The royalty payment is sent automatically during the NFT transfer transaction. The marketplace or transfer function logic calculates and forwards the fee to the creator's address. This is simpler for the buyer but places gas costs and implementation complexity on the marketplace.

Pull Model: The royalty amount is recorded as owed but not sent immediately. The creator (or an authorized agent) must later call a function to "withdraw" accumulated royalties. This model shifts gas costs to the creator and requires them to be proactive, but it simplifies the primary transfer transaction. ERC-2981 is a prominent standard for a pull-based registry.

Most marketplaces historically used push, but pull is gaining adoption for its gas efficiency and compatibility with complex sale types like auctions.

security-considerations
SECURITY AND EDGE CASES

Setting Up Royalty Enforcement Mechanisms

A technical guide to implementing and securing on-chain royalty payments for NFT collections, covering smart contract design, marketplace integration, and common pitfalls.

On-chain royalty enforcement is a critical feature for NFT creators, ensuring they receive a percentage of secondary sales. The primary mechanism involves a royaltyInfo function in your NFT's smart contract that returns a recipient address and a fee amount. Marketplaces like OpenSea and Blur query this function to calculate and route payments. The most common standard is EIP-2981, which defines a universal interface for royalty information. Without this, royalties depend on individual marketplace policies, leading to inconsistent or zero payments for creators. Implementing EIP-2981 is the foundational step for reliable, chain-level enforcement.

A secure implementation must handle several edge cases. The royaltyInfo function should validate the _salePrice parameter to prevent division-by-zero errors or overflow when calculating the fee. Use OpenZeppelin's SafeMath library or Solidity 0.8's built-in checks. The function must also protect against reentrancy, although it is a view function in EIP-2981. For mutable royalties, implement access control (e.g., onlyOwner) on the setter functions. A common vulnerability is setting an excessively high royalty percentage (e.g., 100%), which can render NFTs unsellable; consider implementing a reasonable upper limit like 10-25%.

Beyond the base standard, consider advanced patterns for stronger enforcement. The Operator Filter Registry (previously known as the "OpenSea Operator Filter") allows creators to restrict sales to marketplaces that enforce royalties by checking a curated list. However, this approach has faced criticism for centralization and can be circumvented by decentralized exchanges. An alternative is revenue-splitting on transfer, where the royalty is deducted and sent to the creator whenever the NFT changes ownership, independent of a marketplace. This is more coercive but increases gas costs and complexity. Weigh the trade-offs between enforceability, decentralization, and user experience for your collection.

Testing your royalty mechanism is non-negotiable. Write comprehensive unit tests for the royaltyInfo function across various sale prices and royalty settings. Use forked mainnet tests to simulate interactions with live marketplace contracts on Ethereum Mainnet or Polygon. Tools like Hardhat or Foundry are essential for this. Verify that your contract's behavior matches the expectations of major marketplaces by checking their documentation, such as OpenSea's Creator Fees guide. Finally, always perform an audit on the full contract, as royalty logic can interact unexpectedly with minting, burning, and upgradeability features.

conclusion
THE PATH FORWARD

Conclusion and Future Outlook

This guide has outlined the technical foundations for implementing NFT royalties. The ecosystem's approach is rapidly evolving beyond simple on-chain enforcement.

The initial model of on-chain royalty enforcement via marketplaces and transfer logic, while foundational, has proven insufficient in a permissionless environment. The rise of royalty-agnostic marketplaces and the inherent limitations of transfer hooks have forced a strategic shift. The future lies in value-driven models that incentivize payment rather than attempting to enforce it. Projects like Manifold's Royalty Registry and EIP-2981 have laid the groundwork for standardization, but adoption is the next critical hurdle.

Looking ahead, several key trends are shaping royalty mechanisms. Programmable royalty splits that dynamically route funds to creators, DAOs, and collaborators are becoming standard. On-chain attribution protocols that embed creator information directly into the token metadata, independent of the marketplace, offer a more resilient solution. Furthermore, the integration of decentralized identity (DID) and verifiable credentials could create a persistent link between an NFT and its creator's payment address, making royalty evasion more difficult across the entire Web3 stack.

For developers and project founders, the practical takeaway is to adopt a multi-layered strategy. Implement EIP-2981 as a baseline for compatibility. Consider modular royalty contracts that can be upgraded as new standards emerge. Most importantly, design tokenomics and community benefits that make paying royalties the most attractive option for holders, aligning long-term incentives. The technical tools—from the Creator Token Standards emerging on Solana to advanced Soulbound Token systems—are being built; their success depends on thoughtful integration and community governance.

The broader outlook suggests a move from enforcement to enrichment. Future mechanisms may tie royalty payments to access to exclusive content, voting power in project DAOs, or physical merchandise redemption. This transforms the royalty from a passive tax into an active membership due, fostering a stronger creator-collector relationship. As the infrastructure matures, expect to see more cross-chain royalty solutions and automated payout systems that handle complex multi-party splits and currency conversions seamlessly.

How to Enforce NFT Royalties: On-Chain & Marketplace Solutions | ChainScore Guides