diff --git a/content/tutorials/quickstart/mint-and-burn-nftokens.md b/content/tutorials/quickstart/mint-and-burn-nftokens.md index 30a0737cdd..698c671072 100644 --- a/content/tutorials/quickstart/mint-and-burn-nftokens.md +++ b/content/tutorials/quickstart/mint-and-burn-nftokens.md @@ -5,7 +5,8 @@ blurb: Quickstart step 3, mint and burn NFTokens. labels: - Quickstart - Tokens - - Non-fungible tokens, NFTs + - Non-fungible tokens + - NFTs --- # 3. Mint and Burn NFTokens @@ -34,20 +35,12 @@ You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-port 1. Open `3.mint-nfts.html` in a browser. 2. Get test accounts. - 1. If you have existing NFT-Devnet account seeds - 1. Paste account seeds in the **Seeds** field. + 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 NFT-Devnet account seeds: - 1. Visit the [XRP Testnet Faucet](https://xrpl.org/xrp-testnet-faucet.html) page. - 2. Click **Generate NFT-Devnet credentials**. - 3. Copy the account **Secret**. - 4. Paste the secret in a persistent location, such as a notepad, and press return. - 5. Click **Generate NFT-Devnet credentials** to create a second account. - 6. Copy the account **Secret**. - 7. Paste the secret in the persistent location. - 8. Copy both secrets, separated by a return. - 9. Paste them in the **Account** **Seeds** field. - 10. 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**. @@ -63,7 +56,8 @@ 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. Click **Mint Token**. +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 1. +4. Click **Mint Token**. @@ -112,7 +106,7 @@ You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-port // ******************************************************* // ********************** Mint Token ********************* // ******************************************************* - async function mintToken() { +async function mintToken() { ``` @@ -122,15 +116,15 @@ 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 operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - const client = new xrpl.Client(net) - await client.connect() - results += '\nConnected. Minting NFToken.' - document.getElementById('standbyResultField').value = results + 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 + ``` @@ -140,9 +134,9 @@ Define the transaction. ``` - const transactionBlob = { - TransactionType: "NFTokenMint", - Account: standby_wallet.classicAddress, + const transactionBlob = { + "TransactionType": "NFTokenMint", + "Account": standby_wallet.classicAddress, ``` @@ -150,17 +144,28 @@ Note that the URI field expects a hexadecimal value rather than the literal URI ``` - URI: xrpl.convertStringToHex(standbyTokenUrlField.value), - Flags: parseInt(standbyFlagsField.value), + "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_. ``` - TokenTaxon: 0 //Required, but if you have no use for it, set to zero. - } + "NFTokenTaxon": 0 //Required, but if you have no use for it, set to zero. + } ``` @@ -170,7 +175,7 @@ Send the transaction and wait for the response. ``` - const tx = await client.submitAndWait(transactionBlob, { wallet: standby_wallet} ) + const tx = await client.submitAndWait(transactionBlob, { wallet: standby_wallet} ) ``` @@ -178,10 +183,10 @@ Request a list of NFTs owned by the account. ``` - const nfts = await client.request({ - method: "account_nfts", - account: standby_wallet.classicAddress - }) + const nfts = await client.request({ + method: "account_nfts", + account: standby_wallet.classicAddress + }) ``` @@ -191,11 +196,11 @@ 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 + 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 ``` @@ -203,10 +208,8 @@ Disconnect from the ledger. ``` - - - client.disconnect() - } //End of mintToken() + client.disconnect() +} //End of mintToken() ``` @@ -219,7 +222,7 @@ Disconnect from the ledger. // ******************* Get Tokens ************************ // ******************************************************* - async function getTokens() { +async function getTokens() { ``` @@ -227,14 +230,14 @@ 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 ' + getNet() + '...' - document.getElementById('standbyResultField').value = results - await client.connect() - results += '\nConnected. Getting NFTokens...' - document.getElementById('standbyResultField').value = results + 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 ``` @@ -242,10 +245,10 @@ Request a list of NFTs owned by the account. ``` - const nfts = await client.request({ - method: "account_nfts", - account: standby_wallet.classicAddress - }) + const nfts = await client.request({ + method: "account_nfts", + account: standby_wallet.classicAddress + }) ``` @@ -253,8 +256,8 @@ Report the results. ``` - results += '\nNFTs:\n ' + JSON.stringify(nfts,null,2) - document.getElementById('standbyResultField').value = results + results += '\nNFTs:\n ' + JSON.stringify(nfts,null,2) + document.getElementById('standbyResultField').value = results ``` @@ -262,8 +265,8 @@ Disconnect from the ledger. ``` - client.disconnect() - } //End of getTokens() + client.disconnect() +} //End of getTokens() ``` @@ -282,16 +285,15 @@ Connect to the ledger and get the account wallets. ``` - async function burnToken() { - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) - let net = getNet() - const client = new xrpl.Client(net) - results = 'Connecting to ' + getNet() + '...' - document.getElementById('standbyResultField').value = results - await client.connect() - results += '\nConnected. Burning NFToken...' - document.getElementById('standbyResultField').value = results + 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 ``` @@ -299,11 +301,11 @@ Define the transaction. ``` - const transactionBlob = { - "TransactionType": "NFTokenBurn", - "Account": standby_wallet.classicAddress, - "TokenID": standbyTokenIdField.value - } + const transactionBlob = { + "TransactionType": "NFTokenBurn", + "Account": standby_wallet.classicAddress, + "TokenID": standbyTokenIdField.value + } ``` @@ -311,7 +313,7 @@ Submit the transaction and wait for the results. ``` - const tx = await client.submitAndWait(transactionBlob,{wallet: standby_wallet}) + const tx = await client.submitAndWait(transactionBlob,{wallet: standby_wallet}) ``` @@ -319,10 +321,10 @@ Request a list of NFTokens owned by the client. ``` - const nfts = await client.request({ - method: "account_nfts", - account: standby_wallet.classicAddress - }) + const nfts = await client.request({ + method: "account_nfts", + account: standby_wallet.classicAddress + }) ``` @@ -330,17 +332,17 @@ 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() + 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() ``` @@ -352,57 +354,50 @@ Report the results. // ******************************************************* // ************** 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 - async function oPmintToken() { - results = 'Connecting to ' + getNet() + '....' - document.getElementById('operationalResultField').value = results - let net = getNet() - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - 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), - TokenTaxon: 0 //Required, but if you have no use for it, set to zero. - } - - - // ------------------- Submit transaction and wait for results - 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 - - + client.disconnect() +} //End of oPmintToken + // ******************************************************* // ************** Operational Get Tokens ***************** // ******************************************************* - - + async function oPgetTokens() { const operational_wallet = xrpl.Wallet.fromSeed(operationalSeedField.value) let net = getNet() @@ -420,54 +415,47 @@ Report the results. document.getElementById('operationalResultField').value = results client.disconnect() } //End of oPgetTokens - - + // ******************************************************* // ************* Operational Burn Token ****************** // ******************************************************* - - - async function oPburnToken() { - const standby_wallet = xrpl.Wallet.fromSeed(standbySeedField.value) - 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, - "TokenID": 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)) - results += '\nNFTs: \n' + JSON.stringify(nfts,null,2) - document.getElementById('operationalResultField').value = results - client.disconnect() - } - // End of oPburnToken() - - - - + +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() ``` @@ -481,7 +469,7 @@ Bold text in the following indicates changes to the form that support the new fu
@@ -719,11 +719,19 @@ Bold text in the following indicates changes to the form that support the new fu
+