Skip to content

Instantly share code, notes, and snippets.

@everymink
Created January 22, 2021 08:24
Show Gist options
  • Save everymink/011748dfa265053884b245618eb4d721 to your computer and use it in GitHub Desktop.
Save everymink/011748dfa265053884b245618eb4d721 to your computer and use it in GitHub Desktop.
from pyteal import *
def create_atomic_swap_order():
# Args
recovery_account = Arg(0)
buyer = Arg(1)
asset_id = Btoi(Arg(2))
price_per_unit = Btoi(Arg(3))
max_payment_fee = Int(2000)
# Gtx[0] pays seller for asset
payment = Gtxn[0]
# Gtx[1] delivers asset to buyer
delivery = Gtxn[1]
is_valid_payment = And(
Txn.fee() < max_payment_fee,
Txn.type_enum() == TxnType.Payment,
payment.amount() == delivery.asset_amount() * price_per_unit,
)
# Gtx[1] delivers asset to buyer
is_valid_delivery = And(
Txn.type_enum() == TxnType.AssetTransfer,
delivery.asset_receiver() == buyer,
delivery.xfer_asset() == asset_id,
delivery.asset_amount() == payment.amount() / price_per_unit,
)
is_fulfillment = And(
Global.group_size() == Int(2),
is_valid_payment,
is_valid_delivery
)
is_recovery = And(
Global.group_size() == Int(1),
Txn.type_enum() == TxnType.Payment,
Or(Txn.receiver() == recovery_account, Txn.close_remainder_to() == recovery_account),
)
program = Or(is_recovery, is_fulfillment)
return program
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment