mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2025-11-21 12:15:50 +00:00
* Update look up escrows to remove redundant info about lookups via sender/destination. Modify cancel expired escrow for brevity. * Cancel escrow: fix notes * Add draft of updated cancel-escrow.js. * Update intro to escrows. * Add Escrow Tutorial * Minor corrections * Fix headings, add HTML * Update escrow docs This commit re-createsf205a92db2with some adjustments: - Omit the accidentally-created dir full of junk - Fix some typos and one mistake in the Escrow limitations section - Add a table to the EscrowCreate ref to clarify valid combos of fields. * Concept info from send-a-time-held-escrow added to escrow.md * IA: Move "Consensus Network" files This re-creates some work from the original commit56fffe0b9f* Rewrite escrows article (re-created) This commit re-creates relevant work from the following commits:9a4a588f2bUpdate escrow.md context infoe1b017dc83Remove references to using escrow for interledger payments. * IA: Move "XRPL servers" files This re-creates some work from original commit7611979abf* IA: move "production readiness" files. Re-creates work from the following commit:692438693aMove tutorials to concepts * New intro articles Original commit:56fffe0b9f* IA: Reorg account concepts Re-creates some work from original commit56fffe0b9f* IA: reorg transaction concepts Original commits:9d4eff9940WIP - reorg accounts7611979abfWIP dir. reorg * IA: reorg consensus concepts Original commit:56fffe0b9f* IA: Reorg ledger docs Original commit:56fffe0b9f- Rephrased some details of the section * IA: rename issuing/operational addresses page Original commit:56fffe0b9f* Moving use cases * Fleshing out Use Cases Note, the dactyl-config.yml file has not been fully updated. * Clean up checks conceptual info. * Remove redundant checks use case section Original commit:3c29e9c05e* IA: move Dex under tokens Original commit:d08b3ba7d7* Touch up stablecoin issuer use case (#1856) * Consolidate stablecoin use case * Stablecoin issuer: cleanup progress through sending * Stablecoin issuer: reorg second half (Note: the dactyl-config.yml is not fully reconciled yet) * Move rippled and clio tutorials into infrastructure * Remove link to checks amendement. * Add note to account_objects.md about commandline interface type field. * Merge expiration case with lifecycle section. * Interoperability Use Cases * Add graphics to intro * Move escrow use cases to dedicated page. * Update use case page intros and corresponding concept info. * Clarify meaning of direct XRP payments. * Intro link updates * Payment use cases * Remove some unnecessary links in transactions section Original commit:e6fcf4a4dc* Link cleanup in Tokens section Original commit:9588dd5e70* Touch up 'Configure Peering' section Original commit:fc8f0990b8* Clean up links in accounts section Original commit:3da5fde7a8* Add NFT mkt use case * p2p payments: edits to Wallets * Clean up payments use cases * Refine history description * IA: use case cleanup * IA: reconcile servers, ledgers sections * IA: reconcile payment types, tx, tokens * IA: reconcile accounts section * IA: reconcile infra * IA: Fix most broken links * Full Docs Index: omit from sidebar * IA: fix up most broken links * fix Absolute path link to internal content * Quick updates to Software Ecosystem * Remove some absolute links to internal resources * Fix remaining broken links in JA target * Contributing: tweak formatting * Tutorials: fix some minor issues * remove interop use cases * remove intro image and personal references to dennis * alphabetize-transaction-nav * Remove unused files * Add QS escrow tutorials * IA: move ledgers, consensus protocol files around * IA: update nav for new page hierarchy * reordering of topics under new networks and servers top-nav * Move "Naming" to "What is XRP?" * Update dactyl-config.yml Remove xrp.md from the TOC. * Update list-xrp-as-an-exchange.md Update link to what-is-xrp * Update list-xrp-as-an-exchange.ja.md Change link to what-is-xrp * Update currency-formats.md Change link to what-is-xrp * Update currency-formats.ja.md Change link to what-is-xrp * Update cancel-an-expired-escrow.md Change link to what-is-xrp * Update paymentchannelfund.md Change link to what-is-xml * Update look-up-escrows.md Change link to what-is-xrp * Update tokens.md change link to what-is-xrp * Update use-payment-channels.md * Update send-a-time-held-escrow.md Update link to what-is-xml * fix broken links * Update parallel-networks.md Change link to what-is-xml * Update parallel-networks.ja.md * Update invariant-checking.md Remove link to xrp.html * Update invariant-checking.ja.md Remove link to xrp.html * Update transaction-cost.md Change link to what-is-xrp * Update transaction-cost.ja.md Change link to what-is-xrp * Update send-a-conditionally-held-escrow.md Change link to what-is-xrp * Update stablecoin-issuer.md Change link to what-is-xrp * Update tokens.ja.md Change link to what-is-xml * Update autobridging.ja.md Change link to what-is-xrp * Update currency-formats.md update text * reorganize infrastructure nav section * Update currency-formats.md Try removing link altogether. * Update currency-formats.ja.md Remove link to what-is-xrp.html * move commandline usage topic to infrastructure * initial intro rewrite * minor update to language * IA.v3: rm Production Readiness * Delete xrp.md * Update xrp link in snippet * Add redirect for old xrp.html URL * Small edits to 'What is XRP?' article * Add missing imgs * XRP - copy edit per @DennisDawson * restructure tutorials nav and pages * fix broken links * more broken link fixes * Algo trading: 1st draft * Algo trading: notes on taxes * Algo trading: edits per review * algo trading: fix broken link * Ledger structure: rewrite for accuracy and clarity * Update links to removed 'tree format' header * Ledger Structure: Update diagrams * Re-gen CSS for ledger structure changes * Ledger structure: edits per review * IA.v3: fix broken NFT links introduced by rebase * Desktop Wallet (py): update little stuff * Update some capacity/storage details * contribute doc nav update * fix image link in create diagram page * IAv3: Fix 'Ledgers' blurb * Update full history requirements with details from community members * add reviewer suggestions * Edits per @trippled review * Apply suggestions from peer review Co-authored-by: oeggert <117319296+oeggert@users.noreply.github.com> * FH: reword file size limit note per review * Update software ecosystem * updates per review * Minor tweaks to graphics * fixTypos * Update content/concepts/introduction/software-ecosystem.md Co-authored-by: Amarantha Kulkarni <amarantha-k@users.noreply.github.com> * Update content/concepts/introduction/software-ecosystem.md Co-authored-by: Amarantha Kulkarni <amarantha-k@users.noreply.github.com> * [JA] update AccountDelete cost * custom transactors doc * add doc to dactyl config * [JA] fix NonFungibleTokensV1_1 amendment status * [JA] update NFTokenOffer page * Remove old, unused XRP article (#2039) * add reviewer suggestions * Add tooling to check for file/nav consistency - From the repo top, run tool/check_file_consistency.py to look for Markdown files that exist in the "content/" directory but aren't used in the documentation. - New "enforce_filenames" filter prints a warning to console when building, if a file's path and filename don't match expectations based on its place in the nav and top heading. * File consistency checker: correctly handle filenames starting in _ * Remove unused old 'get started' and associated code * Create Resources section & reorg some files - Rename some files/folders based on their place in the nav - Move a bunch of non-documentation stuff, and docs on contributing code and/or docs to the new "Resources" section. - Known issue: nav spills into a second row on page widths between 993px-1110px. To be fixed in a later CSS update, maybe along with making the Resources dropdown multi-column. * Fix #2078 code tab bug CSS not built yet, to reduce merge conflicts. Won't have any effect until that happens. * fix Transaction JSON * [JA] translate contributing contents * fix contributing-to-documentation parent * fix contribute-code blurb * Top nav: add cols for Resources, fix broken links * CSS: fix top nav overflows * Fix broken link from redirect not in JA target * Top nav: add Infra to article types * Update contrib info & rename intro file * [ja] Update link to suggested first page to translate * [ja] fix contribute docs organization * Run private network with docker tutorial (#2065) * [NO-ISSUE] Run private network with docker tutorial Adds a tutorial page in the Infrastructure section on how to run a private XRPL network with Docker. Please let me know if you think this is a useful page to include for developers, whether the steps are clear or not, and if you have suggestions on what can be added to it. * Add minor link fixes and Japanese target * Apply suggestions from code review Co-authored-by: Amarantha Kulkarni <amarantha-k@users.noreply.github.com> * Add link to ripple-docker-testnet setup scripts in See Also section * Update repo URL --------- Co-authored-by: Amarantha Kulkarni <amarantha-k@users.noreply.github.com> * add intro gfx (#2036) * add intro gfx * Move graphic up * Update some graphics with their revised versions * Add updated version of the custodial vs non-custodial graphic --------- Co-authored-by: Amarantha Kulkarni <amarantha-k@users.noreply.github.com> Co-authored-by: Amarantha Kulkarni <akulkarni@ripple.com> * Update to reflect current UNL publishers * [ja] update contributing Co-authored-by: tequ <git@tequ.dev> * Incorporate feedback on "What is XRP" page. (#2099) * Add trademark info for XRP * Revert section to previous state * Fix broken link (#2101) --------- Co-authored-by: Oliver Eggert <oeggert@ripple.com> Co-authored-by: ddawson <dennis.s.dawson@gmail.com> Co-authored-by: Maria Shodunke <mshodunke@ripple.com> Co-authored-by: tequ <git@tequ.dev> Co-authored-by: oeggert <117319296+oeggert@users.noreply.github.com> Co-authored-by: Amarantha Kulkarni <amarantha-k@users.noreply.github.com> Co-authored-by: develoQ <develoQ.jp@gmail.com> Co-authored-by: Maria Shodunke <maria-robobug@users.noreply.github.com> Co-authored-by: Amarantha Kulkarni <akulkarni@ripple.com>
1048 lines
38 KiB
Markdown
1048 lines
38 KiB
Markdown
---
|
||
html: py-transfer-nfts.html
|
||
parent: send-payments-using-python.html
|
||
blurb: Use a Python test harness to create and accept NFT buy and sell offers.
|
||
labels:
|
||
- Quickstart
|
||
- Tokens
|
||
- Non-fungible Tokens, NFTs
|
||
---
|
||
|
||
# Transfer NFTs Using Python
|
||
|
||
This example shows how to:
|
||
|
||
1. Create NFT Sell Offers.
|
||
2. Create NFT Buy Offers.
|
||
3. Accept NFT Sell Offers.
|
||
4. Accept NFT Buy Offers.
|
||
5. Get a list of offers for a particular NFT.
|
||
6. Cancel an offer.
|
||
|
||
[](img/quickstart-py15.png)
|
||
|
||
You can download the [Quickstart Samples](https://github.com/XRPLF/xrpl-dev-portal/tree/master/content/_code-samples/quickstart/js/quickstart.zip){.github-code-download} archive to try each of the samples in your own browser.
|
||
|
||
# Usage
|
||
|
||
## Get Accounts
|
||
|
||
1. Open `4.transfer-nfts.html` in a browser.
|
||
2. Choose your ledger instance (**Testnet** or **Devnet**).
|
||
3. Get test accounts.
|
||
1. If you have existing test account seeds
|
||
1. Paste account seed in the **Standby Seed** field.
|
||
2. Click **Get Standby Account**.
|
||
3. Click **Get Standby Account Info**.
|
||
4. Paste account seed in the **Operational Seed** field.
|
||
5. Click **Get Operational Account**.
|
||
6. Click **Get Operational Account Info**.
|
||
2. If you do not have test account seeds:
|
||
1. Click **Get Standby Account**.
|
||
2. Click **Get Standby Account Info**.
|
||
3. Click **Get Operational Account**.
|
||
4. Click **Get Get Op Account Info**.
|
||
|
||
[](img/quickstart-py16.png)
|
||
|
||
## Create a Sell Offer
|
||
|
||
To create a NFT sell offer:
|
||
|
||
1. Enter the **Amount** of the sell offer in drops (millionths of an XRP).
|
||
2. Enter the **NFT ID** of the NFT you want to sell.
|
||
3. Optionally, enter a **Destination** account, the only account that can accept the offer.
|
||
4. Optionally, enter a number of seconds until **Expiration**.
|
||
5. Click **Create Sell Offer**.
|
||
6. Click **Get Offers**.
|
||
|
||
The important piece of information in the response is the NFT Offer Index, labeled as `nft_offer_index`, which you use to accept the sell offer.
|
||
|
||
[](img/quickstart-py17.png)
|
||
|
||
## Accept Sell Offer
|
||
|
||
Once a sell offer is available, another account can opt to accept the offer and buy the NFT.
|
||
|
||
To accept an available sell offer:
|
||
|
||
1. Enter the **NFT Offer Index** (labeled as `nft_offer_index` in the token offer results. This is different from the `NFTokenID`.)
|
||
2. Click **Accept Sell Offer**.
|
||
3. Click **Get Standby Account Info** and **Get Op Account Info** to update the XRP balances.
|
||
4. Click **Get NFTs** for each account to see that the NFT has moved from the Standby account to the Operational account.
|
||
|
||
[](img/quickstart-py18.png)
|
||
|
||
## Create a Buy Offer
|
||
|
||
You can offer to buy an NFT from another account.
|
||
|
||
To create an offer to buy an NFT:
|
||
|
||
1. Enter the **Amount** of your offer.
|
||
2. Enter the **NFT ID**.
|
||
3. Enter the owner’s account string in the **Owner** field.
|
||
4. Optionally enter the number of seconds until **Expiration**.
|
||
5. Click **Create Buy Offer**.
|
||
6. On the Operational side, enter the **NFT ID**.
|
||
7. Click **Get Offers** to view the offer and copy the `nft_offer_index`.
|
||
|
||
[](img/quickstart-py19.png)
|
||
|
||
## Accept a Buy Offer
|
||
|
||
To accept an offer to buy an NFT:
|
||
|
||
1. Enter the **NFT Offer Index** (the `nft_offer_index` of the NFT buy offer).
|
||
2. Click **Accept Buy Offer**.
|
||
3. Click **Get Standby Account Info** and **Get Op Account Info** to update the XRP balances.
|
||
4. Click **Get NFTs** for both accounts to see that the NFT has moved from the Operational account to the Standby account.
|
||
|
||
[](img/quickstart-py20.png)
|
||
|
||
## Get Offers
|
||
|
||
To list the buy and sell offers associated with an NFT:
|
||
|
||
1. Enter the **NFT ID**.
|
||
2. Click **Get Offers**.
|
||
|
||
[](img/quickstart-py21.png)
|
||
|
||
## Cancel Offer
|
||
|
||
To cancel a buy or sell offer that you have created:
|
||
|
||
1. Enter the **NFT Offer Index**.
|
||
2. Click **Cancel Offer**.
|
||
|
||
[](img/quickstart-py22.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){.github-code-download} archive to try each of the samples in your own browser.
|
||
|
||
## mod4.py
|
||
This module contains the new methods `create_sell_offer`, `create_buy_offer`, `accept_sell_offer`, `accept_buy_offer`, `get_offers`, and `cancel_offer`.
|
||
|
||
Import dependencies.
|
||
|
||
```python
|
||
import xrpl
|
||
import json
|
||
from xrpl.clients import JsonRpcClient
|
||
from xrpl.wallet import Wallet
|
||
from datetime import datetime
|
||
from datetime import timedelta
|
||
from xrpl.models.requests import NFTSellOffers
|
||
from xrpl.models.requests import NFTBuyOffers
|
||
from xrpl.models.transactions import NFTokenAcceptOffer
|
||
testnet_url = "https://s.altnet.rippletest.net:51234"
|
||
```
|
||
|
||
## Create Sell Offer
|
||
|
||
Pass the arguments _seed_, _amount_, _NFT ID_, _expiration_ (in seconds, optional), and _destination_ (optional).
|
||
|
||
```python
|
||
def create_sell_offer(seed, amount, nftoken_id, expiration, destination):
|
||
"""create_sell_offer"""
|
||
```
|
||
|
||
Get the owner wallet and create a client connection.
|
||
|
||
```python
|
||
owner_wallet = Wallet(seed, sequence=16237283)
|
||
client = JsonRpcClient(testnet_url)
|
||
```
|
||
|
||
If there is an expiration value, convert the current date and time to Ripple time, then add the expiration value.
|
||
|
||
```python
|
||
expiration_date = datetime.now()
|
||
if expiration != '':
|
||
expiration_date = xrpl.utils.datetime_to_ripple_time(expiration_date)
|
||
expiration_date = expiration_date + int(expiration)
|
||
```
|
||
|
||
Define the sell offer transaction.
|
||
|
||
```python
|
||
sell_offer_tx=xrpl.models.transactions.NFTokenCreateOffer(
|
||
account=owner_wallet.classic_address,
|
||
nftoken_id=nftoken_id,
|
||
amount=amount,
|
||
```
|
||
|
||
If the sale is designated for a specific destination account, include the `destination` argument.
|
||
|
||
```python
|
||
destination=destination if destination != '' else None,
|
||
```
|
||
|
||
If the expiration date is present, include the `expiration` argument.
|
||
|
||
```python
|
||
expiration=expiration_date if expiration != '' else None,
|
||
```
|
||
Set the `flags` value to _1_, indicating that this is a sell offer.
|
||
|
||
```python
|
||
flags=1
|
||
)
|
||
```
|
||
|
||
Sign the transaction.
|
||
|
||
```python
|
||
signed_tx=xrpl.transaction.safe_sign_and_autofill_transaction(
|
||
sell_offer_tx, owner_wallet, client)
|
||
```
|
||
|
||
Submit the transaction.
|
||
|
||
```python
|
||
reply=""
|
||
try:
|
||
response=xrpl.transaction.send_reliable_submission(signed_tx,client)
|
||
reply=response.result
|
||
except xrpl.transaction.XRPLReliableSubmissionException as e:
|
||
reply=f"Submit failed: {e}"
|
||
```
|
||
|
||
Return the result.
|
||
|
||
```python
|
||
return reply
|
||
```
|
||
|
||
## Accept Sell Offer
|
||
|
||
Pass the buyer's seed value and the NFT sell offer index.
|
||
|
||
```python
|
||
def accept_sell_offer(seed, offer_index):
|
||
"""accept_sell_offer"""
|
||
```
|
||
|
||
Get the wallet and a client instance.
|
||
|
||
```python
|
||
buyer_wallet=Wallet(seed, sequence=16237283)
|
||
client=JsonRpcClient(testnet_url)
|
||
```
|
||
|
||
Define the accept offer transaction
|
||
|
||
```python
|
||
accept_offer_tx=xrpl.models.transactions.NFTokenAcceptOffer(
|
||
account=buyer_wallet.classic_address,
|
||
nftoken_sell_offer=offer_index
|
||
)
|
||
```
|
||
|
||
Sign and fill the transaction.
|
||
|
||
```python
|
||
signed_tx=xrpl.transaction.safe_sign_and_autofill_transaction(
|
||
accept_offer_tx, buyer_wallet, client)
|
||
```
|
||
|
||
Submit the transaction and report the results.
|
||
|
||
```python
|
||
reply=""
|
||
try:
|
||
response=xrpl.transaction.send_reliable_submission(signed_tx,client)
|
||
reply=response.result
|
||
except xrpl.transaction.XRPLReliableSubmissionException as e:
|
||
reply=f"Submit failed: {e}"
|
||
return reply
|
||
```
|
||
|
||
## Create Buy Offer
|
||
|
||
Pass the buyer _seed_, _amount_, _NFT ID_, _owner_, _expiration_ (in seconds, optional), and _destination_ account (optional).
|
||
|
||
```python
|
||
def create_buy_offer(seed, amount, nft_id, owner, expiration, destination):
|
||
"""create_buy_offer"""
|
||
```
|
||
|
||
Get the buyer wallet and a client instance.
|
||
|
||
```python
|
||
buyer_wallet=Wallet(seed, sequence=16237283)
|
||
client=JsonRpcClient(testnet_url)
|
||
```
|
||
|
||
If the _expiration_ value is present, get the current date and time, convert it to Ripple time, and add the _expiration_ value.
|
||
|
||
```python
|
||
expiration_date=datetime.now()
|
||
if (expiration!=''):
|
||
expiration_date=xrpl.utils.datetime_to_ripple_time(expiration_date)
|
||
expiration_date=expiration_date + int(expiration)
|
||
```
|
||
|
||
Define the buy offer transaction.
|
||
|
||
```python
|
||
buy_offer_tx=xrpl.models.transactions.NFTokenCreateOffer(
|
||
account=buyer_wallet.classic_address,
|
||
nftoken_id=nft_id,
|
||
amount=amount,
|
||
owner=owner,
|
||
```
|
||
|
||
IF the _expiration_ value is present, include the _expiration_ argument.
|
||
|
||
```python
|
||
expiration=expiration_date if expiration!='' else None,
|
||
```
|
||
|
||
If the _destination_ value is present, include the _destination_ argument.
|
||
|
||
```python
|
||
destination=destination if destination!='' else None,
|
||
```
|
||
|
||
Set the _flags_ value to _0_, indicating that this is a "buy" offer.
|
||
|
||
```python
|
||
flags=0
|
||
)
|
||
```
|
||
|
||
Sign and fill the transaction.
|
||
|
||
```python
|
||
signed_tx=xrpl.transaction.safe_sign_and_autofill_transaction(
|
||
buy_offer_tx, buyer_wallet, client)
|
||
```
|
||
|
||
Submit the transaction and report the results.
|
||
|
||
```python
|
||
reply=""
|
||
try:
|
||
response=xrpl.transaction.send_reliable_submission(signed_tx,client)
|
||
reply=response.result
|
||
except xrpl.transaction.XRPLReliableSubmissionException as e:
|
||
reply=f"Submit failed: {e}"
|
||
return reply
|
||
```
|
||
|
||
## Accept Buy Offer
|
||
|
||
Pass the buyer's _seed_ value and the NFT _offer___index_.
|
||
|
||
```python
|
||
def accept_buy_offer(seed, offer_index):
|
||
"""accept_buy_offer"""
|
||
```
|
||
|
||
Get the buyer wallet and a client instance.
|
||
|
||
```python
|
||
buyer_wallet=Wallet(seed, sequence=16237283)
|
||
client=JsonRpcClient(testnet_url)
|
||
```
|
||
|
||
Define the accept offer transaction.
|
||
|
||
```python
|
||
accept_offer_tx=xrpl.models.transactions.NFTokenAcceptOffer(
|
||
account=buyer_wallet.classic_address,
|
||
nftoken_buy_offer=offer_index
|
||
)
|
||
```
|
||
|
||
Sign and fill the transaction.
|
||
|
||
```python
|
||
signed_tx=xrpl.transaction.safe_sign_and_autofill_transaction(
|
||
accept_offer_tx, buyer_wallet, client)
|
||
```
|
||
|
||
Submit the transaction and report the results
|
||
|
||
```python
|
||
reply=""
|
||
try:
|
||
response=xrpl.transaction.send_reliable_submission(signed_tx,client)
|
||
reply=response.result
|
||
except xrpl.transaction.XRPLReliableSubmissionException as e:
|
||
reply=f"Submit failed: {e}"
|
||
return reply
|
||
```
|
||
|
||
## Get Offers
|
||
|
||
This is a request, rather than a transaction, so there is no need for a wallet.
|
||
|
||
Pass the _NFT ID_.
|
||
|
||
```python
|
||
def get_offers(nft_id):
|
||
"""get_offers"""
|
||
```
|
||
|
||
Create a client instance.
|
||
|
||
```python
|
||
client=JsonRpcClient(testnet_url)
|
||
```
|
||
|
||
Define the request for buy offers.
|
||
|
||
```python
|
||
offers=NFTBuyOffers(
|
||
nft_id=nft_id
|
||
)
|
||
```
|
||
|
||
Send the request and capture the response.
|
||
|
||
```python
|
||
response=client.request(offers)
|
||
```
|
||
|
||
Create the _allOffers_ variable to accumulate the offer responses.
|
||
|
||
```python
|
||
allOffers="Buy Offers:\n"+json.dumps(response.result, indent=4)
|
||
```
|
||
|
||
Define the request for sell offers.
|
||
|
||
```python
|
||
offers=NFTSellOffers(
|
||
nft_id=nft_id
|
||
)
|
||
```
|
||
|
||
Send the request and capture the response.
|
||
|
||
```python
|
||
response=client.request(offers)
|
||
```
|
||
|
||
Add the response to the _allOffers_ variable and return the results.
|
||
|
||
```python
|
||
allOffers+="\n\nSell Offers:\n"+json.dumps(response.result, indent=4)
|
||
return allOffers
|
||
```
|
||
|
||
## Cancel Offer
|
||
|
||
The creator of an offer can cancel it at any time before it is accepted. Anyone can cancel and offer if its expiration data has expired.
|
||
|
||
Pass the seed and the NFT Offer ID to be canceled.
|
||
|
||
```python
|
||
def cancel_offer(seed, nftoken_offer_ids):
|
||
"""cancel_offer"""
|
||
```
|
||
|
||
Get the wallet and a client instance.
|
||
|
||
```python
|
||
owner_wallet=Wallet(seed, sequence=16237283)
|
||
client=JsonRpcClient(testnet_url)
|
||
```
|
||
|
||
The `nftoken_offers` parameter is an array, rather than a single ID. You can revise the code to accept several offer IDs at one time. Here, the value is added to a new array variable.
|
||
|
||
```python
|
||
tokenOfferIDs=[nftoken_offer_ids]
|
||
```
|
||
|
||
Define the cancel offer transaction.
|
||
|
||
```python
|
||
nftSellOffers="No sell offers"
|
||
cancel_offer_tx=xrpl.models.transactions.NFTokenCancelOffer(
|
||
account=owner_wallet.classic_address,
|
||
nftoken_offers=tokenOfferIDs
|
||
)
|
||
```
|
||
|
||
Sign the transaction.
|
||
|
||
```python
|
||
signed_tx = xrpl.transaction.safe_sign_and_autofill_transaction(
|
||
cancel_offer_tx, owner_wallet, client)
|
||
```
|
||
|
||
Submit the transaction and return the result.
|
||
|
||
```python
|
||
reply=""
|
||
try:
|
||
response=xrpl.transaction.send_reliable_submission(signed_tx,client)
|
||
reply=response.result
|
||
except xrpl.transaction.XRPLReliableSubmissionException as e:
|
||
reply=f"Submit failed: {e}"
|
||
return reply
|
||
```
|
||
|
||
## lesson4-transfer-tokens.py
|
||
|
||
This module builds on `lesson3-mint-token.py`. Changes are noted 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,
|
||
)
|
||
```
|
||
|
||
Import new methods from `mod4.py`.
|
||
|
||
```python
|
||
from mod4 import (
|
||
create_sell_offer,
|
||
create_buy_offer,
|
||
get_offers,
|
||
cancel_offer,
|
||
accept_sell_offer,
|
||
accept_buy_offer,
|
||
)
|
||
|
||
```
|
||
|
||
Add handlers for creating, retrieving, and canceling buy and sell offers.
|
||
|
||
```python
|
||
# 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()
|
||
|
||
# Create a new window with the title "Quickstart Module 4"
|
||
window = tk.Tk()
|
||
window.title("Quickstart Module 4")
|
||
|
||
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")
|
||
```
|
||
|
||
Add fields for the *NFT Offer Index*, *Owner*, *Expiration*, and *Transfer Fee*.
|
||
|
||
```python
|
||
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")
|
||
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_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")
|
||
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")
|
||
lbl_standby_results.grid(row=17, column=0, sticky="ne")
|
||
text_standby_results.grid(row=17, 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")
|
||
```
|
||
|
||
Add fields for *NFT Offer Index*, *Owner*, *Expiration*, and *Transfer Fee*.
|
||
|
||
```python
|
||
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")
|
||
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_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")
|
||
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")
|
||
lbl_operational_results.grid(row=17, column=4, sticky="ne")
|
||
text_operational_results.grid(row=17, 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")
|
||
```
|
||
|
||
Add buttons for transferring NFTs.
|
||
|
||
```python
|
||
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")
|
||
|
||
|
||
# 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")
|
||
```
|
||
|
||
Add buttons for transferring NFTs.
|
||
|
||
```python
|
||
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")
|
||
|
||
# Start the application
|
||
window.mainloop()
|
||
```
|