diff --git a/content/_snippets/nfts-disclaimer.md b/content/_snippets/nfts-disclaimer.md new file mode 100644 index 0000000000..5d7e4e36fe --- /dev/null +++ b/content/_snippets/nfts-disclaimer.md @@ -0,0 +1 @@ +_The XLS-20 standard for NFTs :not_enabled: has a preliminary implementation that can be used in test networks, but is not yet available as an [amendment](amendments.html) to the XRP Ledger protocol. An amendment may be included in a future XRP Ledger release._ diff --git a/content/concepts/nft-concepts/nft-conceptual-overview.md b/content/concepts/nft-concepts/nft-conceptual-overview.md index 709ae2ae4b..da65b01fe1 100644 --- a/content/concepts/nft-concepts/nft-conceptual-overview.md +++ b/content/concepts/nft-concepts/nft-conceptual-overview.md @@ -10,8 +10,9 @@ status: not_enabled --- # NFT Conceptual Overview +{% include '_snippets/nfts-disclaimer.md' %} -The XRP Ledger offers support for tokens, also known as _IOUs _or _issued assets_. Such assets are, primarily, fungible. +The XRP Ledger offers support for tokens, also known as _IOUs _or _issued assets_. Such assets are, primarily, fungible. Fun·gi·ble /ˈfənjəbəl/ (adj) @@ -27,7 +28,7 @@ A good example of a fungible item might be a postage stamp. If you are standing ![Jenny Stamps](img/nft-concepts1.png "Jenny Stamps") -But since you are standing around in 1919, you might be offered 24-cent airmail stamps where the aeroplane on the stamp is accidentally printed upside down. These are the world famous “Inverted Jenny” stamps. Only 100 were circulated on a single sheet of stamps, making them extremely rare and sought after. The current value of each mint condition stamp is appraised at over $1.5 million dollars. +But since you are standing around in 1919, you might be offered 24-cent airmail stamps where the aeroplane on the stamp is accidentally printed upside down. These are the world famous “Inverted Jenny” stamps. Only 100 were circulated on a single sheet of stamps, making them extremely rare and sought after. The current value of each mint condition stamp is appraised at over $1.5 million dollars. ![Jenny Stamps](img/nft-concepts2.png "Jenny Stamps") diff --git a/content/concepts/nft-concepts/nftoken.md b/content/concepts/nft-concepts/nftoken.md index 7b2144edc4..cc8a0ecc51 100644 --- a/content/concepts/nft-concepts/nftoken.md +++ b/content/concepts/nft-concepts/nftoken.md @@ -9,6 +9,7 @@ labels: status: not_enabled --- # The `NFToken` Object +{% include '_snippets/nfts-disclaimer.md' %} The `NFToken` object represents a single NFT. This is an example of an `NFToken` object in JSON format, consisting of `TokenID` and `URI` fields. @@ -47,7 +48,7 @@ The 16-bit flags, transfer fee fields, the 32-bit taxon, and the sequence number ## Flags -Flags are properties or other options associated with the `NFToken` object. +Flags are properties or other options associated with the `NFToken` object. @@ -136,7 +137,7 @@ The third section of the TokenID is a big endian representation of the issuer’ ### Taxon The fourth section is a taxon created by the issuer. - + ![Taxon](img/nftokend.png "Taxon") An issuer might issue several NFTs with the same taxon; to ensure that NFTs are spread across multiple pages, the taxon is scrambled using the fifth section, a dumb sequential number, as the seed for a random number generator. The scrambled value is stored with the `NFToken`, but the unscrambled value is the actual taxon. @@ -151,7 +152,7 @@ Notice that the scrambled version of the taxon is `0xBC8B858E`: the scrambled ve The URI field points to the data and/or metadata associated with the `NFToken`. This field need not be an HTTP or HTTPS URL; it could be an IPFS URI, a magnet link, immediate data encoded as an RFC2379 ["data" URL](https://datatracker.ietf.org/doc/html/rfc2397), or even an opaque issuer-specific encoding. The URI is not checked for validity, but the field is limited to a maximum length of 256 bytes. -One drawback of using this method is that the value is immutable, so it commits the issuer to hosting the data in perpetuity. +One drawback of using this method is that the value is immutable, so it commits the issuer to hosting the data in perpetuity. # Retrieving `NFToken` Data and Metadata diff --git a/content/concepts/nft-concepts/nftokenburn.md b/content/concepts/nft-concepts/nftokenburn.md index 490dfe020f..3567157783 100644 --- a/content/concepts/nft-concepts/nftokenburn.md +++ b/content/concepts/nft-concepts/nftokenburn.md @@ -9,6 +9,7 @@ labels: status: not_enabled --- # The `NFTokenBurn` Transaction +{% include '_snippets/nfts-disclaimer.md' %} The `NFTokenBurn` transaction is used to remove a `NFToken` object from the `NFTokenPage` in which it is being held, effectively removing the token from the ledger (_burning_ it). diff --git a/content/concepts/nft-concepts/nftokenmint.md b/content/concepts/nft-concepts/nftokenmint.md index 70a4b3a850..a2557e09d7 100644 --- a/content/concepts/nft-concepts/nftokenmint.md +++ b/content/concepts/nft-concepts/nftokenmint.md @@ -9,6 +9,7 @@ labels: status: not_enabled --- # The `NFTokenMint` Transaction +{% include '_snippets/nfts-disclaimer.md' %} The `NFTokenMint` transaction creates a `NFToken` object and adds it to the relevant `NFTokenPage` object of the `minter`. A required parameter to this transaction is the `Token` field specifying the actual token. This transaction is the only opportunity the `minter` has to specify any token fields that are defined as immutable (for example, the `TokenFlags`). @@ -91,7 +92,7 @@ In executing, this transaction examines the `MintedTokens` field in the account
  • match the Issuer field in the NFToken object; or -
  • match the MintAccount field in the AccountRoot of the Issuer field in the NFToken object. +
  • match the MintAccount field in the AccountRoot of the Issuer field in the NFToken object.
  • diff --git a/content/concepts/nft-concepts/nftokenoffer.md b/content/concepts/nft-concepts/nftokenoffer.md index 62fbe96aa6..4388511667 100644 --- a/content/concepts/nft-concepts/nftokenoffer.md +++ b/content/concepts/nft-concepts/nftokenoffer.md @@ -9,6 +9,7 @@ labels: status: not_enabled --- # The `NFTokenOffer` Ledger Entry +{% include '_snippets/nfts-disclaimer.md' %} Tokens that have the `lsfTransferable` flag set can be transferred among participants using offers. @@ -307,7 +308,7 @@ Each offer costs one incremental reserve.
  • If the offer is to buy a token, this field must be present and it must be different than Account (since an offer to buy a token one already holds is meaningless). -
  • If the offer is to sell a token, this field must not be present, as the owner is, implicitly, the same as Account (since an offer to sell a token one doesn't already hold is meaningless). +
  • If the offer is to sell a token, this field must not be present, as the owner is, implicitly, the same as Account (since an offer to sell a token one doesn't already hold is meaningless).
  • diff --git a/content/concepts/nft-concepts/nftokenpage.md b/content/concepts/nft-concepts/nftokenpage.md index 6f77359af1..4ff7b37e3d 100644 --- a/content/concepts/nft-concepts/nftokenpage.md +++ b/content/concepts/nft-concepts/nftokenpage.md @@ -9,6 +9,7 @@ labels: status: not_enabled --- # The `NFTokenPage` Object +{% include '_snippets/nfts-disclaimer.md' %} The `NFTokenPage` object represents a collection of `NFToken` objects owned by the same account. An account can have multiple `NFTokenPage` ledger objects, which form a doubly-linked list (DLL). @@ -20,16 +21,16 @@ The following is an example `NFTokenPage` object in JSON format. "LedgerEntryType": "NFTokenPage", "PreviousTokenPage": "598EDFD7CF73460FB8C695d6a9397E907378C8A841F7204C793DCBEF5406", - "PreviousTokenNext": + "PreviousTokenNext": "598EDFD7CF73460FB8C695d6a9397E9073781BA3B78198904F659AAA252A", - "PreviousTxnID": + "PreviousTxnID": "95C8761B22894E328646F7A70035E9DFBECC90EDD83E43B7B973F626D21A0822", - "PreviousTxnLgrSeq": + "PreviousTxnLgrSeq": 42891441, "Tokens": { { - "TokenID": + "TokenID": "000B013A95F14B0044F78A264E41713C64B5F89242540EE208C3098E00000D65", "URI": "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf4dfuylqabf3oclgtqy55fbzdi" @@ -234,4 +235,3 @@ The value of the incremental reserve is, as of this writing, 2 XRP. The table be
    - diff --git a/content/tutorials/use-nfts/nftoken-tester-tutorial.md b/content/tutorials/use-nfts/nftoken-tester-tutorial.md index 9a2b5b27bc..6edce1b3ea 100644 --- a/content/tutorials/use-nfts/nftoken-tester-tutorial.md +++ b/content/tutorials/use-nfts/nftoken-tester-tutorial.md @@ -10,6 +10,8 @@ status: not_enabled --- # NFToken Tester Tutorial +{% include '_snippets/nfts-disclaimer.md' %} + This example builds a JavaScript test harness where you can create NFTokens and associated transactions. Each button triggers a frequently used request or transaction used to manage `NFTokens`. The fields provided let you enter required parameters. @@ -131,7 +133,7 @@ async function mintToken() { ``` console.log("Transaction result:", tx.result.meta.TransactionResult) - console.log("Balance changes:", + console.log("Balance changes:", JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2)) ``` @@ -231,7 +233,7 @@ async function getTokens() { ## The `NFTokenBurn` Transaction -Use `NFTokenBurn` to permanently destroy a `NFToken`. In practice, the `NFToken` is transferred to an account that is inaccessible, rendering it irretrievable. +Use `NFTokenBurn` to permanently destroy a `NFToken`. In practice, the `NFToken` is transferred to an account that is inaccessible, rendering it irretrievable. To destroy a `NFToken`: @@ -322,7 +324,7 @@ async function burnToken() { ``` console.log(nfts) console.log("Transaction result:", tx.result.meta.TransactionResult) - console.log("Balance changes:", + console.log("Balance changes:", JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2)) ``` @@ -347,7 +349,7 @@ You use `NFTokenCreateOffer` to offer `NFTokens` for sale or to propose a purcha ### The `createSellOffer()` function -The `createSellOffer`() function adds an item to the ledger placing a `NFToken` from your account up for sale. Other accounts can discover the offer and choose to accept the transaction to purchase your item. +The `createSellOffer`() function adds an item to the ledger placing a `NFToken` from your account up for sale. Other accounts can discover the offer and choose to accept the transaction to purchase your item. To create an offer to sell a `NFToken`: @@ -457,9 +459,9 @@ async function createSellOffer() { ``` - console.log("Transaction result:", + console.log("Transaction result:", JSON.stringify(tx.result.meta.TransactionResult, null, 2)) - console.log("Balance changes:", + console.log("Balance changes:", JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2)) ``` @@ -590,9 +592,9 @@ async function createBuyOffer() { ``` - console.log("Transaction result:", + console.log("Transaction result:", JSON.stringify(tx.result.meta.TransactionResult, null, 2)) - console.log("Balance changes:", + console.log("Balance changes:", JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2)) ``` @@ -768,7 +770,7 @@ async function cancelOffer() { ``` - const tx = await client.submitAndWait(transactionBlob,{wallet}) + const tx = await client.submitAndWait(transactionBlob,{wallet}) ``` @@ -810,9 +812,9 @@ async function cancelOffer() { ``` console.log(JSON.stringify(nftBuyOffers,null,2)) - console.log("Transaction result:", + console.log("Transaction result:", JSON.stringify(tx.result.meta.TransactionResult, null, 2)) - console.log("Balance changes:", + console.log("Balance changes:", JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2)) ``` @@ -900,7 +902,7 @@ async function acceptSellOffer() { ``` - const tx = await client.submitAndWait(transactionBlob,{wallet}) + const tx = await client.submitAndWait(transactionBlob,{wallet}) ``` @@ -915,10 +917,10 @@ async function acceptSellOffer() { account: wallet.classicAddress }) console.log(JSON.stringify(nfts,null,2)) - console.log("Transaction result:", + console.log("Transaction result:", JSON.stringify(tx.result.meta.TransactionResult, null, 2)) - console.log("Balance changes:", - JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2)) + console.log("Balance changes:", + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2)) ``` @@ -1000,7 +1002,7 @@ async function acceptBuyOffer() { ``` - const tx = await client.submitAndWait(transactionBlob,{wallet}) + const tx = await client.submitAndWait(transactionBlob,{wallet}) ``` @@ -1015,10 +1017,10 @@ async function acceptBuyOffer() { account: wallet.classicAddress }) console.log(JSON.stringify(nfts,null,2)) - console.log("Transaction result:", + console.log("Transaction result:", JSON.stringify(tx.result.meta.TransactionResult, null, 2)) console.log("Balance changes:", - JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2)) + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2)) ```