Mint and Burn NFTs Using JavaScript
This example shows how to:
- Mint new Non-fungible Tokens (NFTs).
- Get a list of existing NFTs.
- Delete (Burn) an NFT.
Usage
You can download the Quickstart Samples archive to try the sample in your own browser.
Get Accounts
- Open
3.mint-nfts.html
in a browser. - Get test accounts.
- If you have existing Testnet account seeds:
- Paste the account seeds in the Seeds field.
- Click Get Accounts from Seeds.
- If you do not have existing Testnet accounts:
- Click Get New Standby Account.
- Click Get New Operational Account.
- If you have existing Testnet account seeds:
Mint an NFT
To mint a non-fungible token object:
- Set the Flags field. For testing purposes, we recommend setting the value to 8. This sets the tsTransferable flag, meaning that the NFT object can be transferred to another account. Otherwise, the NFT object can only be transferred back to the issuing account.
- Enter the Token URL. This is a URI that points to the data or metadata associated with the NFT object. You can use the sample URI provided if you do not have one of your own.
- Enter the Transfer Fee, a percentage of the proceeds from future sales of the NFT 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 NFT to be transferrable, set this field to 0.
- Click Mint NFT.
Get Tokens
Click Get NFTs to get a list of NFTs owned by the account.
Burn a Token
The current owner of an NFT can always destroy (or burn) an NFT object.
To permanently destroy an NFT:
- Enter the Token ID.
- Click Burn NFT.
Code Walkthrough
You can download the Quickstart Samples 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() + '....' 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 NFT.' standbyResultField.value = results
Define the transaction.
const transactionJson = { "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 NFT 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(transactionJson, { 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) standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) standbyResultField.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.
const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) let net = getNet() const client = new xrpl.Client(net) results = 'Connecting to ' + net + '...' standbyResultField.value = results await client.connect() results += '\nConnected. Getting NFTs...' 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) standbyResultField.value = results
Disconnect from the ledger.
client.disconnect() } //End of getTokens()
Burn Token
// ******************************************************* // ********************* Burn Token ********************** // ******************************************************* async function burnToken() {
Connect to the ledger and get the account wallets.
const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) let net = getNet() const client = new xrpl.Client(net) results = 'Connecting to ' + net + '...' standbyResultField.value = results await client.connect() results += '\nConnected. Burning NFT...' standbyResultField.value = results
Define the transaction.
const transactionBlob = { "TransactionType": "NFTokenBurn", "Account": standby_wallet.classicAddress, "NFTokenID": standbyTokenIdField.value }
Submit the transaction and wait for the results.
const tx = await client.submitAndWait(transactionBlob,{wallet: standby_wallet})
Request a list of NFTs 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) standbyResultField.value = results standbyBalanceField.value = (await client.getXrpBalance(standby_wallet.address)) results += '\nNFTs: \n' + JSON.stringify(nfts,null,2) standbyResultField.value = results client.disconnect() }// End of burnToken()
Reciprocal Transactions
These transactions are the same as the Standby account transactions, but for the Operational account.
// ******************************************************* // ************** Operational Mint Token ***************** // ******************************************************* async function oPmintToken() { results = 'Connecting to ' + getNet() + '....' 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 NFT.' 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) operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) 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() + '...' operationalResultField.value = results await client.connect() results += '\nConnected. Getting NFTs...' operationalResultField.value = results const nfts = await client.request({ method: "account_nfts", account: operational_wallet.classicAddress }) results += '\nNFTs:\n ' + JSON.stringify(nfts,null,2) 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() + '...' operationalResultField.value = results await client.connect() results += '\nConnected. Burning NFT...' 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) operationalResultField.value = results operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) operationalBalanceField.value = (await client.getXrpBalance(operational_wallet.address)) results += '\nNFTs: \n' + JSON.stringify(nfts,null,2) operationalResultField.value = results client.disconnect() } // End of oPburnToken()
3.mint-nfts.html
<html> <head> <title>Token Test Harness</title> <link href='https://fonts.googleapis.com/css?family=Work Sans' rel='stylesheet'> <style> body{font-family: "Work Sans", sans-serif;padding: 20px;background: #fafafa;} h1{font-weight: bold;} input, button {padding: 6px;margin-bottom: 8px;} button{font-weight: bold;font-family: "Work Sans", sans-serif;} td{vertical-align: middle;} </style> <script src='https://unpkg.com/[email protected]/build/xrpl-latest-min.js'></script> <script src='ripplex1-send-xrp.js'></script> <script src='ripplex2-send-currency.js'></script> <script src='ripplex3-mint-nfts.js'></script> <script> if (typeof module !== "undefined") { const xrpl = require('xrpl') } </script> </head> <!-- ************************************************************** --> <!-- ********************** The Form ****************************** --> <!-- ************************************************************** --> <body> <h1>Token Test Harness</h1> <form id="theForm"> Choose your ledger instance: <input type="radio" id="tn" name="server" value="wss://s.altnet.rippletest.net:51233" checked> <label for="testnet">Testnet</label> <input type="radio" id="dn" name="server" value="wss://s.devnet.rippletest.net:51233"> <label for="devnet">Devnet</label> <br/><br/> <button type="button" onClick="getAccountsFromSeeds()">Get Accounts From Seeds</button> <br/> <textarea id="seeds" cols="40" rows= "2"></textarea> <br/><br/> <table> <tr valign="top"> <td> <table> <tr valign="top"> <td> <td> <button type="button" onClick="getAccount('standby')">Get New Standby Account</button> <table> <tr valign="top"> <td align="right"> Standby Account </td> <td> <input type="text" id="standbyAccountField" size="40"></input> <br> </td> </tr> <tr> <td align="right"> Public Key </td> <td> <input type="text" id="standbyPubKeyField" size="40"></input> <br> </td> </tr> <tr> <td align="right"> Private Key </td> <td> <input type="text" id="standbyPrivKeyField" size="40"></input> <br> </td> </tr> <tr> <td align="right"> Seed </td> <td> <input type="text" id="standbySeedField" size="40"></input> <br> </td> </tr> <tr> <td align="right"> XRP Balance </td> <td> <input type="text" id="standbyBalanceField" size="40"></input> <br> </td> </tr> <tr> <td align="right"> Amount </td> <td> <input type="text" id="standbyAmountField" size="40"></input> <br> </td> </tr> <tr> <td align="right"> Destination </td> <td> <input type="text" id="standbyDestinationField" size="40"></input> <br> </td> </tr> <tr valign="top"> <td><button type="button" onClick="configureAccount('standby',document.querySelector('#standbyDefault').checked)">Configure Account</button></td> <td> <input type="checkbox" id="standbyDefault" checked="true"/> <label for="standbyDefault">Allow Rippling</label> </td> </tr> <tr> <td align="right"> Currency </td> <td> <input type="text" id="standbyCurrencyField" size="40" value="USD"></input> </td> </tr> <tr> <td align="right">NFT URL</td> <td><input type="text" id="standbyTokenUrlField" value = "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf4dfuylqabf3oclgtqy55fbzdi" size="80"/> </td> </tr> <tr> <td align="right">Flags</td> <td><input type="text" id="standbyFlagsField" value="1" size="10"/></td> </tr> <tr> <td align="right">NFT ID</td> <td><input type="text" id="standbyTokenIdField" value="" size="80"/></td> </tr> <tr> <td align="right">Transfer Fee</td> <td><input type="text" id="standbyTransferFeeField" value="" size="80"/></td> </tr> </table> <p align="left"> <textarea id="standbyResultField" cols="80" rows="20" ></textarea> </p> </td> </td> <td> <table> <tr valign="top"> <td align="center" valign="top"> <button type="button" onClick="sendXRP()">Send XRP></button> <br/><br/> <button type="button" onClick="createTrustline()">Create TrustLine</button> <br/> <button type="button" onClick="sendCurrency()">Send Currency</button> <br/> <button type="button" onClick="getBalances()">Get Balances</button> <br/><br/> <button type="button" onClick="mintToken()">Mint NFT</button> <br/> <button type="button" onClick="getTokens()">Get NFTs</button> <br/> <button type="button" onClick="burnToken()">Burn NFT</button> </td> </tr> </td> </tr> </table> </td> </tr> </table> </td> <td> <table> <tr> <td> <td> <table> <tr> <td align="center" valign="top"> <button type="button" onClick="oPsendXRP()">< Send XRP</button> <br/><br/> <button type="button" onClick="oPcreateTrustline()">Create TrustLine</button> <br/> <button type="button" onClick="oPsendCurrency()">Send Currency</button> <br/> <button type="button" onClick="getBalances()">Get Balances</button> <br/><br/> <button type="button" onClick="oPmintToken()">Mint NFT</button> <br/> <button type="button" onClick="oPgetTokens()">Get NFTs</button> <br/> <button type="button" onClick="oPburnToken()">Burn NFT</button> <td valign="top" align="right"> <button type="button" onClick="getAccount('operational')">Get New Operational Account</button> <table> <tr valign="top"> <td align="right"> Operational Account </td> <td> <input type="text" id="operationalAccountField" size="40"></input> <br> </td> </tr> <tr> <td align="right"> Public Key </td> <td> <input type="text" id="operationalPubKeyField" size="40"></input> <br> </td> </tr> <tr> <td align="right"> Private Key </td> <td> <input type="text" id="operationalPrivKeyField" size="40"></input> <br> </td> </tr> <tr> <td align="right"> Seed </td> <td> <input type="text" id="operationalSeedField" size="40"></input> <br> </td> </tr> <tr> <td align="right"> XRP Balance </td> <td> <input type="text" id="operationalBalanceField" size="40"></input> <br> </td> </tr> <tr> <td align="right"> Amount </td> <td> <input type="text" id="operationalAmountField" size="40"></input> <br> </td> </tr> <tr> <td align="right"> Destination </td> <td> <input type="text" id="operationalDestinationField" size="40"></input> <br> </td> </tr> <tr> <td> </td> <td align="right"> <input type="checkbox" id="operationalDefault" checked="true"/> <label for="operationalDefault">Allow Rippling</label> <button type="button" onClick="configureAccount('operational',document.querySelector('#operationalDefault').checked)">Configure Account</button> </td> </tr> <tr> <td align="right"> Currency </td> <td> <input type="text" id="operationalCurrencyField" size="40" value="USD"></input> </td> </tr> <tr> <td align="right">NFT URL</td> <td><input type="text" id="operationalTokenUrlField" value = "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf4dfuylqabf3oclgtqy55fbzdi" size="80"/> </td> </tr> <tr> <td align="right">Flags</td> <td><input type="text" id="operationalFlagsField" value="1" size="10"/></td> </tr> <tr> <td align="right">NFT ID</td> <td><input type="text" id="operationalTokenIdField" value="" size="80"/></td> </tr> <tr> <td align="right">Transfer Fee</td> <td><input type="text" id="operationalTransferFeeField" value="" size="80"/></td> </tr> </table> <p align="right"> <textarea id="operationalResultField" cols="80" rows="20" ></textarea> </p> </td> </td> </tr> </td> </tr> </table> </td> </tr> </table> </td> </tr> </table> </form> </body> </html>