0014 XLS-14d: (DEPRECATED) Non fungible tokens (indivisible NFT's) on the XRPL #30
Replies: 23 comments 78 replies
-
@JoelKatz: I know (from @nbougalis) that the two (?) of you have some ideas on NFTs as well. Love to read your proposal & hear how you feel about this proposal. |
Beta Was this translation helpful? Give feedback.
-
The decimal issue is similar to what we face with the Fan Tokens we are launching. They are zero decimal, indivisible and it presents unique problems. Much easier workarounds for fungible tokens. There are so many bad practices with NFTs right now. I am interested to see how they will be displayed. The thing that is really lacking on OpenSea Marketplace, CB Wallet App etc are strong interfaces for NFTs. They should display key info like total #. There is so little emphasis on rarity/ serial #s with many ETH NFT platforms. Would love to see this market place and UI geared towards collectors who want to see NFTs displayed beautifully and the total # of NFTS minted displayed very prominently. This will help attract collectors, investors at scale while dissuading users from overminting. The blackhole is a must. We have lots of artists interested in redeemable tokens for physical products, rare physical collectables and irl experiences that would want to test in the near future as well. |
Beta Was this translation helpful? Give feedback.
-
I like extending the form of token creation on the XRPL in a protocol that you lay out above. Conceptual linking the amount or unit of account of the token with the literal unit of account of the token on the XRPL is cohesive, it is precious and no longer divisible. The suggestions around the issuer account has me thinking. |
Beta Was this translation helpful? Give feedback.
-
I find the current proposal good, but lacking important details about what metadata URI format and metadata JSON schema to use. This should be standardized as well. I suggest we take inspiration from EIP-1155, specifically the metadata URI and metadata URI JSON schema. Other blockchain and NFT developers are familiar with this standard and I see value in adhering to existing standards to the greatest extent possible. An XRP Ledger variant of EIP-1155 would allow for ID substitution by clients as long as:
An example URI https://cdn.example.com/{id}.json formed from the 40 character hexadecimal currency code would then look like: https://cdn.example.com/0000000000000000000000000004CCE0.json, if the client is referring to token ID 314592/0x4CCE0. I also propose that the NFT issuing account domain MUST be set with an AccountSet transaction. Using the same example as above, the issuing account of the NFT 0x4CCE0 would then have the domain cdn.example.com set. This allows on-ledger discovery of both domains and NFT IDs. The XRP Ledger domain property allows for up to 256 bytes to be stored, which should be more than enough. Regarding the metadata JSON schema, I suggest we use EIP-1155 as is, properties like properties.decimals may be unused. |
Beta Was this translation helpful? Give feedback.
-
I've been working on the idea of issuing NFTs on XRPL myself and posted a scheme I tried on the testnet here: https://www.xrpchat.com/topic/36795-nfts-on-xrpl-how/?do=findComment&comment=898858 I do have some confusion over the appropriate amount to issue (precision vs. minimum value), so if issuing 1e-15 is incorrect (i.e., must issue 1000000000000000e-96 for a unique token), I will have to amend my NFT implementation scheme. Otherwise, I chose to point to the NFT object using the Memo field in the issuing Payment transaction instead using the AccountSet Domain field. While the Memo field has the advantage of allowing for more information storage, I can see the advantage of using the Domain field: lookup of the issuing account's metadata vs. lookup of the issuing Payment transaction. Looking forward to being a part of this discussion -- and glad to know that others are working on the same problem! |
Beta Was this translation helpful? Give feedback.
-
After reviewing how the data is presented it might be best to convert to a DDEX related platform. |
Beta Was this translation helpful? Give feedback.
-
Would using PayString IDs suffice as an identifier for an NFT? This would likely look like Issuer = wietsewind$xumm.app, NFT = wietsewind+nft$xumm.app |
Beta Was this translation helpful? Give feedback.
-
It is necessary to 'lock up' one owner reserve (currently 5 XRP) for each NFT held, I believe. Any concern about that? I think JoelKatz's proposal creates new ledger object types and allows up to 32 unique NFTs to be held while charging only 1 reserve. (A larger change that requires an amendment, of course.) There is a potential security concern around 'counterfeit' NFTs: if someone can be 'tricked' into trusting an issuer for a particular NFT currency code, then 'rippling' could allow someone to send a counterfeit NFT and receive the real one. This is due to:
This could likely be solved by having a 'best practice' of client software checking for any existing conflicting trustlines before creating a new one. |
Beta Was this translation helpful? Give feedback.
-
How could we include royalty payments for NFTs? For example, the artist or issuer may want to receive a percentage of every secondary sale or use, automatically sent to an account or set of accounts, perhaps in a currency of choice. There are a couple different ways I could imagine this being implemented:
|
Beta Was this translation helpful? Give feedback.
-
We should define and set aside a value for the first 8 bits of a hex currency code for NFTs. The existing hex values are:
So how about |
Beta Was this translation helpful? Give feedback.
-
It would be cool to include 4 chars of ASCII so that the NFT currency code has a human-readable portion. This would make it easy for clients to show something recognizable without needing to do a lookup in an external database. Example:
|
Beta Was this translation helpful? Give feedback.
{{title}}
{{editor}}'s edit
{{editor}}'s edit
-
A few questions:
Here are a few ideas for uses of XRP NFT's:
The unique advantage of an NFT is that the purchaser can resell their ownership. |
Beta Was this translation helpful? Give feedback.
-
Can this proposal include storing data that can be used by the Ripple Data API v2, to filter the ledger for all NFT's, or just one type of NFT (like CryptoPunk)? Ripple Data API v2 includes the following methods that can accept query parameters to retrieve particular Transactions:
Without filtering capability, how would one display a list of all NFT's (and a list of just one type of NFT) without storing the data off-chain? To get all transactions in the ledger, and manually filter, does not seem feasible. |
Beta Was this translation helpful? Give feedback.
-
You indicated that your proposal requires users to "opt in" to receive a specific token from a specific issuer, by explicitly signing a TrustSet transaction. Will this requirement eliminate the ability to use Ripple to create and manage a project such as the Kings Of Leon album that was just released as an NFT: If someone paid for a music album as a Ripple NFT, will the recipient have to go through a process that may be difficult for a novice? With Ethereum, you can create the NFT without any action from the recipient, and the NFT will immediately appear at etherscan.io. Of course, creating an NFT with Ethereum currently costs more than $20, which is why a Ripple solution would be preferable. |
Beta Was this translation helpful? Give feedback.
{{title}}
{{editor}}'s edit
{{editor}}'s edit
-
Throwing this idea into the mix: Edit: Edit 2: |
Beta Was this translation helpful? Give feedback.
{{title}}
{{editor}}'s edit
{{editor}}'s edit
-
This is super exciting! @Wietse-Livingroom do you have a plan to support fractional NFT with perhaps an extension to this proposal? I think fractional NFT would be of tremendous value in the near future. Also, we should consider DEX support of NFT as well. XRPL is uniquely positioned to succeed in the NFT ecosystem IMO and if we can have a standard/plan to support NFT on DEX, that would be great. I also don't think blackhole steps needed as we inherently trust the NFT issuers already. But that is minor. Finally, this is not mentioned here, but what if we encoded the NFT's configurations into the currency code vs memo? For example, can this NFT be further divided into fractional NFT? |
Beta Was this translation helpful? Give feedback.
{{title}}
{{editor}}'s edit
{{editor}}'s edit
-
DEPRECATION NOTICE
This proposal is DEPRECATED and should not be used. It served as a proof of concept. With XLS 20 being developed as we speak it is a bad practice (imo) to use XLS 14.
NFTs
A non-fungible token (NFT) is a special type of cryptographic token which represents something unique; non-fungible tokens are thus not mutually interchangeable. This is in contrast to eg. the native asset on the XRPL,
XRP
, where XRP can be sent and received without being uniquely (per token) identified.Where normal tokens and the native asset
XRP
can be divided (eg. receive 1 XRP, send 0.5 XRP), NFT's can only be used as one whole, unique token: they are indivisible.Applications
Non-fungible tokens are used to create verifiable digital scarcity, as well as digital ownership, and the possibility of asset interoperability across multiple platforms. NFTs are used in several specific applications that require unique digital items like crypto art, digital collectibles, and online gaming.
Issuing tokens on the XRP Ledger
The XRPL supports issuing tokens (formerly (?) called "IOU's") that can be issued, sent, transacted to other XPRL accounts, etc.) as can be read in the XRPL Docs.
Note on issued tokens on the XRPL
Issuing tokens on the XRPL
A simple issue procedure of a token on the XRP Ledger:
AccountSet
transaction, setting flag8
: "Default Rippling". This is required for future Trust Lines set up by users, to allow them to send the token to each other.TrustSet
transaction, trusting the token code to be issued by the Issuing account (this process should be repeated by all future recipients of this token)Payment
transaction to issue X amount of the token code to the Receiving Hot WalletSetRegularKey
to an account that can't be accessed by anyone, eg.rrrrrrrrrrrrrrrrrrrrBZbvji
AccountSet
to disable the native key of the keypair to that accountThe procedure outlined above works & is actively being used, but results in fungible tokens: they can be send partially, and any value of the issued cannot be uniquely identified.
Issuing NFTs the XRPL
The XRP Ledger has an issued token precision of 15 significant figures. The smallest amount of an issued token the XRPL can handle is
1000000000000000e-96
. The decimal value of this scientific notation is:0.000000000000000000000000000000000000000000000000000000000000000000000000000000001
0.{80 zeroes}1
This is a quite unusual amount of decimal positions for real life use cases. There is no likely use case that requires that amount of decimal places to ever be used, as there will always be something closer to the decimal sign. This results in the last digits being sliced off anyway (because of the XRPL supported 15 significant figures). Even some value of a BTC IOU (8 decimal places) + Transfer Fee + rounding doesn't even come close to using anything close to the available decimal places.
Proposal
Let's assign the last (say) 11 figures to client side / user interface 'NFT behaviour':
0.000000000000000000000000000000000000000000000000000000000000000000000000000000001
0.0000000000000000000000000000000000000000000000000000000000000000000001
0.0000000000000000000000000000000000000000000000000000000000000000000000
|00000000001
As you can't divide values it even further (they are already behind the decimal separator, and will be turned into the scientific notation when querying the XRPL), if only one (1) token value is issued, only one (1) token value can be sent.
So: if the value of issued currency is in the range of
1000000000000000e-85
-1000000000000000e-96
, clients should handle (represent, mostly a user interface affair) the amount as NFT.This requires no amendment on the XRPL side, as all of this is possible today.
Issuer (issuing account) requirements
Domain
value (AccountSet
) must be set, and resolve to a (to be discussed separately) https:// document providing token information. This can be discussed separately from this proposal, as existing issued tokens would benefit from a standard like that as well.0x02
prefix for HEX currency (token) code. The remaining HEX currency (token) code can be used to identify the unique asset (UTF8 to HEX). The HEX currency (token) code should resolve to object information using theDomain
value + a appended value (to be determined, eg. a.well-known
setup / extension of the XRPL TOML /EIP-1155
, ... (needs another proposal)Issuer (issuing account) best practices
1000000000000000e-96
) of each token, create unique tokens for unique objectsEmailHash
value (AccountSet
). Possibly use eg. Gravatar to list your email address and attach a logo, so explorers like Bithomp show a logoImplementation
This sample implementation in Javascript can:
Payment
transactionVice versa, when composing a transaction, amounts (possibly user input) should be converted to NFT representation:
Note on amounts of tokens issued (good / bad practice)
It is considered a practice to issue too many of the same NFT-like tokens (amounts). One can argue that issuing a large amount of tokens as per this proposal, the issued token can no longer be considered a Non Fungible Token.
If a token represents a real life object, eg. a painting, and there are three unique paintings, then three unique tokens will be issued (presumably using HEX currency codes representing the three unique paintings). All unique issued tokens will have an issued amount of
1000000000000000e-96
(NFT-like representation: 1).Only the account that has a Trust Line to the issuer and for a specific token setup, and owns the indivisible value of
1000000000000000e-96
owns the NFT.Impact (user interface, logic, code)
Amounts fetched from the XRPL (Trust Line balance, Payment value, etc.) should be checked if an amount is NFT-like:
3100000000000000e-95
is represented as31
).Payment
transaction) the user input should be converted to NFT-like scientific notationIssuer (issuing account) requirements
above)1000000000000000e-85
This issue contains the planned changelog for adding support for XLS-14d to XUMM Wallet.
Advantages
Potential disadvantages:
Payment
transactions will work.Sample (issuing, sending)
Here's a sample issue + NFT sending sequence containing XPRL JSON template transactions.
Beta Was this translation helpful? Give feedback.
All reactions