forked from XRPLF/xrpl-dev-portal
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request XRPLF#2218 from XRPLF/py-condition-escrow
Add Python Conditional Escrow and videos
- Loading branch information
Showing
13 changed files
with
931 additions
and
2 deletions.
There are no files selected for viewing
263 changes: 263 additions & 0 deletions
263
content/_code-samples/quickstart/py/lesson9-conditional-escrow.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,263 @@ | ||
import tkinter as tk | ||
import xrpl | ||
import json | ||
|
||
from mod1 import get_account, get_account_info, send_xrp | ||
from mod8 import get_escrows, cancel_time_escrow, get_transaction | ||
from mod9 import create_conditional_escrow, finish_conditional_escrow | ||
|
||
|
||
############################################# | ||
## Handlers ################################# | ||
############################################# | ||
|
||
## Mod 9 Handlers | ||
|
||
|
||
def standby_create_conditional_escrow(): | ||
results = create_conditional_escrow( | ||
ent_standby_seed.get(), | ||
ent_standby_amount.get(), | ||
ent_standby_destination.get(), | ||
ent_standby_escrow_cancel.get(), | ||
ent_standby_escrow_condition.get() | ||
) | ||
text_standby_results.delete("1.0", tk.END) | ||
text_standby_results.insert("1.0", json.dumps(results, indent=4)) | ||
|
||
def operational_finish_conditional_escrow(): | ||
results = finish_conditional_escrow( | ||
ent_operational_seed.get(), | ||
ent_operational_escrow_owner.get(), | ||
ent_operational_sequence_number.get(), | ||
ent_standby_escrow_condition.get(), | ||
ent_operational_escrow_fulfillment.get() | ||
) | ||
text_operational_results.delete("1.0", tk.END) | ||
text_operational_results.insert("1.0", json.dumps(results, indent=4)) | ||
|
||
|
||
|
||
## Mod 8 Handlers | ||
|
||
def operational_get_escrows(): | ||
results = get_escrows(ent_operational_account.get()) | ||
text_operational_results.delete("1.0", tk.END) | ||
text_operational_results.insert("1.0", json.dumps(results, indent=4)) | ||
|
||
def standby_cancel_time_escrow(): | ||
results = cancel_time_escrow( | ||
ent_standby_seed.get(), | ||
ent_standby_escrow_owner.get(), | ||
ent_standby_escrow_sequence_number.get() | ||
) | ||
text_standby_results.delete("1.0", tk.END) | ||
text_standby_results.insert("1.0", json.dumps(results, indent=4)) | ||
|
||
def operational_get_transaction(): | ||
results = get_transaction(ent_operational_account.get(), | ||
ent_operational_look_up.get()) | ||
text_operational_results.delete("1.0", tk.END) | ||
text_operational_results.insert("1.0", json.dumps(results, indent=4)) | ||
|
||
## Mod 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 "Conditional Escrow Example" | ||
window = tk.Tk() | ||
window.title("Conditional Escrow Example") | ||
|
||
# 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_escrow_condition = tk.Label(master=frm_form, text="Escrow Condition") | ||
ent_standby_escrow_condition = tk.Entry(master=frm_form, width=50) | ||
lbl_standby_escrow_cancel = tk.Label(master=frm_form, text="Escrow Cancel (seconds)") | ||
ent_standby_escrow_cancel = tk.Entry(master=frm_form, width=50) | ||
lbl_standby_escrow_sequence_number = tk.Label(master=frm_form, text="Sequence Number") | ||
ent_standby_escrow_sequence_number = tk.Entry(master=frm_form, width=50) | ||
lbl_standby_escrow_owner = tk.Label(master=frm_form, text="Escrow Owner") | ||
ent_standby_escrow_owner = 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 fields in a grid. | ||
lbl_standy_seed.grid(row=0, column=0, sticky="e") | ||
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_escrow_condition.grid(row=6, column=0, sticky="e") | ||
ent_standby_escrow_condition.grid(row=6, column=1) | ||
lbl_standby_escrow_cancel.grid(row=7, column=0, sticky="e") | ||
ent_standby_escrow_cancel.grid(row=7, column=1) | ||
lbl_standby_escrow_sequence_number.grid(row=8, column=0, sticky="e") | ||
ent_standby_escrow_sequence_number.grid(row=8, column=1) | ||
lbl_standby_escrow_owner.grid(row=9, column=0, sticky="e") | ||
ent_standby_escrow_owner.grid(row=9, column=1) | ||
lbl_standby_results.grid(row=10, column=0, sticky="ne") | ||
text_standby_results.grid(row=10, column=1, sticky="nw") | ||
|
||
############################################### | ||
## 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_sequence_number = tk.Label(master=frm_form, text="Sequence Number") | ||
ent_operational_sequence_number = tk.Entry(master=frm_form, width=50) | ||
lbl_operational_escrow_owner=tk.Label(master=frm_form, text="Escrow Owner") | ||
ent_operational_escrow_owner=tk.Entry(master=frm_form, width=50) | ||
lbl_operational_look_up = tk.Label(master=frm_form, text="Transaction to Look Up") | ||
ent_operational_look_up = tk.Entry(master=frm_form, width=50) | ||
lbl_operational_escrow_fulfillment = tk.Label(master=frm_form, text="Escrow Fulfillment") | ||
ent_operational_escrow_fulfillment = 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_escrow_fulfillment.grid(row=6, column=4, sticky="e") | ||
ent_operational_escrow_fulfillment.grid(row=6, column=5, sticky="w") | ||
lbl_operational_sequence_number.grid(row=7, column=4, sticky="e") | ||
ent_operational_sequence_number.grid(row=7, column=5, sticky="w") | ||
lbl_operational_escrow_owner.grid(row=8, column=4, sticky="e") | ||
ent_operational_escrow_owner.grid(row=8, column=5, sticky="w") | ||
lbl_operational_look_up.grid(row=9, column=4, sticky="e") | ||
ent_operational_look_up.grid(row=9, column=5, sticky="w") | ||
lbl_operational_results.grid(row=10, column=4, sticky="ne") | ||
text_operational_results.grid(row=10, column=5, sticky="nw") | ||
|
||
############################################# | ||
## Buttons ################################## | ||
############################################# | ||
|
||
# Create the Get 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_escrow = tk.Button(master=frm_form, text="Create Conditional Escrow", | ||
command = standby_create_conditional_escrow) | ||
btn_standby_create_escrow.grid(row = 4, column = 2, sticky="nsew") | ||
btn_standby_cancel_escrow = tk.Button(master=frm_form, text="Cancel Escrow", | ||
command = standby_cancel_time_escrow) | ||
btn_standby_cancel_escrow.grid(row=5,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_finish_escrow = tk.Button(master=frm_form, text="Finish Escrow", | ||
command = operational_finish_conditional_escrow) | ||
btn_op_finish_escrow.grid(row = 4, column = 3, sticky="nsew") | ||
btn_op_get_escrows = tk.Button(master=frm_form, text="Get Escrows", | ||
command = operational_get_escrows) | ||
btn_op_get_escrows.grid(row = 5, column = 3, sticky="nsew") | ||
btn_op_get_transaction = tk.Button(master=frm_form, text="Get Transaction", | ||
command = operational_get_transaction) | ||
btn_op_get_transaction.grid(row = 6, column = 3, sticky = "nsew") | ||
|
||
|
||
# Start the application | ||
window.mainloop() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
import xrpl | ||
from xrpl.clients import JsonRpcClient | ||
from xrpl.wallet import Wallet | ||
from datetime import datetime | ||
from xrpl.models.transactions import EscrowCreate, EscrowFinish | ||
|
||
testnet_url = "https://s.altnet.rippletest.net:51234" | ||
|
||
def add_seconds(numOfSeconds): | ||
new_date = datetime.now() | ||
if new_date != '': | ||
new_date = xrpl.utils.datetime_to_ripple_time(new_date) | ||
new_date = new_date + int(numOfSeconds) | ||
return new_date | ||
|
||
|
||
def create_conditional_escrow(seed, amount, destination, cancel, condition): | ||
wallet=Wallet.from_seed(seed) | ||
client=JsonRpcClient(testnet_url) | ||
cancel_date = add_seconds(cancel) | ||
|
||
escrow_tx=xrpl.models.transactions.EscrowCreate( | ||
account=wallet.address, | ||
amount=amount, | ||
destination=destination, | ||
cancel_after=cancel_date, | ||
condition=condition | ||
) | ||
# Submit the transaction and report the results | ||
reply="" | ||
try: | ||
response=xrpl.transaction.submit_and_wait(escrow_tx,client,wallet) | ||
reply=response.result | ||
except xrpl.transaction.XRPLReliableSubmissionException as e: | ||
reply=f"Submit failed: {e}" | ||
return reply | ||
|
||
def finish_conditional_escrow(seed, owner, sequence, condition, fulfillment): | ||
wallet=Wallet.from_seed(seed) | ||
client=JsonRpcClient(testnet_url) | ||
finish_tx=xrpl.models.transactions.EscrowFinish( | ||
account=wallet.address, | ||
owner=owner, | ||
offer_sequence=int(sequence), | ||
condition=condition, | ||
fulfillment=fulfillment | ||
) | ||
# Submit the transaction and report the results | ||
reply="" | ||
try: | ||
response=xrpl.transaction.submit_and_wait(finish_tx,client,wallet) | ||
reply=response.result | ||
except xrpl.transaction.XRPLReliableSubmissionException as e: | ||
reply=f"Submit failed: {e}" | ||
return reply |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.