XRP Ledger Standards

XLS-0046
Final
  xls: 46
  title: Dynamic Non Fungible Tokens (dNFTs)
  description: Support for XLS-20 NFTs to modify and upgrade token properties as mutable NFTs
  author: Vet (@xVet), Mayukha Vadari (@mvadari), TeQu (@tequdev)
  discussion-from: https://github.com/XRPLF/XRPL-Standards/discussions/130
  status: Final
  category: Community
  requires: [XLS-20](../XLS-0020-non-fungible-tokens/README.md)
  created: 2023-08-18

Abstract

This proposal aims to provide support for XLS-20 NFTs to modify/upgrade token properties.

XLS-20 provides Non-Fungible Token support, these tokens are immutable and don’t allow any changes. Currently NFTs can’t be modified, resulting often in new mints, which leads to ledger bloat that eat valuable resources as well as experimental approaches to use website endpoints to mimic dynamic abilities.

Apart from the use of immutable NFTs, there is a wide range of use cases around dNFTs (Dynamic Non-Fungible Tokens) which are considered mutable NFTs. The goal is to provide both options to developers and users to cover all aspects of non fungibility, while choosing the least invasive approach to achieve this functionality.

Motivation

Usually, NFTs are typically static in nature. A static NFT refers to an NFT that possesses unchanging and immutable characteristics stored on the blockchain, rendering them unmodifiable. These static NFTs encompass various forms like images, videos, GIF files, music, and unlockable components. For instance, an illustration of a basketball player making a shot into a hoop serves as an example of a static NFT.

On the other hand, dynamic NFTs, often abbreviated as dNFTs, represent the next phase in the evolution of the NFT landscape. These dynamic NFTs seamlessly integrate the inherent uniqueness of NFTs with the inclusion of dynamic data inputs. These inputs can arise from calculations conducted either on the blockchain or off-chain.

Oracles could supply dynamic real-world data to NFTs. To illustrate, a dynamic NFT might showcase real-time updates of a basketball player's performance statistics as they actively play.

Specification

3. New Transactors and Flags

We will specify the following:

 New Transactor
    - NFTokenModify

 New Flags
    - tfMutable

3.1 tfMutable

New flags for NFTokenMint:

Flag Name Flag Value Description
tfMutable 0x00000010 Allow issuer (or an entity authorized by the issuer) to modify “URI”.

3.2 NFTokenModify

NFTokenModify is used to modify the URI property of a NFT:

Transaction-specific Fields

Field Name Required? JSON Type Internal Type
TransactionType ✔️ string UINT16

Indicates the account which is owning the NFT, in case of Owner not specified, it's implied that the submitting account is also the Owner of the NFT.

Field Name Required? JSON Type Internal Type
Owner string ACCOUNT ID

Indicates the NFToken object to be modified.

Field Name Required? JSON Type Internal Type
NFTokenID ✔️ string UINT256

The new URI that points to data and/or metadata associated with the NFT. If a URI is omitted then the corresponding URI record in the XRP ledger, if present, is removed.

Field Name Required? JSON Type Internal Type
URI string BLOB

Example (modify URI):

{
  "TransactionType": "NFTokenModify",
  "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
  "Owner": "rogue5HnPRSszD9CWGSUz8UGHMVwSSKF6",
  "Fee": "10",
  "Sequence": 33,
  “NFTokenID”: “0008C350C182B4F213B82CCFA4C6F59AD76F0AFCFBDF04D5A048C0A300000007",
  "URI": "697066733A2F2F62616679626569636D6E73347A736F6C686C6976346C746D6E356B697062776373637134616C70736D6C6179696970666B73746B736D3472746B652F5665742E706E67",

  ...

  }

If tfMutable is not set, executing NFTokenModify should fail!

If tfMutable is set, executing NFTokenModify should fail when neither Issuer or an account authorized via NFTokenMinter, according to the specific flag, is executing the transaction.

This approach takes into consideration that NFToken Flags are part of the NFTokenID, mutating anything that is part of the NFTokenID must be avoided.