Mint and Burn NFTs Using Python
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 and run
lesson3-mint-token.py
. - Get test accounts.
- If you have existing Testnet account seeds:
- Paste the standby account seed in the Standby Seed field.
- Click Get Standby Account.
- Paste the operational account seed in the Operational Seed field.
- Click Get Operational Account.
- If you do not have existing Testnet accounts:
- Click Get New Standby Account.
- Click Get New Operational Account.
- Click Get Standby Account Info.
- Click Get Op Account Info.
- 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 can be transferred to another account. Otherwise, the NFT can only be transferred back to the issuing account. See NFToken Mint for information about all of the available flags for minting NFTs.
- Enter the NFT URI. This is a URI that points to the data or metadata associated with the NFT. 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.
- Optionally a Taxon value as an integer. If you choose not to use a taxon, enter 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.
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.
mod3.py
This module contains the new methods mint_token
, get_tokens
, and burn_token
.
Import dependencies and set global variable.
import xrpl from xrpl.clients import JsonRpcClient from xrpl.wallet import Wallet from xrpl.models.requests import AccountNFTs testnet_url = "https://s.altnet.rippletest.net:51234"
mintToken
Pass the arguments account seed, NFT URI, transaction flags, the transfer fee, and optional taxon.
def mint_token(seed, uri, flags, transfer_fee, taxon): """mint_token"""
Get the account wallet and a client instance.
minter_wallet=Wallet.from_seed(seed) client=JsonRpcClient(testnet_url)
Define the mint transaction. Note that the NFT URI must be converted to a hex string.
mint_tx=xrpl.models.transactions.NFTokenMint( account=minter_wallet.address, uri=xrpl.utils.str_to_hex(uri), flags=int(flags), transfer_fee=int(transfer_fee), nftoken_taxon=int(taxon) )
Submit the transaction and return results.
reply="" try: response=xrpl.transaction.submit_and_wait(mint_tx,client,minter_wallet) reply=response.result except xrpl.transaction.XRPLReliableSubmissionException as e: reply=f"Submit failed: {e}" return reply
getTokens
def get_tokens(account): """get_tokens"""
Instantiate a client.
client=JsonRpcClient(testnet_url)
Prepare the AccountNFTs
request.
acct_nfts=AccountNFTs( account=account )
Send the request and return the result.
response=client.request(acct_nfts) return response.result
burn_token
Pass the owner's seed value and the NFT ID.
def burn_token(seed, nftoken_id): """burn_token"""
Get the owner wallet and client instance.
owner_wallet=Wallet.from_seed(seed) client=JsonRpcClient(testnet_url)
Define the NFTokenBurn transaction.
burn_tx=xrpl.models.transactions.NFTokenBurn( account=owner_wallet.address, nftoken_id=nftoken_id )
Submit the transaction and return results.
reply="" try: response=xrpl.transaction.submit_and_wait(burn_tx,client,owner_wallet) reply=response.result except xrpl.transaction.XRPLReliableSubmissionException as e: reply=f"Submit failed: {e}" return reply
lesson3-mint-token.py
This module builds on lesson2-create-trustline-send-currency.py
. Changes are noted below.
import tkinter as tk import xrpl import json import tkinter as tk import xrpl import json from mod1 import get_account, get_account_info, send_xrp from mod2 import ( create_trust_line, send_currency, get_balance, configure_account, )
Import methods from mod3.py
.
from mod3 import ( mint_token, get_tokens, burn_token, ) ############################################# ## Handlers ################################# #############################################
Module 3 Handlers
def standby_mint_token(): results = mint_token( ent_standby_seed.get(), ent_standby_uri.get(), ent_standby_flags.get(), ent_standby_transfer_fee.get(), ent_standby_taxon.get() ) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", json.dumps(results, indent=4)) def standby_get_tokens(): results = get_tokens(ent_standby_account.get()) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", json.dumps(results, indent=4)) def standby_burn_token(): results = burn_token( ent_standby_seed.get(), ent_standby_nft_id.get() ) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", json.dumps(results, indent=4)) def operational_mint_token(): results = mint_token( ent_operational_seed.get(), ent_operational_uri.get(), ent_operational_flags.get(), ent_operational_transfer_fee.get(), ent_operational_taxon.get() ) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", json.dumps(results, indent=4)) def operational_get_tokens(): results = get_tokens(ent_operational_account.get()) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", json.dumps(results, indent=4)) def operational_burn_token(): results = burn_token( ent_operational_seed.get(), ent_operational_nft_id.get() ) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", json.dumps(results, indent=4)) # Module 2 Handlers def standby_create_trust_line(): results = create_trust_line(ent_standby_seed.get(), ent_standby_destination.get(), ent_standby_currency.get(), ent_standby_amount.get()) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", json.dumps(results, indent=4)) def standby_send_currency(): results = send_currency(ent_standby_seed.get(), ent_standby_destination.get(), ent_standby_currency.get(), ent_standby_amount.get()) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", json.dumps(results, indent=4)) def standby_configure_account(): results = configure_account( ent_standby_seed.get(), standbyRippling) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", json.dumps(results, indent=4)) def operational_create_trust_line(): results = create_trust_line(ent_operational_seed.get(), ent_operational_destination.get(), ent_operational_currency.get(), ent_operational_amount.get()) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", json.dumps(results, indent=4)) def operational_send_currency(): results = send_currency(ent_operational_seed.get(), ent_operational_destination.get(), ent_operational_currency.get(), ent_operational_amount.get()) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", json.dumps(results, indent=4)) def operational_configure_account(): results = configure_account( ent_operational_seed.get(), operationalRippling) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", json.dumps(results, indent=4)) def get_balances(): results = get_balance(ent_operational_account.get(), ent_standby_account.get()) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", json.dumps(results, indent=4)) results = get_balance(ent_standby_account.get(), ent_operational_account.get()) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", json.dumps(results, indent=4)) # Module 1 Handlers def get_standby_account(): new_wallet = get_account(ent_standby_seed.get()) ent_standby_account.delete(0, tk.END) ent_standby_seed.delete(0, tk.END) ent_standby_account.insert(0, new_wallet.classic_address) ent_standby_seed.insert(0, new_wallet.seed) def get_standby_account_info(): accountInfo = get_account_info(ent_standby_account.get()) ent_standby_balance.delete(0, tk.END) ent_standby_balance.insert(0,accountInfo['Balance']) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0",json.dumps(accountInfo, indent=4)) def standby_send_xrp(): response = send_xrp(ent_standby_seed.get(),ent_standby_amount.get(), ent_standby_destination.get()) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0",json.dumps(response.result, indent=4)) get_standby_account_info() get_operational_account_info() def get_operational_account(): new_wallet = get_account(ent_operational_seed.get()) ent_operational_account.delete(0, tk.END) ent_operational_account.insert(0, new_wallet.classic_address) ent_operational_seed.delete(0, tk.END) ent_operational_seed.insert(0, new_wallet.seed) def get_operational_account_info(): accountInfo = get_account_info(ent_operational_account.get()) ent_operational_balance.delete(0, tk.END) ent_operational_balance.insert(0,accountInfo['Balance']) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0",json.dumps(accountInfo, indent=4)) def operational_send_xrp(): response = send_xrp(ent_operational_seed.get(),ent_operational_amount.get(), ent_operational_destination.get()) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0",json.dumps(response.result,indent=4)) get_standby_account_info() get_operational_account_info()
Create a new window with the title "Quickstart Module 3."
window = tk.Tk() window.title("Quickstart Module 3") standbyRippling = tk.BooleanVar() operationalRippling = tk.BooleanVar() # Form frame frm_form = tk.Frame(relief=tk.SUNKEN, borderwidth=3) frm_form.pack() # Create the Label and Entry widgets for "Standby Account" lbl_operational_seed = tk.Label(master=frm_form, text="Operational Seed") ent_operational_seed = tk.Entry(master=frm_form, width=50) lbl_operational_account = tk.Label(master=frm_form, text="Operational Account") ent_operational_account = tk.Entry(master=frm_form, width=50) lbl_operational_amount = tk.Label(master=frm_form, text="Amount") ent_operational_amount = tk.Entry(master=frm_form, width=50) lbl_operational_destination = tk.Label(master=frm_form, text="Destination") ent_operational_destination = tk.Entry(master=frm_form, width=50) lbl_operational_balance = tk.Label(master=frm_form, text="XRP Balance") ent_operational_balance = tk.Entry(master=frm_form, width=50) lbl_operational_currency = tk.Label(master=frm_form, text="Currency") ent_operational_currency = tk.Entry(master=frm_form, width=50) cb_standby_allow_rippling = tk.Checkbutton(master=frm_form, text="Allow Rippling", variable=standbyRippling, onvalue=True, offvalue=False)
Add NFT URI, Flags, Transfer Fee, Taxon, and NFT ID fields.
lbl_standby_uri = tk.Label(master=frm_form, text="NFT URI") ent_standby_uri = tk.Entry(master=frm_form, width=50) lbl_standby_flags = tk.Label(master=frm_form, text="Flags") ent_standby_flags = tk.Entry(master=frm_form, width=50) lbl_standby_transfer_fee = tk.Label(master=frm_form, text="Transfer Fee") ent_standby_transfer_fee = tk.Entry(master=frm_form, width="50") lbl_standby_taxon = tk.Label(master=frm_form, text="Taxon") ent_standby_taxon = tk.Entry(master=frm_form, width="50") lbl_standby_nft_id = tk.Label(master=frm_form, text="NFT ID") ent_standby_nft_id = tk.Entry(master=frm_form, width="50") lbl_standby_results = tk.Label(master=frm_form,text='Results') text_standby_results = tk.Text(master=frm_form, height = 20, width = 65) # Place field in a grid. lbl_standy_seed.grid(row=0, column=0, sticky="w") ent_standby_seed.grid(row=0, column=1) lbl_standby_account.grid(row=2, column=0, sticky="e") ent_standby_account.grid(row=2, column=1) lbl_standy_amount.grid(row=3, column=0, sticky="e") ent_standby_amount.grid(row=3, column=1) lbl_standby_destination.grid(row=4, column=0, sticky="e") ent_standby_destination.grid(row=4, column=1) lbl_standby_balance.grid(row=5, column=0, sticky="e") ent_standby_balance.grid(row=5, column=1) lbl_standby_currency.grid(row=6, column=0, sticky="e") ent_standby_currency.grid(row=6, column=1) cb_standby_allow_rippling.grid(row=7,column=1, sticky="w")
Place new UI elements in the grid.
lbl_standby_uri.grid(row=8, column=0, sticky="e") ent_standby_uri.grid(row=8, column=1, sticky="w") lbl_standby_flags.grid(row=9, column=0, sticky="e") ent_standby_flags.grid(row=9, column=1, sticky="w") lbl_standby_transfer_fee.grid(row=10, column=0, sticky="e") ent_standby_transfer_fee.grid(row=10, column=1, sticky="w") lbl_standby_taxon.grid(row=11, column=0, sticky="e") ent_standby_taxon.grid(row=11, column=1, sticky="w") lbl_standby_nft_id.grid(row=12, column=0, sticky="e") ent_standby_nft_id.grid(row=12, column=1, sticky="w") lbl_standby_results.grid(row=13, column=0, sticky="ne") text_standby_results.grid(row=13, column=1, sticky="nw") cb_standby_allow_rippling.select() ############################################### ## Operational Account ######################## ############################################### # Create the Label and Entry widgets for "Operational Account" lbl_operational_seed = tk.Label(master=frm_form, text="Operational Seed") ent_operational_seed = tk.Entry(master=frm_form, width=50) lbl_operational_account = tk.Label(master=frm_form, text="Operational Account") ent_operational_account = tk.Entry(master=frm_form, width=50) lbl_operational_amount = tk.Label(master=frm_form, text="Amount") ent_operational_amount = tk.Entry(master=frm_form, width=50) lbl_operational_destination = tk.Label(master=frm_form, text="Destination") ent_operational_destination = tk.Entry(master=frm_form, width=50) lbl_operational_balance = tk.Label(master=frm_form, text="XRP Balance") ent_operational_balance = tk.Entry(master=frm_form, width=50) lbl_operational_currency = tk.Label(master=frm_form, text="Currency") ent_operational_currency = tk.Entry(master=frm_form, width=50) cb_operational_allow_rippling = tk.Checkbutton(master=frm_form, text="Allow Rippling", variable=operationalRippling, onvalue=True, offvalue=False)
Add fields for NFT URI, Flags, Transfer Fee, Taxon, and NFT ID.
lbl_operational_uri = tk.Label(master=frm_form, text="NFT URI") ent_operational_uri = tk.Entry(master=frm_form, width=50) lbl_operational_flags = tk.Label(master=frm_form, text="Flags") ent_operational_flags = tk.Entry(master=frm_form, width=50) lbl_operational_transfer_fee = tk.Label(master=frm_form, text="Transfer Fee") ent_operational_transfer_fee = tk.Entry(master=frm_form, width="50") lbl_operational_taxon = tk.Label(master=frm_form, text="Taxon") ent_operational_taxon = tk.Entry(master=frm_form, width="50") lbl_operational_nft_id = tk.Label(master=frm_form, text="NFT ID") ent_operational_nft_id = tk.Entry(master=frm_form, width="50") lbl_operational_results = tk.Label(master=frm_form,text='Results') text_operational_results = tk.Text(master=frm_form, height = 20, width = 65) #Place the widgets in a grid lbl_operational_seed.grid(row=0, column=4, sticky="e") ent_operational_seed.grid(row=0, column=5, sticky="w") lbl_operational_account.grid(row=2,column=4, sticky="e") ent_operational_account.grid(row=2,column=5, sticky="w") lbl_operational_amount.grid(row=3, column=4, sticky="e") ent_operational_amount.grid(row=3, column=5, sticky="w") lbl_operational_destination.grid(row=4, column=4, sticky="e") ent_operational_destination.grid(row=4, column=5, sticky="w") lbl_operational_balance.grid(row=5, column=4, sticky="e") ent_operational_balance.grid(row=5, column=5, sticky="w") lbl_operational_currency.grid(row=6, column=4, sticky="e") ent_operational_currency.grid(row=6, column=5) cb_operational_allow_rippling.grid(row=7,column=5, sticky="w")
Place new UI elements in the grid.
lbl_operational_uri.grid(row=8, column=4, sticky="e") ent_operational_uri.grid(row=8, column=5, sticky="w") lbl_operational_flags.grid(row=9, column=4, sticky="e") ent_operational_flags.grid(row=9, column=5, sticky="w") lbl_operational_transfer_fee.grid(row=10, column=4, sticky="e") ent_operational_transfer_fee.grid(row=10, column=5, sticky="w") lbl_operational_taxon.grid(row=11, column=4, sticky="e") ent_operational_taxon.grid(row=11, column=5, sticky="w") lbl_operational_nft_id.grid(row=12, column=4, sticky="e") ent_operational_nft_id.grid(row=12, column=5, sticky="w") lbl_operational_results.grid(row=13, column=4, sticky="ne") text_operational_results.grid(row=13, column=5, sticky="nw") cb_operational_allow_rippling.select() ############################################# ## Buttons ################################## ############################################# # Create the Standby Account Buttons btn_get_standby_account = tk.Button(master=frm_form, text="Get Standby Account", command = get_standby_account) btn_get_standby_account.grid(row=0, column=2, sticky = "nsew") btn_get_standby_account_info = tk.Button(master=frm_form, text="Get Standby Account Info", command = get_standby_account_info) btn_get_standby_account_info.grid(row=1, column=2, sticky = "nsew") btn_standby_send_xrp = tk.Button(master=frm_form, text="Send XRP >", command = standby_send_xrp) btn_standby_send_xrp.grid(row=2, column = 2, sticky = "nsew") btn_standby_create_trust_line = tk.Button(master=frm_form, text="Create Trust Line", command = standby_create_trust_line) btn_standby_create_trust_line.grid(row=3, column=2, sticky = "nsew") btn_standby_send_currency = tk.Button(master=frm_form, text="Send Currency >", command = standby_send_currency) btn_standby_send_currency.grid(row=4, column=2, sticky = "nsew") btn_standby_send_currency = tk.Button(master=frm_form, text="Get Balances", command = get_balances) btn_standby_send_currency.grid(row=5, column=2, sticky = "nsew") btn_standby_configure_account = tk.Button(master=frm_form, text="Configure Account", command = standby_configure_account)
Add buttons for Mint NFT, Get NFTs, and Burn NFT.
btn_standby_mint_token = tk.Button(master=frm_form, text="Mint NFT", command = standby_mint_token) btn_standby_mint_token.grid(row=8, column=2, sticky="nsew") btn_standby_get_tokens = tk.Button(master=frm_form, text="Get NFTs", command = standby_get_tokens) btn_standby_get_tokens.grid(row=9, column=2, sticky="nsew") btn_standby_burn_token = tk.Button(master=frm_form, text="Burn NFT", command = standby_burn_token) btn_standby_burn_token.grid(row=10, column=2, sticky="nsew") # Create the Operational Account Buttons btn_get_operational_account = tk.Button(master=frm_form, text="Get Operational Account", command = get_operational_account) btn_get_operational_account.grid(row=0, column=3, sticky = "nsew") btn_get_op_account_info = tk.Button(master=frm_form, text="Get Op Account Info", command = get_operational_account_info) btn_get_op_account_info.grid(row=1, column=3, sticky = "nsew") btn_op_send_xrp = tk.Button(master=frm_form, text="< Send XRP", command = operational_send_xrp) btn_op_send_xrp.grid(row=2, column = 3, sticky = "nsew") btn_op_create_trust_line = tk.Button(master=frm_form, text="Create Trust Line", command = operational_create_trust_line) btn_op_create_trust_line.grid(row=3, column=3, sticky = "nsew") btn_op_send_currency = tk.Button(master=frm_form, text="< Send Currency", command = operational_send_currency) btn_op_send_currency.grid(row=4, column=3, sticky = "nsew") btn_op_get_balances = tk.Button(master=frm_form, text="Get Balances", command = get_balances) btn_op_get_balances.grid(row=5, column=3, sticky = "nsew") btn_op_configure_account = tk.Button(master=frm_form, text="Configure Account", command = operational_configure_account) btn_op_configure_account.grid(row=7,column=4, sticky = "nsew")
Add buttons for Mint NFT, Get NFTs, and Burn NFT.
btn_op_mint_token = tk.Button(master=frm_form, text="Mint NFT", command = operational_mint_token) btn_op_mint_token.grid(row=8, column=3, sticky="nsew") btn_op_get_tokens = tk.Button(master=frm_form, text="Get NFTs", command = operational_get_tokens) btn_op_get_tokens.grid(row=9, column=3, sticky="nsew") btn_op_burn_token = tk.Button(master=frm_form, text="Burn NFT", command = operational_burn_token) btn_op_burn_token.grid(row=10, column=3, sticky="nsew") # Start the application window.mainloop()