# Assign an Authorized Minter Using Python You can assign another account permission to mint NFTs for you. This example shows how to: 1. Authorize an account to create NFTs for your account. 2. Mint an NFT for another account, when authorized. [![Token Test Harness](/assets/quickstart-py30.bfc402acbedf9fa9e0bda6d3b06177e6c2a87e54f696c0fa32cd24b9e691fef7.ac57e6ef.png)](/assets/quickstart-py30.bfc402acbedf9fa9e0bda6d3b06177e6c2a87e54f696c0fa32cd24b9e691fef7.ac57e6ef.png) # Usage You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/_code-samples/quickstart/py/) archive to try the sample in your own browser. ## Get Accounts 1. Open and run `py-authorize-minter.md`. 2. Get accounts. 1. If you have existing test account seeds: 1. Paste a seed in the **Standby Seed** field. 2. Click **Get Standby Account**. 3. Click **Get Standby Account Info**. 4. Paste a seed in the **Operational Seed** field. 5. Click **Get Operational Account**. 6. Click **Get Operational Account** info. 2. If you do not have existing test accounts: 1. Click **Get Standby Account**. 2. Click **Get Standby Account Info**. 3. Click **Get Operational Account**. 4. Click **Get Operational Account Info**. ## Authorize an Account to Create NFTs div iframe To authorize another account to create NFTs for your account (for example, allow the operational account to mint NFTs for the standby account): 1. Copy the **Operational Account** value. 2. Paste the **Operational Account** value in the standby **Authorized Minter** field. 3. Click **Set Minter**. [![Authorized Minter](/assets/quickstart-py31.be5f4f9b81d69eb2086c1ec98d19248ff9373b1559b93eb30fb1b11e8ab9ce64.ac57e6ef.png)](/assets/quickstart-py31.be5f4f9b81d69eb2086c1ec98d19248ff9373b1559b93eb30fb1b11e8ab9ce64.ac57e6ef.png) ## Mint an NFT for Another Account This example uses the Operational account, which was authorized in the previous step, to mint a token on behalf of the Standby account. To mint a non-fungible token for another account: 1. Set the **Flags** field. For testing purposes, we recommend setting the value to *8*. 2. 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. 3. Enter the **Transfer Fee**, a percentage of the proceeds that the original creator receives from future sales of the NFT. 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. 4. Enter a **Taxon** for the NFT. If you don't have a use for the field, set it to *0*. 5. Copy the **Standby Account** value. 6. Paste the **Standby Account** value in the Operational account **Issuer** field. 7. Click the Operational account **Mint Other** button. [![Minted NFT for Another Account](/assets/quickstart-py32.fade12610768c0f88c21bde92247f02c39253f2b16b7126c7fde06f0c522375d.ac57e6ef.png)](/assets/quickstart-py32.fade12610768c0f88c21bde92247f02c39253f2b16b7126c7fde06f0c522375d.ac57e6ef.png) Once the item is minted, the authorized minter can sell the NFT normally. The proceeds go to the authorized minter, less the transfer fee. The minter and the issuer can settle up on a division of the price separately. ## Create a Sell Offer To create a NFT sell offer: 1. On the Operational account side, enter the **Amount** of the sell offer in drops (millionths of an XRP), for example 100000000 (100 XRP). 2. Set the **Flags** field to *1*. 3. Enter the **NFT ID** of the minted NFT you want to sell. 4. Optionally, enter a number of seconds until **Expiration**. 5. Click **Create Sell Offer**. The important piece of information in the response is the NFT Offer Index, labeled as `nft_offer_index`, which is used to accept the sell offer. [![NFT Sell Offer](/assets/quickstart-py33.4326a370b93d9584113187589b750504300926171814a4158a0ed42a7765c7a2.ac57e6ef.png)](/assets/quickstart-py33.4326a370b93d9584113187589b750504300926171814a4158a0ed42a7765c7a2.ac57e6ef.png) ## Accept Sell Offer Once a sell offer is available, you can create a new account to accept the offer and buy the NFT. To accept an available sell offer: 1. Clear the **Standby Seed** field. 2. Click **Get Standby Account**. 3. Click **Get Standby Account Info**. 4. Enter the **NFT Offer Index** (labeled as `nft_offer_index` in the NFT offer results. This is different from the `nft_id`). 5. Click **Accept Sell Offer**. [![Transaction Results](/assets/quickstart-py34.f4cfe7d14698d7ac5a961eb0164479af37185c716a61ee929c643b31cc9f7866.ac57e6ef.png)](/assets/quickstart-py34.f4cfe7d14698d7ac5a961eb0164479af37185c716a61ee929c643b31cc9f7866.ac57e6ef.png) The Buyer account was debited the 100 XRP price plus 10 drops as the transaction cost. The Seller (Authorized Minter) account is credited 90 XRP. the Issuer and the Seller can divide the proceeds per their agreement in a separate transaction. The original Standby account receives a transfer fee of 10 XRP. [![Transaction Results](/assets/quickstart-py35.2ce2ba0ec6c62293f6451ad88ffa1f17ca485d6339165fe5269f95e2d43f173f.ac57e6ef.png)](/assets/quickstart-py35.2ce2ba0ec6c62293f6451ad88ffa1f17ca485d6339165fe5269f95e2d43f173f.ac57e6ef.png) # Code Walkthrough You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/_code-samples/quickstart/py/) archive to try each of the samples. ## mod6.py `mod6.py` contains the new business logic for this example, the `set_minter` and `mint_other` methods. Import dependencies and define the `testnet_url` global variable. ```python import xrpl from xrpl.clients import JsonRpcClient from xrpl.wallet import Wallet testnet_url="https://s.altnet.rippletest.net:51234" ``` ### Set Minter This function sets the authorized minter for an account. Each account can have 0 or 1 authorized minter that can mint NFTs in its stead. Get the wallet of the account granting permission and instantiate a client. ```python def set_minter(seed, minter): """set_minter""" granter_wallet=Wallet.from_seed(seed) client=JsonRpcClient(testnet_url) ``` Define the AccountSet transaction that grants permission to another account to mint tokens on behalf of the granter account. ```python set_minter_tx=xrpl.models.transactions.AccountSet( account=granter_wallet.address, nftoken_minter=minter, set_flag=xrpl.models.transactions.AccountSetAsfFlag.ASF_AUTHORIZED_NFTOKEN_MINTER ) ``` Submit the transaction and return the results. ```python reply="" try: response=xrpl.transaction.submit_and_wait(set_minter_tx,client, granter_wallet) reply=response.result except xrpl.transaction.XRPLReliableSubmissionException as e: reply=f"Submit failed: {e}" return reply ``` ### mint_other Get the minter wallet and instantiate a client connection to the XRP ledger. ``` def mint_other(seed, uri, flags, transfer_fee, taxon, issuer): """mint_other""" minter_wallet=Wallet.from_seed(seed) client=JsonRpcClient(testnet_url) ``` Define the `NFTokenMint` transaction. The new parameter in this method is the *issuer* field, identifying the account on whose behalf the token is being minted. ```python mint_other_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), issuer=issuer ) ``` Submit the transaction and report the results. ```python reply="" try: response=xrpl.transaction.submit_and_wait(mint_other_tx,client, minter_wallet) reply=response.result except xrpl.transaction.XRPLReliableSubmissionException as e: reply=f"Submit failed: {e}" return reply ``` ## lesson6-auth-minter.py This form is based on lesson4-transfer-tokens.py. Changes are highlighted below. ```python 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, ) from mod3 import ( mint_token, get_tokens, burn_token, ) from mod4 import ( create_sell_offer, create_buy_offer, get_offers, cancel_offer, accept_sell_offer, accept_buy_offer, ) ``` Import dependencies from `mod6.py`. ```python from mod6 import set_minter, mint_other ``` Add handlers for new Module 6 methods. ```python ############################################# ## Handlers ################################# ############################################# # Module 6 Handlers def standby_set_minter(): results = set_minter(ent_standby_seed.get(),ent_standby_auth_minter.get()) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", json.dumps(results, indent=4)) def standby_mint_other(): results = mint_other( ent_standby_seed.get(), ent_standby_uri.get(), ent_standby_flags.get(), ent_standby_transfer_fee.get(), ent_standby_taxon.get(), ent_standby_issuer.get() ) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", json.dumps(results, indent=4)) def operational_set_minter(): results = set_minter(ent_operational_seed.get(),ent_operational_auth_minter.get()) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", json.dumps(results, indent=4)) def operational_mint_other(): results = mint_other( ent_operational_seed.get(), ent_operational_uri.get(), ent_operational_flags.get(), ent_operational_transfer_fee.get(), ent_operational_taxon.get(), ent_operational_issuer.get() ) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", json.dumps(results, indent=4)) # Module 4 Handlers def standby_create_sell_offer(): results = create_sell_offer( ent_standby_seed.get(), ent_standby_amount.get(), ent_standby_nft_id.get(), ent_standby_expiration.get(), ent_standby_destination.get() ) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", json.dumps(results, indent=4)) def standby_accept_sell_offer(): results = accept_sell_offer ( ent_standby_seed.get(), ent_standby_nft_offer_index.get() ) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", json.dumps(results, indent=4)) def standby_create_buy_offer(): results = create_buy_offer( ent_standby_seed.get(), ent_standby_amount.get(), ent_standby_nft_id.get(), ent_standby_owner.get(), ent_standby_expiration.get(), ent_standby_destination.get() ) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", json.dumps(results, indent=4)) def standby_accept_buy_offer(): results = accept_buy_offer ( ent_standby_seed.get(), ent_standby_nft_offer_index.get() ) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", json.dumps(results, indent=4)) def standby_get_offers(): results = get_offers(ent_standby_nft_id.get()) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", results) def standby_cancel_offer(): results = cancel_offer( ent_standby_seed.get(), ent_standby_nft_offer_index.get() ) text_standby_results.delete("1.0", tk.END) text_standby_results.insert("1.0", json.dumps(results, indent=4)) def op_create_sell_offer(): results = create_sell_offer( ent_operational_seed.get(), ent_operational_amount.get(), ent_operational_nft_id.get(), ent_operational_expiration.get(), ent_operational_destination.get() ) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", json.dumps(results, indent=4)) def op_accept_sell_offer(): results = accept_sell_offer ( ent_operational_seed.get(), ent_operational_nft_offer_index.get() ) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", json.dumps(results, indent=4)) def op_create_buy_offer(): results = create_buy_offer( ent_operational_seed.get(), ent_operational_amount.get(), ent_operational_nft_id.get(), ent_operational_owner.get(), ent_operational_expiration.get(), ent_operational_destination.get() ) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", json.dumps(results, indent=4)) def op_accept_buy_offer(): results = accept_buy_offer ( ent_operational_seed.get(), ent_operational_nft_offer_index.get() ) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", json.dumps(results, indent=4)) def op_get_offers(): results = get_offers(ent_operational_nft_id.get()) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", results) def op_cancel_offer(): results = cancel_offer( ent_operational_seed.get(), ent_operational_nft_offer_index.get() ) text_operational_results.delete("1.0", tk.END) text_operational_results.insert("1.0", json.dumps(results, indent=4)) # 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() ``` Rename the window for the Authorized Minter examples. ```python # Create a new window with the title "Quickstart - Authorized Minter" window = tk.Tk() window.title("Quickstart - Authorized Minter") myscrollbar=tk.Scrollbar(window,orient="vertical") myscrollbar.pack(side="right",fill="y") 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_standy_seed = tk.Label(master=frm_form, text="Standby Seed") ent_standby_seed = tk.Entry(master=frm_form, width=50) lbl_standby_account = tk.Label(master=frm_form, text="Standby Account") ent_standby_account = tk.Entry(master=frm_form, width=50) lbl_standy_amount = tk.Label(master=frm_form, text="Amount") ent_standby_amount = tk.Entry(master=frm_form, width=50) lbl_standby_destination = tk.Label(master=frm_form, text="Destination") ent_standby_destination = tk.Entry(master=frm_form, width=50) lbl_standby_balance = tk.Label(master=frm_form, text="XRP Balance") ent_standby_balance = tk.Entry(master=frm_form, width=50) lbl_standby_currency = tk.Label(master=frm_form, text="Currency") ent_standby_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) 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_nft_offer_index = tk.Label(master=frm_form, text="NFT Offer Index") ent_standby_nft_offer_index = tk.Entry(master=frm_form, width="50") lbl_standby_owner = tk.Label(master=frm_form, text="Owner") ent_standby_owner = tk.Entry(master=frm_form, width="50") lbl_standby_expiration = tk.Label(master=frm_form, text="Expiration") ent_standby_expiration = tk.Entry(master=frm_form, width="50") ``` Add fields for the **Authorized Minter** and **Issuer**. ```python lbl_standby_auth_minter = tk.Label(master=frm_form, text="Authorized Minter") ent_standby_auth_minter = tk.Entry(master=frm_form, width="50") lbl_standby_issuer = tk.Label(master=frm_form, text="Issuer") ent_standby_issuer = 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 = 50, 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") 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_nft_offer_index.grid(row=13, column=0, sticky="ne") ent_standby_nft_offer_index.grid(row=13, column=1, sticky="w") lbl_standby_owner.grid(row=14, column=0, sticky="ne") ent_standby_owner.grid(row=14, column=1, sticky="w") lbl_standby_expiration.grid(row=15, column=0, sticky="ne") ent_standby_expiration.grid(row=15, column=1, sticky="w") ``` Add the new fields to the form grid. ```python lbl_standby_auth_minter.grid(row=16,column=0, sticky="ne") ent_standby_auth_minter.grid(row=16,column=1, sticky="w") lbl_standby_issuer.grid(row=17,column=0, sticky="ne") ent_standby_issuer.grid(row=17,column=1, sticky="w") lbl_standby_results.grid(row=18, column=0, sticky="ne") text_standby_results.grid(row=18, 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) 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_nft_offer_index = tk.Label(master=frm_form, text="NFT Offer Index") ent_operational_nft_offer_index = tk.Entry(master=frm_form, width="50") lbl_operational_owner = tk.Label(master=frm_form, text="Owner") ent_operational_owner = tk.Entry(master=frm_form, width="50") lbl_operational_expiration = tk.Label(master=frm_form, text="Expiration") ent_operational_expiration = tk.Entry(master=frm_form, width="50") ``` Add *Authorized Minter* and *Issuer* fields to the Operational side of the form. ```python lbl_operational_auth_minter = tk.Label(master=frm_form, text="Authorized Minter") ent_operational_auth_minter = tk.Entry(master=frm_form, width="50") lbl_operational_issuer = tk.Label(master=frm_form, text="Issuer") ent_operational_issuer = 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 = 50, 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") 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_nft_offer_index.grid(row=13, column=4, sticky="ne") ent_operational_nft_offer_index.grid(row=13, column=5, sticky="w") lbl_operational_owner.grid(row=14, column=4, sticky="ne") ent_operational_owner.grid(row=14, column=5, sticky="w") lbl_operational_expiration.grid(row=15, column=4, sticky="ne") ent_operational_expiration.grid(row=15, column=5, sticky="w") ``` Add *Authorized Minter* and *Issuer* fields to the Operational grid. ```python lbl_operational_auth_minter.grid(row=16, column=4, sticky="ne") ent_operational_auth_minter.grid(row=16, column=5, sticky="w") lbl_operational_issuer.grid(row=17, column=4, sticky="ne") ent_operational_issuer.grid(row=17, column=5, sticky="w") lbl_operational_results.grid(row=18, column=4, sticky="ne") text_operational_results.grid(row=18, 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=4, 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=5, 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=6, column=2, sticky = "nsew") btn_standby_configure_account = tk.Button(master=frm_form, text="Configure Account", command = standby_configure_account) btn_standby_configure_account.grid(row=7,column=0, sticky = "nsew") 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") btn_standby_create_sell_offer = tk.Button(master=frm_form, text="Create Sell Offer", command = standby_create_sell_offer) btn_standby_create_sell_offer.grid(row=11, column=2, sticky="nsew") btn_standby_accept_sell_offer = tk.Button(master=frm_form, text="Accept Sell Offer", command = standby_accept_sell_offer) btn_standby_accept_sell_offer.grid(row=12, column=2, sticky="nsew") btn_standby_create_buy_offer = tk.Button(master=frm_form, text="Create Buy Offer", command = standby_create_buy_offer) btn_standby_create_buy_offer.grid(row=13, column=2, sticky="nsew") btn_standby_accept_buy_offer = tk.Button(master=frm_form, text="Accept Buy Offer", command = standby_accept_buy_offer) btn_standby_accept_buy_offer.grid(row=14, column=2, sticky="nsew") btn_standby_get_offers = tk.Button(master=frm_form, text="Get Offers", command = standby_get_offers) btn_standby_get_offers.grid(row=15, column=2, sticky="nsew") btn_standby_cancel_offer = tk.Button(master=frm_form, text="Cancel Offer", command = standby_cancel_offer) btn_standby_cancel_offer.grid(row=16, column=2, sticky="nsew") ``` Add buttons for *Set Minter* and *Mint Other* to the Standby side of the form. ```python btn_standby_set_minter = tk.Button(master=frm_form, text="Set Minter", command = standby_set_minter) btn_standby_set_minter.grid(row=17, column=2, sticky="nsew") btn_standby_mint_other = tk.Button(master=frm_form, text="Mint Other", command = standby_mint_other) btn_standby_mint_other.grid(row=18, column=2, sticky="new") # 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=4, 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=5, 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=6, 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") 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") btn_op_create_sell_offer = tk.Button(master=frm_form, text="Create Sell Offer", command = op_create_sell_offer) btn_op_create_sell_offer.grid(row=11, column=3, sticky="nsew") btn_op_accept_sell_offer = tk.Button(master=frm_form, text="Accept Sell Offer", command = op_accept_sell_offer) btn_op_accept_sell_offer.grid(row=12, column=3, sticky="nsew") btn_op_create_buy_offer = tk.Button(master=frm_form, text="Create Buy Offer", command = op_create_buy_offer) btn_op_create_buy_offer.grid(row=13, column=3, sticky="nsew") btn_op_accept_buy_offer = tk.Button(master=frm_form, text="Accept Buy Offer", command = op_accept_buy_offer) btn_op_accept_buy_offer.grid(row=14, column=3, sticky="nsew") btn_op_get_offers = tk.Button(master=frm_form, text="Get Offers", command = op_get_offers) btn_op_get_offers.grid(row=15, column=3, sticky="nsew") btn_op_cancel_offer = tk.Button(master=frm_form, text="Cancel Offer", command = op_cancel_offer) btn_op_cancel_offer.grid(row=16, column=3, sticky="nsew") ``` Add *Set Minter* and *Mint Other* buttons to the Operational side of the form. ```python btn_op_set_minter = tk.Button(master=frm_form, text="Set Minter", command = operational_set_minter) btn_op_set_minter.grid(row=17, column=3, sticky="nsew") btn_op_mint_other = tk.Button(master=frm_form, text="Mint Other", command = operational_mint_other) btn_op_mint_other.grid(row=18, column=3, sticky="new") # Start the application window.mainloop() ```