--- html: mint-and-burn-nftokens.html parent: xrpl-quickstart.html blurb: Quickstart step 3, mint and burn NFTokens. labels: - Quickstart - Tokens - Non-fungible tokens, NFTs --- # 3. Mint and Burn NFTokens {% include '_snippets/nfts-disclaimer.md' %} This example shows how to: 1. Mint new Non-fungible Tokens (NFTokens). 2. Get a list of existing NFTokens. 3. Delete (Burn) a NFToken. ![Test harness with mint NFToken fields](img/quickstart8.png) # Usage You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/quickstart.zip) archive to try the sample in your own browser. ## Get Accounts 1. Open `3.mint-nfts.html` in a browser. 2. Get test accounts. 1. If you have existing NFT-Devnet account seeds: 1. Paste the account seeds in the **Seeds** field. 2. Click **Get Accounts from Seeds**. 2. If you do not have existing NFT-Devnet accounts: 1. Click **Get New Standby Account**. 2. Click **Get New Operational Account**. ![Get accounts](img/quickstart9.png) ## Mint a NFToken To mint a non-fungible token object: 1. Set the **Flags** field. For testing purposes, we recommend setting the value to _8_. This sets the _tsTransferable_ flag, meaning that the NFToken object can be transferred to another account. Otherwise, the NFToken object can only be transferred back to the issuing account. See [NFToken Mint](https://xrpl.org/nftokenmint.html#:~:text=Example%20NFTokenMint%20JSON-,NFTokenMint%20Fields,-NFTokenMint%20Flags) for information about all of the available flags for minting NFTokens. 2. Enter the **Token URL**. This is a URI that points to the data or metadata associated with the NFToken object. You can use the sample URI provided if you do not have one of your own. 3. Enter the **Transfer Fee**, a percentage of the proceeds from future sales of the NFToken that will be returned to the original creator. This is a value of 0-50000 inclusive, allowing transfer rates between 0.000% and 50.000% in increments of 0.001%. If you do not set the **Flags** field to allow the NFToken to be transferrable, set this field to 0. 4. Click **Mint Token**. ![Mint NFToken fields](img/quickstart10.png) ## Get Tokens Click **Get Tokens** to get a list of NFTokens owned by the account. ![Get NFTokens](img/quickstart11.png) ## Burn a Token The current owner of a NFToken can always destroy (or _burn)_ a NFToken object. To permanently destroy a NFToken: 1. Enter the **Token ID**. 2. Click **Burn Token**. ![Burn NFTokens](img/quickstart12.png) # Code Walkthrough You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/quickstart.zip) archive to examine the code samples. ## ripplex3-mint-nfts.js ### Mint Token ``` // ******************************************************* // ********************** Mint Token ********************* // ******************************************************* async function mintToken() { ``` Connect to the ledger and get the account wallets. ``` results = 'Connecting to ' + getNet() + '....' document.getElementById('standbyResultField').value = results let net = getNet() const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) const client = new xrpl.Client(net) await client.connect() results += '\nConnected. Minting NFToken.' document.getElementById('standbyResultField').value = results ``` Define the transaction. ``` const transactionBlob = { "TransactionType": "NFTokenMint", "Account": standby_wallet.classicAddress, ``` Note that the URI field expects a hexadecimal value rather than the literal URI string. You can use the `convertStringToHex` utility to transform the URI in real time. ``` "URI": xrpl.convertStringToHex(standbyTokenUrlField.value), ``` If you want the NFToken to be transferable to third parties, set the **Flags** field to _8_. ``` "Flags": parseInt(standbyFlagsField.value), ``` The Transfer Fee is a value 0 to 50000, used to set a royalty of 0.000% to 50.000% in increments of 0.001. ``` "TransferFee": parseInt(standbyTransferFeeField.value), ``` The TokenTaxon is a required value. It is an arbitrary value defined by the issuer. If you do not have a use for the field, you can set it to _0_. ``` "NFTokenTaxon": 0 //Required, but if you have no use for it, set to zero. } ``` Send the transaction and wait for the response. ``` const tx = await client.submitAndWait(transactionBlob, { wallet: standby_wallet} ) ``` Request a list of NFTs owned by the account. ``` const nfts = await client.request({ method: "account_nfts", account: standby_wallet.classicAddress }) ``` Report the results. ``` results += '\n\nTransaction result: '+ tx.result.meta.TransactionResult results += '\n\nnfts: ' + JSON.stringify(nfts, null, 2) document.getElementById('standbyBalanceField').value = (await client.getXrpBalance(standby_wallet.address)) document.getElementById('operationalBalanceField').value = results ``` Disconnect from the ledger. ``` client.disconnect() } //End of mintToken() ``` ### Get Tokens ``` // ******************************************************* // ******************* Get Tokens ************************ // ******************************************************* async function getTokens() { ``` Connect to the ledger and get the account wallet. ``` const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) let net = getNet() const client = new xrpl.Client(net) results = 'Connecting to ' + net + '...' document.getElementById('standbyResultField').value = results await client.connect() results += '\nConnected. Getting NFTokens...' document.getElementById('standbyResultField').value = results ``` Request a list of NFTs owned by the account. ``` const nfts = await client.request({ method: "account_nfts", account: standby_wallet.classicAddress }) ``` Report the results. ``` results += '\nNFTs:\n ' + JSON.stringify(nfts,null,2) document.getElementById('standbyResultField').value = results ``` Disconnect from the ledger. ``` client.disconnect() } //End of getTokens() ``` ### Burn Token ``` // ******************************************************* // ********************* Burn Token ********************** // ******************************************************* ``` Connect to the ledger and get the account wallets. ``` async function burnToken() { const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) let net = getNet() const client = new xrpl.Client(net) results = 'Connecting to ' + net + '...' document.getElementById('standbyResultField').value = results await client.connect() results += '\nConnected. Burning NFToken...' document.getElementById('standbyResultField').value = results ``` Define the transaction. ``` const transactionBlob = { "TransactionType": "NFTokenBurn", "Account": standby_wallet.classicAddress, "TokenID": standbyTokenIdField.value } ``` Submit the transaction and wait for the results. ``` const tx = await client.submitAndWait(transactionBlob,{wallet: standby_wallet}) ``` Request a list of NFTokens owned by the client. ``` const nfts = await client.request({ method: "account_nfts", account: standby_wallet.classicAddress }) ``` Report the results. ``` results += '\nTransaction result: '+ tx.result.meta.TransactionResult results += '\nBalance changes: ' + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) document.getElementById('standbyResultField').value = results document.getElementById('standbyBalanceField').value = (await client.getXrpBalance(standby_wallet.address)) results += '\nNFTs: \n' + JSON.stringify(nfts,null,2) document.getElementById('standbyResultField').value = results client.disconnect() } // End of burnToken() ``` ### Reciprocal Transactions ``` // ******************************************************* // ************** Operational Mint Token ***************** // ******************************************************* async function oPmintToken() { results = 'Connecting to ' + getNet() + '....' document.getElementById('operationalResultField').value = results let net = getNet() const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) const client = new xrpl.Client(net) await client.connect() results += '\nConnected. Minting NFToken.' document.getElementById('operationalResultField').value = results // Note that you must convert the token URL to a hexadecimal // value for this transaction. // ------------------------------------------------------------------------ const transactionBlob = { "TransactionType": 'NFTokenMint', "Account": operational_wallet.classicAddress, "URI": xrpl.convertStringToHex(operationalTokenUrlField.value), "Flags": parseInt(operationalFlagsField.value), "TransferFee": parseInt(operationalTransferFeeField.value), "NFTokenTaxon": 0 //Required, but if you have no use for it, set to zero. } // ----------------------------------------------------- Submit signed blob const tx = await client.submitAndWait(transactionBlob, { wallet: operational_wallet} ) const nfts = await client.request({ method: "account_nfts", account: operational_wallet.classicAddress }) // ------------------------------------------------------- Report results results += '\n\nTransaction result: '+ tx.result.meta.TransactionResult results += '\n\nnfts: ' + JSON.stringify(nfts, null, 2) document.getElementById('operationalBalanceField').value = (await client.getXrpBalance(operational_wallet.address)) document.getElementById('operationalResultField').value = results client.disconnect() } //End of oPmintToken // ******************************************************* // ************** Operational Get Tokens ***************** // ******************************************************* async function oPgetTokens() { const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) let net = getNet() const client = new xrpl.Client(net) results = 'Connecting to ' + getNet() + '...' document.getElementById('operationalResultField').value = results await client.connect() results += '\nConnected. Getting NFTokens...' document.getElementById('operationalResultField').value = results const nfts = await client.request({ method: "account_nfts", account: operational_wallet.classicAddress }) results += '\nNFTs:\n ' + JSON.stringify(nfts,null,2) document.getElementById('operationalResultField').value = results client.disconnect() } //End of oPgetTokens // ******************************************************* // ************* Operational Burn Token ****************** // ******************************************************* async function oPburnToken() { const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) let net = getNet() const client = new xrpl.Client(net) results = 'Connecting to ' + getNet() + '...' document.getElementById('operationalResultField').value = results await client.connect() results += '\nConnected. Burning NFToken...' document.getElementById('operationalResultField').value = results // ------------------------------------------------------- Prepare transaction const transactionBlob = { "TransactionType": "NFTokenBurn", "Account": operational_wallet.classicAddress, "NFTokenID": operationalTokenIdField.value } //-------------------------------------------------------- Submit signed blob const tx = await client.submitAndWait(transactionBlob,{wallet: operational_wallet}) const nfts = await client.request({ method: "account_nfts", account: operational_wallet.classicAddress }) results += '\nTransaction result: '+ tx.result.meta.TransactionResult results += '\nBalance changes: ' + JSON.stringify(xrpl.getBalanceChanges(tx.result.meta), null, 2) document.getElementById('operationalResultField').value = results document.getElementById('operationalBalanceField').value = (await client.getXrpBalance(operational_wallet.address)) document.getElementById('operationalBalanceField').value = (await client.getXrpBalance(operational_wallet.address)) results += '\nNFTs: \n' + JSON.stringify(nfts,null,2) document.getElementById('operationalResultField').value = results client.disconnect() } // End of oPburnToken() ``` ## 3.mint-nfts.html Bold text in the following indicates changes to the form that support the new functions. ``` Token Test Harness

Token Test Harness

Choose your ledger instance:      




Standby Account
Public Key
Private Key
Seed
XRP Balance
Amount
Destination
Currency
NFToken URL
Flags
NFToken ID
Transfer Fee

















Operational Account
Public Key
Private Key
Seed
XRP Balance
Amount
Destination
Currency
NFToken URL
Flags
NFToken ID
Transfer Fee

``` --- | Previous | Next | | :--- | ---: | | [← 2. Create TrustLine and Send Currency >](create-trustline-send-currency.html) | [4. Transfer NFTokens → >](transfer-nftokens.html) | {% include '_snippets/rippled-api-links.md' %} {% include '_snippets/tx-type-links.md' %} {% include '_snippets/rippled_versions.md' %}