mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2025-12-06 17:27:57 +00:00
75 lines
2.9 KiB
Python
75 lines
2.9 KiB
Python
import json
|
|
from datetime import datetime, timedelta, UTC
|
|
from os import urandom
|
|
|
|
from cryptoconditions import PreimageSha256
|
|
from xrpl.clients import JsonRpcClient
|
|
from xrpl.models import EscrowCreate, EscrowFinish
|
|
from xrpl.transaction import submit_and_wait
|
|
from xrpl.utils import datetime_to_ripple_time
|
|
from xrpl.wallet import generate_faucet_wallet
|
|
|
|
# Set up client and get a wallet
|
|
client = JsonRpcClient("https://s.altnet.rippletest.net:51234")
|
|
print("Funding new wallet from faucet...")
|
|
wallet = generate_faucet_wallet(client, debug=True)
|
|
destination_address = "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe" # Testnet faucet
|
|
# Alternative: Get another account to send the escrow to. Use this if you get
|
|
# a tecDIR_FULL error trying to create escrows to the Testnet faucet.
|
|
# destination_address = generate_faucet_wallet(client, debug=True).address
|
|
|
|
# Create the crypto-condition for release -----------------------------------
|
|
preimage = urandom(32)
|
|
fulfillment = PreimageSha256(preimage=preimage)
|
|
condition_hex = fulfillment.condition_binary.hex().upper()
|
|
fulfillment_hex = fulfillment.serialize_binary().hex().upper()
|
|
print("Condition:", condition_hex)
|
|
print("Fulfillment:", fulfillment_hex)
|
|
|
|
# Set the escrow expiration -------------------------------------------------
|
|
cancel_delay = 300
|
|
cancel_after = datetime.now(tz=UTC) + timedelta(seconds=cancel_delay)
|
|
print("This escrow will expire after", cancel_after)
|
|
cancel_after_rippletime = datetime_to_ripple_time(cancel_after)
|
|
|
|
# Send EscrowCreate transaction ---------------------------------------------
|
|
escrow_create = EscrowCreate(
|
|
account=wallet.address,
|
|
destination=destination_address,
|
|
amount="123456", # drops of XRP
|
|
condition=condition_hex,
|
|
cancel_after=cancel_after_rippletime
|
|
)
|
|
|
|
print("Signing and submitting the EscrowCreate transaction.")
|
|
response = submit_and_wait(escrow_create, client, wallet, autofill=True)
|
|
print(json.dumps(response.result, indent=2))
|
|
|
|
# Check result of submitting ------------------------------------------------
|
|
result_code = response.result["meta"]["TransactionResult"]
|
|
if result_code != "tesSUCCESS":
|
|
print(f"EscrowCreate failed with result code {result_code}")
|
|
exit(1)
|
|
|
|
# Save the sequence number so you can identify the escrow later
|
|
escrow_seq = response.result["tx_json"]["Sequence"]
|
|
|
|
# Send the EscrowFinish transaction -----------------------------------------
|
|
escrow_finish = EscrowFinish(
|
|
account=wallet.address,
|
|
owner=wallet.address,
|
|
offer_sequence=escrow_seq,
|
|
condition=condition_hex,
|
|
fulfillment=fulfillment_hex
|
|
)
|
|
print("Signing and submitting the EscrowFinish transaction.")
|
|
response2 = submit_and_wait(escrow_finish, client, wallet, autofill=True)
|
|
print(json.dumps(response2.result, indent=2))
|
|
|
|
result_code = response2.result["meta"]["TransactionResult"]
|
|
if result_code != "tesSUCCESS":
|
|
print(f"EscrowFinish failed with result code {result_code}")
|
|
exit(1)
|
|
|
|
print("Escrow finished successfully.")
|