From a21321600531c19fca4571680c3a868b5b14a66b Mon Sep 17 00:00:00 2001 From: Zeph Grunschlag Date: Tue, 21 Mar 2023 20:07:12 -0500 Subject: [PATCH 1/5] resucitate recurring_swap_deploy.py example --- examples/signature/recurring_swap_deploy.py | 25 ++++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/examples/signature/recurring_swap_deploy.py b/examples/signature/recurring_swap_deploy.py index 1293f8b5c..3d6515de5 100644 --- a/examples/signature/recurring_swap_deploy.py +++ b/examples/signature/recurring_swap_deploy.py @@ -2,8 +2,8 @@ import base64 from nacl import encoding, hash -import params import re +import subprocess import time import uuid @@ -14,6 +14,16 @@ from recurring_swap import recurring_swap +# user declared algod connection parameters. Node must have EnableDeveloperAPI set to true in its config +algod_address = "http://localhost:4001" +algod_token = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + +def execute(cmd: list[str]) -> tuple[str, str]: + print("running: {}".format(" ".join(cmd))) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = p.communicate() + return stdout.decode("utf-8"), stderr.decode("utf-8") # ------- generate provider's account ----------------------------------------------- key_fn = str(uuid.uuid4()) + ".key" @@ -33,7 +43,10 @@ program = recurring_swap(tmpl_provider=Addr(provider_addr)) teal_source = compileTeal(program, mode=Mode.Signature, version=2) -# print(teal_source) +print(f"""---------- teal source ---------- +{teal_source} +---------------------------------""") + # compile teal teal_base = str(uuid.uuid4()) @@ -57,7 +70,7 @@ input("Make sure you did that. Press Enter to continue...") # now, as a provider, you can withdraw Algo from the escrow if you sign the first valid -acl = algod.AlgodClient(params.algod_token, params.algod_address) +acl = algod.AlgodClient(algod_token, algod_address) sp = acl.suggested_params_as_object() first_valid = sp.first @@ -84,7 +97,7 @@ "clerk", "tealsign", "--data-b64", - base64.b64encode(data), + base64.b64encode(data).decode(), "--lsig-txn", "r_s_1.txn", "--keyfile", @@ -102,7 +115,7 @@ lstx = transaction.retrieve_from_file("r_s_1.txn") txid = acl.send_transactions(lstx) -print("1st withraw Succesfull! txid:{}".format(txid)) +print("1st withdraw Succesfull! txid:{}".format(txid)) # at least sleep to the next round time.sleep(6) @@ -133,7 +146,7 @@ "clerk", "tealsign", "--data-b64", - base64.b64encode(data), + base64.b64encode(data).decode(), "--lsig-txn", "r_s_2.txn", "--keyfile", From df04a4025a031fd50fef749a50e483ae9b5e606f Mon Sep 17 00:00:00 2001 From: Zeph Grunschlag Date: Tue, 21 Mar 2023 20:44:22 -0500 Subject: [PATCH 2/5] template test cases --- examples/signature/dutch_auction.py | 22 +- examples/signature/dutch_auction.teal | 2 +- .../signature/dutch_auction_annotated.teal | 302 ++++++++++++++++++ examples/signature/recurring_swap_deploy.py | 7 +- tests/unit/sourcemap_constructs311_test.py | 29 ++ 5 files changed, 357 insertions(+), 5 deletions(-) create mode 100644 examples/signature/dutch_auction_annotated.teal diff --git a/examples/signature/dutch_auction.py b/examples/signature/dutch_auction.py index b2218e436..3c49f667e 100644 --- a/examples/signature/dutch_auction.py +++ b/examples/signature/dutch_auction.py @@ -1,6 +1,12 @@ # This example is provided for informational purposes only and has not been audited for security. +from pathlib import Path -from pyteal import * +from feature_gates import FeatureGates + +FeatureGates.set_sourcemap_enabled(True) + + +from pyteal import * # noqa: E402 """ Template for layer 1 dutch auction (from Fabrice and Shai) @@ -136,4 +142,16 @@ def dutch_auction( if __name__ == "__main__": - print(compileTeal(dutch_auction(), mode=Mode.Signature, version=2)) + # to recreate files, run this script from the root of the repo + EXAMPLES = Path.cwd() / "examples" / "signature" + results = Compilation(dutch_auction(), mode=Mode.Signature, version=2).compile( + with_sourcemap=True, + annotate_teal=True, + annotate_teal_headers=True, + annotate_teal_concise=False, + ) + with open(EXAMPLES / "dutch_auction.teal", "w") as f: + f.write(results.teal) + + with open(EXAMPLES / "dutch_auction_annotated.teal", "w") as f: + f.write(results.sourcemap.annotated_teal) diff --git a/examples/signature/dutch_auction.teal b/examples/signature/dutch_auction.teal index dc45828f2..c319afed5 100644 --- a/examples/signature/dutch_auction.teal +++ b/examples/signature/dutch_auction.teal @@ -298,4 +298,4 @@ gtxn 4 Receiver == && main_l7: -return +return \ No newline at end of file diff --git a/examples/signature/dutch_auction_annotated.teal b/examples/signature/dutch_auction_annotated.teal new file mode 100644 index 000000000..0df4178f3 --- /dev/null +++ b/examples/signature/dutch_auction_annotated.teal @@ -0,0 +1,302 @@ +// GENERATED TEAL // PYTEAL PATH LINE PYTEAL +#pragma version 2 // examples/signature/dutch_auction.py 147 Compilation(dutch_auction(), mode=Mode.Signature, version=2).compile(with_sourcemap=True, annotate_teal=True, annotate_teal_headers=True, annotate_teal_concise=False) +global GroupSize // 136 Global.group_size() +int 5 // Int(5) +== // Global.group_size() == Int(5) +bnz main_l6 // +global GroupSize // 137 Global.group_size() +int 4 // Int(4) +== // Global.group_size() == Int(4) +bnz main_l5 // +global GroupSize // 138 Global.group_size() +int 1 // Int(1) +== // Global.group_size() == Int(1) +bnz main_l4 // +err // 135 Cond([Global.group_size() == Int(5), bid], [Global.group_size() == Int(4), redeem], [Global.group_size() == Int(1), wrapup]) +main_l4: // 138 Global.group_size() == Int(1) +txn RekeyTo // 118 Txn.rekey_to() +global ZeroAddress // Global.zero_address() +== // Txn.rekey_to() == Global.zero_address() +txn FirstValid // 119 Txn.first_valid() +int TMPL_START_ROUND // 15 Tmpl.Int('TMPL_START_ROUND') +int TMPL_WRAPUP_ROUND // 31 Tmpl.Int('TMPL_WRAPUP_ROUND') ++ // 119 start_round + wrapup_time +>= // Txn.first_valid() >= start_round + wrapup_time +&& // 117 And(Txn.rekey_to() == Global.zero_address(), Txn.first_valid() >= start_round + wrapup_time, Or(And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver), And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a))) +txn TypeEnum // 122 Txn.type_enum() +int pay // Txn.type_enum() == TxnType.Payment +== // +txn Amount // 123 Txn.amount() +int 0 // Int(0) +== // Txn.amount() == Int(0) +&& // 121 And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver) +txn CloseRemainderTo // 124 Txn.close_remainder_to() +addr TMPL_RECEIVER // 24 Tmpl.Addr('TMPL_RECEIVER') +== // 124 Txn.close_remainder_to() == receiver +&& // 121 And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver) +txn TypeEnum // 127 Txn.type_enum() +int axfer // Txn.type_enum() == TxnType.AssetTransfer +== // +txn AssetAmount // 128 Txn.asset_amount() +int 0 // Int(0) +== // Txn.asset_amount() == Int(0) +&& // 126 And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a) +txn AssetCloseTo // 129 Txn.asset_close_to() +addr TMPL_RECEIVER // 24 Tmpl.Addr('TMPL_RECEIVER') +== // 129 Txn.asset_close_to() == receiver +&& // 126 And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a) +txn XferAsset // 130 Txn.xfer_asset() +int TMPL_ASSET_A // 20 Tmpl.Int('TMPL_ASSET_A') +== // 130 Txn.xfer_asset() == asset_a +&& // 126 And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a) +|| // 120 Or(And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver), And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a)) +&& // 117 And(Txn.rekey_to() == Global.zero_address(), Txn.first_valid() >= start_round + wrapup_time, Or(And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver), And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a))) +b main_l7 // 147 Compilation(dutch_auction(), mode=Mode.Signature, version=2).compile(with_sourcemap=True, annotate_teal=True, annotate_teal_headers=True, annotate_teal_concise=False) +main_l5: // 137 Global.group_size() == Int(4) +gtxn 0 RekeyTo // 91 Gtxn[0].rekey_to() +global ZeroAddress // Global.zero_address() +== // Gtxn[0].rekey_to() == Global.zero_address() +gtxn 1 RekeyTo // 92 Gtxn[1].rekey_to() +global ZeroAddress // Global.zero_address() +== // Gtxn[1].rekey_to() == Global.zero_address() +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 2 RekeyTo // 93 Gtxn[2].rekey_to() +global ZeroAddress // Global.zero_address() +== // Gtxn[2].rekey_to() == Global.zero_address() +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 3 RekeyTo // 94 Gtxn[3].rekey_to() +global ZeroAddress // Global.zero_address() +== // Gtxn[3].rekey_to() == Global.zero_address() +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 0 FirstValid // 95 Gtxn[0].first_valid() +gtxn 1 FirstValid // Gtxn[1].first_valid() +== // Gtxn[0].first_valid() == Gtxn[1].first_valid() +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 1 FirstValid // 96 Gtxn[1].first_valid() +gtxn 2 FirstValid // Gtxn[2].first_valid() +== // Gtxn[1].first_valid() == Gtxn[2].first_valid() +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 2 FirstValid // 97 Gtxn[2].first_valid() +gtxn 3 FirstValid // Gtxn[3].first_valid() +== // Gtxn[2].first_valid() == Gtxn[3].first_valid() +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 3 FirstValid // 98 Gtxn[3].first_valid() +int TMPL_REDEEM_ROUND // 30 Tmpl.Int('TMPL_REDEEM_ROUND') +>= // 98 Gtxn[3].first_valid() >= redeem_round +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 0 TypeEnum // 99 Gtxn[0].type_enum() +int axfer // Gtxn[0].type_enum() == TxnType.AssetTransfer +== // +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 0 XferAsset // 100 Gtxn[0].xfer_asset() +int TMPL_ASSET_B // 21 Tmpl.Int('TMPL_ASSET_B') +== // 100 Gtxn[0].xfer_asset() == asset_b +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 1 TypeEnum // 101 Gtxn[1].type_enum() +int axfer // Gtxn[1].type_enum() == TxnType.AssetTransfer +== // +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 1 XferAsset // 102 Gtxn[1].xfer_asset() +int TMPL_ASSET_A // 20 Tmpl.Int('TMPL_ASSET_A') +== // 102 Gtxn[1].xfer_asset() == asset_a +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 2 TypeEnum // 103 Gtxn[2].type_enum() +int axfer // Gtxn[2].type_enum() == TxnType.AssetTransfer +== // +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 2 XferAsset // 104 Gtxn[2].xfer_asset() +int TMPL_ASSET_C // 22 Tmpl.Int('TMPL_ASSET_C') +== // 104 Gtxn[2].xfer_asset() == asset_c +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 2 AssetAmount // 105 Gtxn[2].asset_amount() +int TMPL_REDEEM_ROUND // 30 Tmpl.Int('TMPL_REDEEM_ROUND') +int TMPL_N // 17 Tmpl.Int('TMPL_N') +* // 105 redeem_round * supply +int TMPL_PRICE_INCREMENT // 18 Tmpl.Int('TMPL_PRICE_INCREMENT') +* // 105 redeem_round * supply * price_decrement +== // Gtxn[2].asset_amount() == redeem_round * supply * price_decrement +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 3 TypeEnum // 106 Gtxn[3].type_enum() +int pay // Gtxn[3].type_enum() == TxnType.Payment +== // +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 3 Amount // 107 Gtxn[3].amount() +gtxn 1 Fee // Gtxn[1].fee() +gtxn 2 Fee // Gtxn[2].fee() ++ // Gtxn[1].fee() + Gtxn[2].fee() +== // Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee() +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 1 AssetAmount // 108 Gtxn[1].asset_amount() +gtxn 0 AssetAmount // 109 Gtxn[0].asset_amount() +int TMPL_START_PRICE // 16 Tmpl.Int('TMPL_START_PRICE') +int TMPL_PRICE_INCREMENT // 18 Tmpl.Int('TMPL_PRICE_INCREMENT') +arg 0 // 109 Arg(0) +btoi // Btoi(Arg(0)) +* // price_decrement * Btoi(Arg(0)) +- // start_price - price_decrement * Btoi(Arg(0)) +* // Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))) +== // 108 Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))) +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 0 Sender // 110 Gtxn[0].sender() +gtxn 1 Receiver // Gtxn[1].receiver() +== // Gtxn[0].sender() == Gtxn[1].receiver() +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 0 Receiver // 111 Gtxn[0].receiver() +gtxn 1 Sender // Gtxn[1].sender() +== // Gtxn[0].receiver() == Gtxn[1].sender() +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 1 Sender // 112 Gtxn[1].sender() +gtxn 2 Sender // Gtxn[2].sender() +== // Gtxn[1].sender() == Gtxn[2].sender() +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 2 Sender // 113 Gtxn[2].sender() +gtxn 2 Receiver // Gtxn[2].receiver() +== // Gtxn[2].sender() == Gtxn[2].receiver() +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 2 Receiver // 114 Gtxn[2].receiver() +gtxn 3 Receiver // Gtxn[3].receiver() +== // Gtxn[2].receiver() == Gtxn[3].receiver() +&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +b main_l7 // 147 Compilation(dutch_auction(), mode=Mode.Signature, version=2).compile(with_sourcemap=True, annotate_teal=True, annotate_teal_headers=True, annotate_teal_concise=False) +main_l6: // 136 Global.group_size() == Int(5) +gtxn 0 RekeyTo // 57 Gtxn[0].rekey_to() +global ZeroAddress // Global.zero_address() +== // Gtxn[0].rekey_to() == Global.zero_address() +gtxn 1 RekeyTo // 58 Gtxn[1].rekey_to() +global ZeroAddress // Global.zero_address() +== // Gtxn[1].rekey_to() == Global.zero_address() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 2 RekeyTo // 59 Gtxn[2].rekey_to() +global ZeroAddress // Global.zero_address() +== // Gtxn[2].rekey_to() == Global.zero_address() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 3 RekeyTo // 60 Gtxn[3].rekey_to() +global ZeroAddress // Global.zero_address() +== // Gtxn[3].rekey_to() == Global.zero_address() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 4 RekeyTo // 61 Gtxn[4].rekey_to() +global ZeroAddress // Global.zero_address() +== // Gtxn[4].rekey_to() == Global.zero_address() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 0 LastValid // 62 Gtxn[0].last_valid() +gtxn 1 LastValid // Gtxn[1].last_valid() +== // Gtxn[0].last_valid() == Gtxn[1].last_valid() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 1 LastValid // 63 Gtxn[1].last_valid() +gtxn 2 LastValid // Gtxn[2].last_valid() +== // Gtxn[1].last_valid() == Gtxn[2].last_valid() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 2 LastValid // 64 Gtxn[2].last_valid() +gtxn 3 LastValid // Gtxn[3].last_valid() +== // Gtxn[2].last_valid() == Gtxn[3].last_valid() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 3 LastValid // 65 Gtxn[3].last_valid() +gtxn 4 LastValid // Gtxn[4].last_valid() +== // Gtxn[3].last_valid() == Gtxn[4].last_valid() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 4 LastValid // 66 Gtxn[4].last_valid() +int TMPL_START_ROUND // 15 Tmpl.Int('TMPL_START_ROUND') +gtxn 0 LastValid // 54 Gtxn[0].last_valid() +int TMPL_START_ROUND // 15 Tmpl.Int('TMPL_START_ROUND') +- // 54 Gtxn[0].last_valid() - start_round +int TMPL_PERIOD // 19 Tmpl.Int('TMPL_PERIOD') +/ // 54 (Gtxn[0].last_valid() - start_round) / period +int TMPL_PERIOD // 19 Tmpl.Int('TMPL_PERIOD') +* // 66 i_upper * period ++ // start_round + i_upper * period +< // Gtxn[4].last_valid() < start_round + i_upper * period +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 0 TypeEnum // 67 Gtxn[0].type_enum() +int axfer // Gtxn[0].type_enum() == TxnType.AssetTransfer +== // +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 0 XferAsset // 68 Gtxn[0].xfer_asset() +int TMPL_ASSET_D // 23 Tmpl.Int('TMPL_ASSET_D') +== // 68 Gtxn[0].xfer_asset() == asset_d +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 0 Receiver // 69 Gtxn[0].receiver() +addr TMPL_RECEIVER // 24 Tmpl.Addr('TMPL_RECEIVER') +== // 69 Gtxn[0].receiver() == receiver +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 1 TypeEnum // 70 Gtxn[1].type_enum() +int axfer // Gtxn[1].type_enum() == TxnType.AssetTransfer +== // +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 1 XferAsset // 71 Gtxn[1].xfer_asset() +int TMPL_ASSET_B // 21 Tmpl.Int('TMPL_ASSET_B') +== // 71 Gtxn[1].xfer_asset() == asset_b +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 2 TypeEnum // 72 Gtxn[2].type_enum() +int axfer // Gtxn[2].type_enum() == TxnType.AssetTransfer +== // +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 2 XferAsset // 73 Gtxn[2].xfer_asset() +int TMPL_ASSET_C // 22 Tmpl.Int('TMPL_ASSET_C') +== // 73 Gtxn[2].xfer_asset() == asset_c +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 3 TypeEnum // 74 Gtxn[3].type_enum() +int axfer // Gtxn[3].type_enum() == TxnType.AssetTransfer +== // +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 4 XferAsset // 75 Gtxn[4].xfer_asset() +int TMPL_ASSET_C // 22 Tmpl.Int('TMPL_ASSET_C') +== // 75 Gtxn[4].xfer_asset() == asset_c +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 4 TypeEnum // 76 Gtxn[4].type_enum() +int pay // Gtxn[4].type_enum() == TxnType.Payment +== // +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 4 Amount // 77 Gtxn[4].amount() +gtxn 1 Fee // 78 Gtxn[1].fee() +gtxn 2 Fee // Gtxn[2].fee() ++ // Gtxn[1].fee() + Gtxn[2].fee() +gtxn 3 Fee // Gtxn[3].fee() ++ // Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee() +== // 77 Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 0 AssetAmount // 79 Gtxn[0].asset_amount() +gtxn 1 AssetAmount // Gtxn[1].asset_amount() +== // Gtxn[0].asset_amount() == Gtxn[1].asset_amount() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 1 AssetAmount // 80 Gtxn[1].asset_amount() +gtxn 2 AssetAmount // Gtxn[2].asset_amount() +== // Gtxn[1].asset_amount() == Gtxn[2].asset_amount() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 3 AssetAmount // 81 Gtxn[3].asset_amount() +gtxn 0 LastValid // 54 Gtxn[0].last_valid() +int TMPL_START_ROUND // 15 Tmpl.Int('TMPL_START_ROUND') +- // 54 Gtxn[0].last_valid() - start_round +int TMPL_PERIOD // 19 Tmpl.Int('TMPL_PERIOD') +/ // 54 (Gtxn[0].last_valid() - start_round) / period +int TMPL_N // 17 Tmpl.Int('TMPL_N') +* // 81 i_upper * supply +int TMPL_PRICE_INCREMENT // 18 Tmpl.Int('TMPL_PRICE_INCREMENT') +* // 81 i_upper * supply * price_decrement +== // Gtxn[3].asset_amount() == i_upper * supply * price_decrement +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 0 Sender // 82 Gtxn[0].sender() +gtxn 1 Receiver // Gtxn[1].receiver() +== // Gtxn[0].sender() == Gtxn[1].receiver() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 2 Receiver // 83 Gtxn[2].receiver() +addr TMPL_C_ZERO // 28 Tmpl.Addr('TMPL_C_ZERO') +== // 83 Gtxn[2].receiver() == asset_c_sink +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 1 Sender // 84 Gtxn[1].sender() +gtxn 2 Sender // Gtxn[2].sender() +== // Gtxn[1].sender() == Gtxn[2].sender() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 2 Sender // 85 Gtxn[2].sender() +gtxn 3 Sender // Gtxn[3].sender() +== // Gtxn[2].sender() == Gtxn[3].sender() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 3 Sender // 86 Gtxn[3].sender() +gtxn 3 Receiver // Gtxn[3].receiver() +== // Gtxn[3].sender() == Gtxn[3].receiver() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 3 Receiver // 87 Gtxn[3].receiver() +gtxn 4 Receiver // Gtxn[4].receiver() +== // Gtxn[3].receiver() == Gtxn[4].receiver() +&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +main_l7: // 136 Global.group_size() == Int(5) +return // 147 Compilation(dutch_auction(), mode=Mode.Signature, version=2).compile(with_sourcemap=True, annotate_teal=True, annotate_teal_headers=True, annotate_teal_concise=False) \ No newline at end of file diff --git a/examples/signature/recurring_swap_deploy.py b/examples/signature/recurring_swap_deploy.py index 3d6515de5..921151829 100644 --- a/examples/signature/recurring_swap_deploy.py +++ b/examples/signature/recurring_swap_deploy.py @@ -25,6 +25,7 @@ def execute(cmd: list[str]) -> tuple[str, str]: stdout, stderr = p.communicate() return stdout.decode("utf-8"), stderr.decode("utf-8") + # ------- generate provider's account ----------------------------------------------- key_fn = str(uuid.uuid4()) + ".key" execute(["algokey", "generate", "-f", key_fn]) @@ -43,9 +44,11 @@ def execute(cmd: list[str]) -> tuple[str, str]: program = recurring_swap(tmpl_provider=Addr(provider_addr)) teal_source = compileTeal(program, mode=Mode.Signature, version=2) -print(f"""---------- teal source ---------- +print( + f"""---------- teal source ---------- {teal_source} ----------------------------------""") +---------------------------------""" +) # compile teal diff --git a/tests/unit/sourcemap_constructs311_test.py b/tests/unit/sourcemap_constructs311_test.py index 11ab637ce..5a5a1c96f 100644 --- a/tests/unit/sourcemap_constructs311_test.py +++ b/tests/unit/sourcemap_constructs311_test.py @@ -2176,6 +2176,35 @@ def test_constructs_handles_latest_pyteal(): 6, "Application", ), + ( # 44: Templates + lambda pt: pt.Itob(pt.Int(1) + pt.Int(1) + pt.Tmpl.Int("TMPL_VAR")) + == pt.Concat(pt.Bytes("test"), pt.Bytes("test"), pt.Bytes("test2")), + [ + [P, C], + ("int 1", "pt.Int(1)"), + ("int 1", "pt.Int(1)"), + ("+", "pt.Int(1) + pt.Int(1)"), + ("int TMPL_VAR", "pt.Tmpl.Int('TMPL_VAR')"), + ("+", "pt.Int(1) + pt.Int(1) + pt.Tmpl.Int('TMPL_VAR')"), + ("itob", "pt.Itob(pt.Int(1) + pt.Int(1) + pt.Tmpl.Int('TMPL_VAR'))"), + ('byte "test"', "pt.Bytes('test')"), + ('byte "test"', "pt.Bytes('test')"), + ( + "concat", + "pt.Concat(pt.Bytes('test'), pt.Bytes('test'), pt.Bytes('test2'))", + ), + ('byte "test2"', "pt.Bytes('test2')"), + ( + "concat", + "pt.Concat(pt.Bytes('test'), pt.Bytes('test'), pt.Bytes('test2'))", + ), + ( + "==", + "pt.Itob(pt.Int(1) + pt.Int(1) + pt.Tmpl.Int('TMPL_VAR')) == pt.Concat(pt.Bytes('test'), pt.Bytes('test'), pt.Bytes('test2'))", + ), + ("return", C), + ], + ), ] From 40adabcfbd7729e0e9cb3e73ffd9fc0d53e4c437 Mon Sep 17 00:00:00 2001 From: Zeph Grunschlag Date: Tue, 21 Mar 2023 21:17:18 -0500 Subject: [PATCH 3/5] Update examples/signature/recurring_swap_deploy.py --- examples/signature/recurring_swap_deploy.py | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/signature/recurring_swap_deploy.py b/examples/signature/recurring_swap_deploy.py index 921151829..4dc78330e 100644 --- a/examples/signature/recurring_swap_deploy.py +++ b/examples/signature/recurring_swap_deploy.py @@ -14,7 +14,6 @@ from recurring_swap import recurring_swap -# user declared algod connection parameters. Node must have EnableDeveloperAPI set to true in its config algod_address = "http://localhost:4001" algod_token = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" From efb4c5f029596e8d128492e6119ceafd5c48baed Mon Sep 17 00:00:00 2001 From: Zeph Grunschlag Date: Wed, 22 Mar 2023 13:59:22 -0500 Subject: [PATCH 4/5] replace templates by zero values when mapping PC's --- examples/signature/dutch_auction.py | 5 +- .../signature/dutch_auction_annotated.teal | 604 +++++++++--------- pyteal/ast/tmpl.py | 46 +- pyteal/compiler/sourcemap.py | 7 +- 4 files changed, 354 insertions(+), 308 deletions(-) diff --git a/examples/signature/dutch_auction.py b/examples/signature/dutch_auction.py index 3c49f667e..ff60ad243 100644 --- a/examples/signature/dutch_auction.py +++ b/examples/signature/dutch_auction.py @@ -143,13 +143,16 @@ def dutch_auction( if __name__ == "__main__": # to recreate files, run this script from the root of the repo - EXAMPLES = Path.cwd() / "examples" / "signature" results = Compilation(dutch_auction(), mode=Mode.Signature, version=2).compile( with_sourcemap=True, + pcs_in_sourcemap=True, annotate_teal=True, annotate_teal_headers=True, annotate_teal_concise=False, ) + + EXAMPLES = Path.cwd() / "examples" / "signature" + with open(EXAMPLES / "dutch_auction.teal", "w") as f: f.write(results.teal) diff --git a/examples/signature/dutch_auction_annotated.teal b/examples/signature/dutch_auction_annotated.teal index 0df4178f3..c35a29b45 100644 --- a/examples/signature/dutch_auction_annotated.teal +++ b/examples/signature/dutch_auction_annotated.teal @@ -1,302 +1,302 @@ -// GENERATED TEAL // PYTEAL PATH LINE PYTEAL -#pragma version 2 // examples/signature/dutch_auction.py 147 Compilation(dutch_auction(), mode=Mode.Signature, version=2).compile(with_sourcemap=True, annotate_teal=True, annotate_teal_headers=True, annotate_teal_concise=False) -global GroupSize // 136 Global.group_size() -int 5 // Int(5) -== // Global.group_size() == Int(5) -bnz main_l6 // -global GroupSize // 137 Global.group_size() -int 4 // Int(4) -== // Global.group_size() == Int(4) -bnz main_l5 // -global GroupSize // 138 Global.group_size() -int 1 // Int(1) -== // Global.group_size() == Int(1) -bnz main_l4 // -err // 135 Cond([Global.group_size() == Int(5), bid], [Global.group_size() == Int(4), redeem], [Global.group_size() == Int(1), wrapup]) -main_l4: // 138 Global.group_size() == Int(1) -txn RekeyTo // 118 Txn.rekey_to() -global ZeroAddress // Global.zero_address() -== // Txn.rekey_to() == Global.zero_address() -txn FirstValid // 119 Txn.first_valid() -int TMPL_START_ROUND // 15 Tmpl.Int('TMPL_START_ROUND') -int TMPL_WRAPUP_ROUND // 31 Tmpl.Int('TMPL_WRAPUP_ROUND') -+ // 119 start_round + wrapup_time ->= // Txn.first_valid() >= start_round + wrapup_time -&& // 117 And(Txn.rekey_to() == Global.zero_address(), Txn.first_valid() >= start_round + wrapup_time, Or(And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver), And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a))) -txn TypeEnum // 122 Txn.type_enum() -int pay // Txn.type_enum() == TxnType.Payment -== // -txn Amount // 123 Txn.amount() -int 0 // Int(0) -== // Txn.amount() == Int(0) -&& // 121 And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver) -txn CloseRemainderTo // 124 Txn.close_remainder_to() -addr TMPL_RECEIVER // 24 Tmpl.Addr('TMPL_RECEIVER') -== // 124 Txn.close_remainder_to() == receiver -&& // 121 And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver) -txn TypeEnum // 127 Txn.type_enum() -int axfer // Txn.type_enum() == TxnType.AssetTransfer -== // -txn AssetAmount // 128 Txn.asset_amount() -int 0 // Int(0) -== // Txn.asset_amount() == Int(0) -&& // 126 And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a) -txn AssetCloseTo // 129 Txn.asset_close_to() -addr TMPL_RECEIVER // 24 Tmpl.Addr('TMPL_RECEIVER') -== // 129 Txn.asset_close_to() == receiver -&& // 126 And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a) -txn XferAsset // 130 Txn.xfer_asset() -int TMPL_ASSET_A // 20 Tmpl.Int('TMPL_ASSET_A') -== // 130 Txn.xfer_asset() == asset_a -&& // 126 And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a) -|| // 120 Or(And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver), And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a)) -&& // 117 And(Txn.rekey_to() == Global.zero_address(), Txn.first_valid() >= start_round + wrapup_time, Or(And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver), And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a))) -b main_l7 // 147 Compilation(dutch_auction(), mode=Mode.Signature, version=2).compile(with_sourcemap=True, annotate_teal=True, annotate_teal_headers=True, annotate_teal_concise=False) -main_l5: // 137 Global.group_size() == Int(4) -gtxn 0 RekeyTo // 91 Gtxn[0].rekey_to() -global ZeroAddress // Global.zero_address() -== // Gtxn[0].rekey_to() == Global.zero_address() -gtxn 1 RekeyTo // 92 Gtxn[1].rekey_to() -global ZeroAddress // Global.zero_address() -== // Gtxn[1].rekey_to() == Global.zero_address() -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 2 RekeyTo // 93 Gtxn[2].rekey_to() -global ZeroAddress // Global.zero_address() -== // Gtxn[2].rekey_to() == Global.zero_address() -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 3 RekeyTo // 94 Gtxn[3].rekey_to() -global ZeroAddress // Global.zero_address() -== // Gtxn[3].rekey_to() == Global.zero_address() -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 0 FirstValid // 95 Gtxn[0].first_valid() -gtxn 1 FirstValid // Gtxn[1].first_valid() -== // Gtxn[0].first_valid() == Gtxn[1].first_valid() -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 1 FirstValid // 96 Gtxn[1].first_valid() -gtxn 2 FirstValid // Gtxn[2].first_valid() -== // Gtxn[1].first_valid() == Gtxn[2].first_valid() -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 2 FirstValid // 97 Gtxn[2].first_valid() -gtxn 3 FirstValid // Gtxn[3].first_valid() -== // Gtxn[2].first_valid() == Gtxn[3].first_valid() -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 3 FirstValid // 98 Gtxn[3].first_valid() -int TMPL_REDEEM_ROUND // 30 Tmpl.Int('TMPL_REDEEM_ROUND') ->= // 98 Gtxn[3].first_valid() >= redeem_round -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 0 TypeEnum // 99 Gtxn[0].type_enum() -int axfer // Gtxn[0].type_enum() == TxnType.AssetTransfer -== // -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 0 XferAsset // 100 Gtxn[0].xfer_asset() -int TMPL_ASSET_B // 21 Tmpl.Int('TMPL_ASSET_B') -== // 100 Gtxn[0].xfer_asset() == asset_b -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 1 TypeEnum // 101 Gtxn[1].type_enum() -int axfer // Gtxn[1].type_enum() == TxnType.AssetTransfer -== // -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 1 XferAsset // 102 Gtxn[1].xfer_asset() -int TMPL_ASSET_A // 20 Tmpl.Int('TMPL_ASSET_A') -== // 102 Gtxn[1].xfer_asset() == asset_a -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 2 TypeEnum // 103 Gtxn[2].type_enum() -int axfer // Gtxn[2].type_enum() == TxnType.AssetTransfer -== // -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 2 XferAsset // 104 Gtxn[2].xfer_asset() -int TMPL_ASSET_C // 22 Tmpl.Int('TMPL_ASSET_C') -== // 104 Gtxn[2].xfer_asset() == asset_c -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 2 AssetAmount // 105 Gtxn[2].asset_amount() -int TMPL_REDEEM_ROUND // 30 Tmpl.Int('TMPL_REDEEM_ROUND') -int TMPL_N // 17 Tmpl.Int('TMPL_N') -* // 105 redeem_round * supply -int TMPL_PRICE_INCREMENT // 18 Tmpl.Int('TMPL_PRICE_INCREMENT') -* // 105 redeem_round * supply * price_decrement -== // Gtxn[2].asset_amount() == redeem_round * supply * price_decrement -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 3 TypeEnum // 106 Gtxn[3].type_enum() -int pay // Gtxn[3].type_enum() == TxnType.Payment -== // -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 3 Amount // 107 Gtxn[3].amount() -gtxn 1 Fee // Gtxn[1].fee() -gtxn 2 Fee // Gtxn[2].fee() -+ // Gtxn[1].fee() + Gtxn[2].fee() -== // Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee() -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 1 AssetAmount // 108 Gtxn[1].asset_amount() -gtxn 0 AssetAmount // 109 Gtxn[0].asset_amount() -int TMPL_START_PRICE // 16 Tmpl.Int('TMPL_START_PRICE') -int TMPL_PRICE_INCREMENT // 18 Tmpl.Int('TMPL_PRICE_INCREMENT') -arg 0 // 109 Arg(0) -btoi // Btoi(Arg(0)) -* // price_decrement * Btoi(Arg(0)) -- // start_price - price_decrement * Btoi(Arg(0)) -* // Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))) -== // 108 Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))) -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 0 Sender // 110 Gtxn[0].sender() -gtxn 1 Receiver // Gtxn[1].receiver() -== // Gtxn[0].sender() == Gtxn[1].receiver() -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 0 Receiver // 111 Gtxn[0].receiver() -gtxn 1 Sender // Gtxn[1].sender() -== // Gtxn[0].receiver() == Gtxn[1].sender() -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 1 Sender // 112 Gtxn[1].sender() -gtxn 2 Sender // Gtxn[2].sender() -== // Gtxn[1].sender() == Gtxn[2].sender() -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 2 Sender // 113 Gtxn[2].sender() -gtxn 2 Receiver // Gtxn[2].receiver() -== // Gtxn[2].sender() == Gtxn[2].receiver() -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -gtxn 2 Receiver // 114 Gtxn[2].receiver() -gtxn 3 Receiver // Gtxn[3].receiver() -== // Gtxn[2].receiver() == Gtxn[3].receiver() -&& // 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) -b main_l7 // 147 Compilation(dutch_auction(), mode=Mode.Signature, version=2).compile(with_sourcemap=True, annotate_teal=True, annotate_teal_headers=True, annotate_teal_concise=False) -main_l6: // 136 Global.group_size() == Int(5) -gtxn 0 RekeyTo // 57 Gtxn[0].rekey_to() -global ZeroAddress // Global.zero_address() -== // Gtxn[0].rekey_to() == Global.zero_address() -gtxn 1 RekeyTo // 58 Gtxn[1].rekey_to() -global ZeroAddress // Global.zero_address() -== // Gtxn[1].rekey_to() == Global.zero_address() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 2 RekeyTo // 59 Gtxn[2].rekey_to() -global ZeroAddress // Global.zero_address() -== // Gtxn[2].rekey_to() == Global.zero_address() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 3 RekeyTo // 60 Gtxn[3].rekey_to() -global ZeroAddress // Global.zero_address() -== // Gtxn[3].rekey_to() == Global.zero_address() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 4 RekeyTo // 61 Gtxn[4].rekey_to() -global ZeroAddress // Global.zero_address() -== // Gtxn[4].rekey_to() == Global.zero_address() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 0 LastValid // 62 Gtxn[0].last_valid() -gtxn 1 LastValid // Gtxn[1].last_valid() -== // Gtxn[0].last_valid() == Gtxn[1].last_valid() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 1 LastValid // 63 Gtxn[1].last_valid() -gtxn 2 LastValid // Gtxn[2].last_valid() -== // Gtxn[1].last_valid() == Gtxn[2].last_valid() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 2 LastValid // 64 Gtxn[2].last_valid() -gtxn 3 LastValid // Gtxn[3].last_valid() -== // Gtxn[2].last_valid() == Gtxn[3].last_valid() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 3 LastValid // 65 Gtxn[3].last_valid() -gtxn 4 LastValid // Gtxn[4].last_valid() -== // Gtxn[3].last_valid() == Gtxn[4].last_valid() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 4 LastValid // 66 Gtxn[4].last_valid() -int TMPL_START_ROUND // 15 Tmpl.Int('TMPL_START_ROUND') -gtxn 0 LastValid // 54 Gtxn[0].last_valid() -int TMPL_START_ROUND // 15 Tmpl.Int('TMPL_START_ROUND') -- // 54 Gtxn[0].last_valid() - start_round -int TMPL_PERIOD // 19 Tmpl.Int('TMPL_PERIOD') -/ // 54 (Gtxn[0].last_valid() - start_round) / period -int TMPL_PERIOD // 19 Tmpl.Int('TMPL_PERIOD') -* // 66 i_upper * period -+ // start_round + i_upper * period -< // Gtxn[4].last_valid() < start_round + i_upper * period -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 0 TypeEnum // 67 Gtxn[0].type_enum() -int axfer // Gtxn[0].type_enum() == TxnType.AssetTransfer -== // -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 0 XferAsset // 68 Gtxn[0].xfer_asset() -int TMPL_ASSET_D // 23 Tmpl.Int('TMPL_ASSET_D') -== // 68 Gtxn[0].xfer_asset() == asset_d -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 0 Receiver // 69 Gtxn[0].receiver() -addr TMPL_RECEIVER // 24 Tmpl.Addr('TMPL_RECEIVER') -== // 69 Gtxn[0].receiver() == receiver -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 1 TypeEnum // 70 Gtxn[1].type_enum() -int axfer // Gtxn[1].type_enum() == TxnType.AssetTransfer -== // -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 1 XferAsset // 71 Gtxn[1].xfer_asset() -int TMPL_ASSET_B // 21 Tmpl.Int('TMPL_ASSET_B') -== // 71 Gtxn[1].xfer_asset() == asset_b -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 2 TypeEnum // 72 Gtxn[2].type_enum() -int axfer // Gtxn[2].type_enum() == TxnType.AssetTransfer -== // -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 2 XferAsset // 73 Gtxn[2].xfer_asset() -int TMPL_ASSET_C // 22 Tmpl.Int('TMPL_ASSET_C') -== // 73 Gtxn[2].xfer_asset() == asset_c -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 3 TypeEnum // 74 Gtxn[3].type_enum() -int axfer // Gtxn[3].type_enum() == TxnType.AssetTransfer -== // -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 4 XferAsset // 75 Gtxn[4].xfer_asset() -int TMPL_ASSET_C // 22 Tmpl.Int('TMPL_ASSET_C') -== // 75 Gtxn[4].xfer_asset() == asset_c -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 4 TypeEnum // 76 Gtxn[4].type_enum() -int pay // Gtxn[4].type_enum() == TxnType.Payment -== // -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 4 Amount // 77 Gtxn[4].amount() -gtxn 1 Fee // 78 Gtxn[1].fee() -gtxn 2 Fee // Gtxn[2].fee() -+ // Gtxn[1].fee() + Gtxn[2].fee() -gtxn 3 Fee // Gtxn[3].fee() -+ // Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee() -== // 77 Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 0 AssetAmount // 79 Gtxn[0].asset_amount() -gtxn 1 AssetAmount // Gtxn[1].asset_amount() -== // Gtxn[0].asset_amount() == Gtxn[1].asset_amount() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 1 AssetAmount // 80 Gtxn[1].asset_amount() -gtxn 2 AssetAmount // Gtxn[2].asset_amount() -== // Gtxn[1].asset_amount() == Gtxn[2].asset_amount() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 3 AssetAmount // 81 Gtxn[3].asset_amount() -gtxn 0 LastValid // 54 Gtxn[0].last_valid() -int TMPL_START_ROUND // 15 Tmpl.Int('TMPL_START_ROUND') -- // 54 Gtxn[0].last_valid() - start_round -int TMPL_PERIOD // 19 Tmpl.Int('TMPL_PERIOD') -/ // 54 (Gtxn[0].last_valid() - start_round) / period -int TMPL_N // 17 Tmpl.Int('TMPL_N') -* // 81 i_upper * supply -int TMPL_PRICE_INCREMENT // 18 Tmpl.Int('TMPL_PRICE_INCREMENT') -* // 81 i_upper * supply * price_decrement -== // Gtxn[3].asset_amount() == i_upper * supply * price_decrement -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 0 Sender // 82 Gtxn[0].sender() -gtxn 1 Receiver // Gtxn[1].receiver() -== // Gtxn[0].sender() == Gtxn[1].receiver() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 2 Receiver // 83 Gtxn[2].receiver() -addr TMPL_C_ZERO // 28 Tmpl.Addr('TMPL_C_ZERO') -== // 83 Gtxn[2].receiver() == asset_c_sink -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 1 Sender // 84 Gtxn[1].sender() -gtxn 2 Sender // Gtxn[2].sender() -== // Gtxn[1].sender() == Gtxn[2].sender() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 2 Sender // 85 Gtxn[2].sender() -gtxn 3 Sender // Gtxn[3].sender() -== // Gtxn[2].sender() == Gtxn[3].sender() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 3 Sender // 86 Gtxn[3].sender() -gtxn 3 Receiver // Gtxn[3].receiver() -== // Gtxn[3].sender() == Gtxn[3].receiver() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -gtxn 3 Receiver // 87 Gtxn[3].receiver() -gtxn 4 Receiver // Gtxn[4].receiver() -== // Gtxn[3].receiver() == Gtxn[4].receiver() -&& // 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) -main_l7: // 136 Global.group_size() == Int(5) -return // 147 Compilation(dutch_auction(), mode=Mode.Signature, version=2).compile(with_sourcemap=True, annotate_teal=True, annotate_teal_headers=True, annotate_teal_concise=False) \ No newline at end of file +// GENERATED TEAL // PC PYTEAL PATH LINE PYTEAL +#pragma version 2 // (0) examples/signature/dutch_auction.py 146 Compilation(dutch_auction(), mode=Mode.Signature, version=2).compile(with_sourcemap=True, pcs_in_sourcemap=True, annotate_teal=True, annotate_teal_headers=True, annotate_teal_concise=False) +global GroupSize // (42) 136 Global.group_size() +int 5 // (44) Int(5) +== // (45) Global.group_size() == Int(5) +bnz main_l6 // (46) +global GroupSize // (49) 137 Global.group_size() +int 4 // (51) Int(4) +== // (52) Global.group_size() == Int(4) +bnz main_l5 // (53) +global GroupSize // (56) 138 Global.group_size() +int 1 // (58) Int(1) +== // (59) Global.group_size() == Int(1) +bnz main_l4 // (60) +err // (63) 135 Cond([Global.group_size() == Int(5), bid], [Global.group_size() == Int(4), redeem], [Global.group_size() == Int(1), wrapup]) +main_l4: // 138 Global.group_size() == Int(1) +txn RekeyTo // (64) 118 Txn.rekey_to() +global ZeroAddress // (66) Global.zero_address() +== // (68) Txn.rekey_to() == Global.zero_address() +txn FirstValid // (69) 119 Txn.first_valid() +int TMPL_START_ROUND // (71) 15 Tmpl.Int('TMPL_START_ROUND') +int TMPL_WRAPUP_ROUND // (72) 31 Tmpl.Int('TMPL_WRAPUP_ROUND') ++ // (73) 119 start_round + wrapup_time +>= // (74) Txn.first_valid() >= start_round + wrapup_time +&& // (75) 117 And(Txn.rekey_to() == Global.zero_address(), Txn.first_valid() >= start_round + wrapup_time, Or(And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver), And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a))) +txn TypeEnum // (76) 122 Txn.type_enum() +int pay // (78) Txn.type_enum() == TxnType.Payment +== // (79) +txn Amount // (80) 123 Txn.amount() +int 0 // (82) Int(0) +== // (83) Txn.amount() == Int(0) +&& // (84) 121 And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver) +txn CloseRemainderTo // (85) 124 Txn.close_remainder_to() +addr TMPL_RECEIVER // (87) 24 Tmpl.Addr('TMPL_RECEIVER') +== // (88) 124 Txn.close_remainder_to() == receiver +&& // (89) 121 And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver) +txn TypeEnum // (90) 127 Txn.type_enum() +int axfer // (92) Txn.type_enum() == TxnType.AssetTransfer +== // (93) +txn AssetAmount // (94) 128 Txn.asset_amount() +int 0 // (96) Int(0) +== // (97) Txn.asset_amount() == Int(0) +&& // (98) 126 And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a) +txn AssetCloseTo // (99) 129 Txn.asset_close_to() +addr TMPL_RECEIVER // (101) 24 Tmpl.Addr('TMPL_RECEIVER') +== // (102) 129 Txn.asset_close_to() == receiver +&& // (103) 126 And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a) +txn XferAsset // (104) 130 Txn.xfer_asset() +int TMPL_ASSET_A // (106) 20 Tmpl.Int('TMPL_ASSET_A') +== // (107) 130 Txn.xfer_asset() == asset_a +&& // (108) 126 And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a) +|| // (109) 120 Or(And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver), And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a)) +&& // (110) 117 And(Txn.rekey_to() == Global.zero_address(), Txn.first_valid() >= start_round + wrapup_time, Or(And(Txn.type_enum() == TxnType.Payment, Txn.amount() == Int(0), Txn.close_remainder_to() == receiver), And(Txn.type_enum() == TxnType.AssetTransfer, Txn.asset_amount() == Int(0), Txn.asset_close_to() == receiver, Txn.xfer_asset() == asset_a))) +b main_l7 // (111) 146 Compilation(dutch_auction(), mode=Mode.Signature, version=2).compile(with_sourcemap=True, pcs_in_sourcemap=True, annotate_teal=True, annotate_teal_headers=True, annotate_teal_concise=False) +main_l5: // 137 Global.group_size() == Int(4) +gtxn 0 RekeyTo // (114) 91 Gtxn[0].rekey_to() +global ZeroAddress // (117) Global.zero_address() +== // (119) Gtxn[0].rekey_to() == Global.zero_address() +gtxn 1 RekeyTo // (120) 92 Gtxn[1].rekey_to() +global ZeroAddress // (123) Global.zero_address() +== // (125) Gtxn[1].rekey_to() == Global.zero_address() +&& // (126) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 2 RekeyTo // (127) 93 Gtxn[2].rekey_to() +global ZeroAddress // (130) Global.zero_address() +== // (132) Gtxn[2].rekey_to() == Global.zero_address() +&& // (133) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 3 RekeyTo // (134) 94 Gtxn[3].rekey_to() +global ZeroAddress // (137) Global.zero_address() +== // (139) Gtxn[3].rekey_to() == Global.zero_address() +&& // (140) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 0 FirstValid // (141) 95 Gtxn[0].first_valid() +gtxn 1 FirstValid // (144) Gtxn[1].first_valid() +== // (147) Gtxn[0].first_valid() == Gtxn[1].first_valid() +&& // (148) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 1 FirstValid // (149) 96 Gtxn[1].first_valid() +gtxn 2 FirstValid // (152) Gtxn[2].first_valid() +== // (155) Gtxn[1].first_valid() == Gtxn[2].first_valid() +&& // (156) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 2 FirstValid // (157) 97 Gtxn[2].first_valid() +gtxn 3 FirstValid // (160) Gtxn[3].first_valid() +== // (163) Gtxn[2].first_valid() == Gtxn[3].first_valid() +&& // (164) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 3 FirstValid // (165) 98 Gtxn[3].first_valid() +int TMPL_REDEEM_ROUND // (168) 30 Tmpl.Int('TMPL_REDEEM_ROUND') +>= // (169) 98 Gtxn[3].first_valid() >= redeem_round +&& // (170) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 0 TypeEnum // (171) 99 Gtxn[0].type_enum() +int axfer // (174) Gtxn[0].type_enum() == TxnType.AssetTransfer +== // (175) +&& // (176) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 0 XferAsset // (177) 100 Gtxn[0].xfer_asset() +int TMPL_ASSET_B // (180) 21 Tmpl.Int('TMPL_ASSET_B') +== // (181) 100 Gtxn[0].xfer_asset() == asset_b +&& // (182) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 1 TypeEnum // (183) 101 Gtxn[1].type_enum() +int axfer // (186) Gtxn[1].type_enum() == TxnType.AssetTransfer +== // (187) +&& // (188) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 1 XferAsset // (189) 102 Gtxn[1].xfer_asset() +int TMPL_ASSET_A // (192) 20 Tmpl.Int('TMPL_ASSET_A') +== // (193) 102 Gtxn[1].xfer_asset() == asset_a +&& // (194) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 2 TypeEnum // (195) 103 Gtxn[2].type_enum() +int axfer // (198) Gtxn[2].type_enum() == TxnType.AssetTransfer +== // (199) +&& // (200) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 2 XferAsset // (201) 104 Gtxn[2].xfer_asset() +int TMPL_ASSET_C // (204) 22 Tmpl.Int('TMPL_ASSET_C') +== // (205) 104 Gtxn[2].xfer_asset() == asset_c +&& // (206) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 2 AssetAmount // (207) 105 Gtxn[2].asset_amount() +int TMPL_REDEEM_ROUND // (210) 30 Tmpl.Int('TMPL_REDEEM_ROUND') +int TMPL_N // (211) 17 Tmpl.Int('TMPL_N') +* // (212) 105 redeem_round * supply +int TMPL_PRICE_INCREMENT // (213) 18 Tmpl.Int('TMPL_PRICE_INCREMENT') +* // (214) 105 redeem_round * supply * price_decrement +== // (215) Gtxn[2].asset_amount() == redeem_round * supply * price_decrement +&& // (216) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 3 TypeEnum // (217) 106 Gtxn[3].type_enum() +int pay // (220) Gtxn[3].type_enum() == TxnType.Payment +== // (221) +&& // (222) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 3 Amount // (223) 107 Gtxn[3].amount() +gtxn 1 Fee // (226) Gtxn[1].fee() +gtxn 2 Fee // (229) Gtxn[2].fee() ++ // (232) Gtxn[1].fee() + Gtxn[2].fee() +== // (233) Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee() +&& // (234) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 1 AssetAmount // (235) 108 Gtxn[1].asset_amount() +gtxn 0 AssetAmount // (238) 109 Gtxn[0].asset_amount() +int TMPL_START_PRICE // (241) 16 Tmpl.Int('TMPL_START_PRICE') +int TMPL_PRICE_INCREMENT // (242) 18 Tmpl.Int('TMPL_PRICE_INCREMENT') +arg 0 // (243) 109 Arg(0) +btoi // (244) Btoi(Arg(0)) +* // (245) price_decrement * Btoi(Arg(0)) +- // (246) start_price - price_decrement * Btoi(Arg(0)) +* // (247) Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))) +== // (248) 108 Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))) +&& // (249) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 0 Sender // (250) 110 Gtxn[0].sender() +gtxn 1 Receiver // (253) Gtxn[1].receiver() +== // (256) Gtxn[0].sender() == Gtxn[1].receiver() +&& // (257) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 0 Receiver // (258) 111 Gtxn[0].receiver() +gtxn 1 Sender // (261) Gtxn[1].sender() +== // (264) Gtxn[0].receiver() == Gtxn[1].sender() +&& // (265) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 1 Sender // (266) 112 Gtxn[1].sender() +gtxn 2 Sender // (269) Gtxn[2].sender() +== // (272) Gtxn[1].sender() == Gtxn[2].sender() +&& // (273) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 2 Sender // (274) 113 Gtxn[2].sender() +gtxn 2 Receiver // (277) Gtxn[2].receiver() +== // (280) Gtxn[2].sender() == Gtxn[2].receiver() +&& // (281) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +gtxn 2 Receiver // (282) 114 Gtxn[2].receiver() +gtxn 3 Receiver // (285) Gtxn[3].receiver() +== // (288) Gtxn[2].receiver() == Gtxn[3].receiver() +&& // (289) 90 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[0].first_valid() == Gtxn[1].first_valid(), Gtxn[1].first_valid() == Gtxn[2].first_valid(), Gtxn[2].first_valid() == Gtxn[3].first_valid(), Gtxn[3].first_valid() >= redeem_round, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_b, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_a, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[2].asset_amount() == redeem_round * supply * price_decrement, Gtxn[3].type_enum() == TxnType.Payment, Gtxn[3].amount() == Gtxn[1].fee() + Gtxn[2].fee(), Gtxn[1].asset_amount() == Gtxn[0].asset_amount() * (start_price - price_decrement * Btoi(Arg(0))), Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[0].receiver() == Gtxn[1].sender(), Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[2].receiver(), Gtxn[2].receiver() == Gtxn[3].receiver()) +b main_l7 // (290) 146 Compilation(dutch_auction(), mode=Mode.Signature, version=2).compile(with_sourcemap=True, pcs_in_sourcemap=True, annotate_teal=True, annotate_teal_headers=True, annotate_teal_concise=False) +main_l6: // 136 Global.group_size() == Int(5) +gtxn 0 RekeyTo // (293) 57 Gtxn[0].rekey_to() +global ZeroAddress // (296) Global.zero_address() +== // (298) Gtxn[0].rekey_to() == Global.zero_address() +gtxn 1 RekeyTo // (299) 58 Gtxn[1].rekey_to() +global ZeroAddress // (302) Global.zero_address() +== // (304) Gtxn[1].rekey_to() == Global.zero_address() +&& // (305) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 2 RekeyTo // (306) 59 Gtxn[2].rekey_to() +global ZeroAddress // (309) Global.zero_address() +== // (311) Gtxn[2].rekey_to() == Global.zero_address() +&& // (312) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 3 RekeyTo // (313) 60 Gtxn[3].rekey_to() +global ZeroAddress // (316) Global.zero_address() +== // (318) Gtxn[3].rekey_to() == Global.zero_address() +&& // (319) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 4 RekeyTo // (320) 61 Gtxn[4].rekey_to() +global ZeroAddress // (323) Global.zero_address() +== // (325) Gtxn[4].rekey_to() == Global.zero_address() +&& // (326) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 0 LastValid // (327) 62 Gtxn[0].last_valid() +gtxn 1 LastValid // (330) Gtxn[1].last_valid() +== // (333) Gtxn[0].last_valid() == Gtxn[1].last_valid() +&& // (334) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 1 LastValid // (335) 63 Gtxn[1].last_valid() +gtxn 2 LastValid // (338) Gtxn[2].last_valid() +== // (341) Gtxn[1].last_valid() == Gtxn[2].last_valid() +&& // (342) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 2 LastValid // (343) 64 Gtxn[2].last_valid() +gtxn 3 LastValid // (346) Gtxn[3].last_valid() +== // (349) Gtxn[2].last_valid() == Gtxn[3].last_valid() +&& // (350) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 3 LastValid // (351) 65 Gtxn[3].last_valid() +gtxn 4 LastValid // (354) Gtxn[4].last_valid() +== // (357) Gtxn[3].last_valid() == Gtxn[4].last_valid() +&& // (358) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 4 LastValid // (359) 66 Gtxn[4].last_valid() +int TMPL_START_ROUND // (362) 15 Tmpl.Int('TMPL_START_ROUND') +gtxn 0 LastValid // (363) 54 Gtxn[0].last_valid() +int TMPL_START_ROUND // (366) 15 Tmpl.Int('TMPL_START_ROUND') +- // (367) 54 Gtxn[0].last_valid() - start_round +int TMPL_PERIOD // (368) 19 Tmpl.Int('TMPL_PERIOD') +/ // (369) 54 (Gtxn[0].last_valid() - start_round) / period +int TMPL_PERIOD // (370) 19 Tmpl.Int('TMPL_PERIOD') +* // (371) 66 i_upper * period ++ // (372) start_round + i_upper * period +< // (373) Gtxn[4].last_valid() < start_round + i_upper * period +&& // (374) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 0 TypeEnum // (375) 67 Gtxn[0].type_enum() +int axfer // (378) Gtxn[0].type_enum() == TxnType.AssetTransfer +== // (379) +&& // (380) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 0 XferAsset // (381) 68 Gtxn[0].xfer_asset() +int TMPL_ASSET_D // (384) 23 Tmpl.Int('TMPL_ASSET_D') +== // (385) 68 Gtxn[0].xfer_asset() == asset_d +&& // (386) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 0 Receiver // (387) 69 Gtxn[0].receiver() +addr TMPL_RECEIVER // (390) 24 Tmpl.Addr('TMPL_RECEIVER') +== // (391) 69 Gtxn[0].receiver() == receiver +&& // (392) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 1 TypeEnum // (393) 70 Gtxn[1].type_enum() +int axfer // (396) Gtxn[1].type_enum() == TxnType.AssetTransfer +== // (397) +&& // (398) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 1 XferAsset // (399) 71 Gtxn[1].xfer_asset() +int TMPL_ASSET_B // (402) 21 Tmpl.Int('TMPL_ASSET_B') +== // (403) 71 Gtxn[1].xfer_asset() == asset_b +&& // (404) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 2 TypeEnum // (405) 72 Gtxn[2].type_enum() +int axfer // (408) Gtxn[2].type_enum() == TxnType.AssetTransfer +== // (409) +&& // (410) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 2 XferAsset // (411) 73 Gtxn[2].xfer_asset() +int TMPL_ASSET_C // (414) 22 Tmpl.Int('TMPL_ASSET_C') +== // (415) 73 Gtxn[2].xfer_asset() == asset_c +&& // (416) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 3 TypeEnum // (417) 74 Gtxn[3].type_enum() +int axfer // (420) Gtxn[3].type_enum() == TxnType.AssetTransfer +== // (421) +&& // (422) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 4 XferAsset // (423) 75 Gtxn[4].xfer_asset() +int TMPL_ASSET_C // (426) 22 Tmpl.Int('TMPL_ASSET_C') +== // (427) 75 Gtxn[4].xfer_asset() == asset_c +&& // (428) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 4 TypeEnum // (429) 76 Gtxn[4].type_enum() +int pay // (432) Gtxn[4].type_enum() == TxnType.Payment +== // (433) +&& // (434) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 4 Amount // (435) 77 Gtxn[4].amount() +gtxn 1 Fee // (438) 78 Gtxn[1].fee() +gtxn 2 Fee // (441) Gtxn[2].fee() ++ // (444) Gtxn[1].fee() + Gtxn[2].fee() +gtxn 3 Fee // (445) Gtxn[3].fee() ++ // (448) Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee() +== // (449) 77 Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee() +&& // (450) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 0 AssetAmount // (451) 79 Gtxn[0].asset_amount() +gtxn 1 AssetAmount // (454) Gtxn[1].asset_amount() +== // (457) Gtxn[0].asset_amount() == Gtxn[1].asset_amount() +&& // (458) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 1 AssetAmount // (459) 80 Gtxn[1].asset_amount() +gtxn 2 AssetAmount // (462) Gtxn[2].asset_amount() +== // (465) Gtxn[1].asset_amount() == Gtxn[2].asset_amount() +&& // (466) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 3 AssetAmount // (467) 81 Gtxn[3].asset_amount() +gtxn 0 LastValid // (470) 54 Gtxn[0].last_valid() +int TMPL_START_ROUND // (473) 15 Tmpl.Int('TMPL_START_ROUND') +- // (474) 54 Gtxn[0].last_valid() - start_round +int TMPL_PERIOD // (475) 19 Tmpl.Int('TMPL_PERIOD') +/ // (476) 54 (Gtxn[0].last_valid() - start_round) / period +int TMPL_N // (477) 17 Tmpl.Int('TMPL_N') +* // (478) 81 i_upper * supply +int TMPL_PRICE_INCREMENT // (479) 18 Tmpl.Int('TMPL_PRICE_INCREMENT') +* // (480) 81 i_upper * supply * price_decrement +== // (481) Gtxn[3].asset_amount() == i_upper * supply * price_decrement +&& // (482) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 0 Sender // (483) 82 Gtxn[0].sender() +gtxn 1 Receiver // (486) Gtxn[1].receiver() +== // (489) Gtxn[0].sender() == Gtxn[1].receiver() +&& // (490) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 2 Receiver // (491) 83 Gtxn[2].receiver() +addr TMPL_C_ZERO // (494) 28 Tmpl.Addr('TMPL_C_ZERO') +== // (495) 83 Gtxn[2].receiver() == asset_c_sink +&& // (496) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 1 Sender // (497) 84 Gtxn[1].sender() +gtxn 2 Sender // (500) Gtxn[2].sender() +== // (503) Gtxn[1].sender() == Gtxn[2].sender() +&& // (504) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 2 Sender // (505) 85 Gtxn[2].sender() +gtxn 3 Sender // (508) Gtxn[3].sender() +== // (511) Gtxn[2].sender() == Gtxn[3].sender() +&& // (512) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 3 Sender // (513) 86 Gtxn[3].sender() +gtxn 3 Receiver // (516) Gtxn[3].receiver() +== // (519) Gtxn[3].sender() == Gtxn[3].receiver() +&& // (520) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +gtxn 3 Receiver // (521) 87 Gtxn[3].receiver() +gtxn 4 Receiver // (524) Gtxn[4].receiver() +== // (527) Gtxn[3].receiver() == Gtxn[4].receiver() +&& // (528) 56 And(Gtxn[0].rekey_to() == Global.zero_address(), Gtxn[1].rekey_to() == Global.zero_address(), Gtxn[2].rekey_to() == Global.zero_address(), Gtxn[3].rekey_to() == Global.zero_address(), Gtxn[4].rekey_to() == Global.zero_address(), Gtxn[0].last_valid() == Gtxn[1].last_valid(), Gtxn[1].last_valid() == Gtxn[2].last_valid(), Gtxn[2].last_valid() == Gtxn[3].last_valid(), Gtxn[3].last_valid() == Gtxn[4].last_valid(), Gtxn[4].last_valid() < start_round + i_upper * period, Gtxn[0].type_enum() == TxnType.AssetTransfer, Gtxn[0].xfer_asset() == asset_d, Gtxn[0].receiver() == receiver, Gtxn[1].type_enum() == TxnType.AssetTransfer, Gtxn[1].xfer_asset() == asset_b, Gtxn[2].type_enum() == TxnType.AssetTransfer, Gtxn[2].xfer_asset() == asset_c, Gtxn[3].type_enum() == TxnType.AssetTransfer, Gtxn[4].xfer_asset() == asset_c, Gtxn[4].type_enum() == TxnType.Payment, Gtxn[4].amount() == Gtxn[1].fee() + Gtxn[2].fee() + Gtxn[3].fee(), Gtxn[0].asset_amount() == Gtxn[1].asset_amount(), Gtxn[1].asset_amount() == Gtxn[2].asset_amount(), Gtxn[3].asset_amount() == i_upper * supply * price_decrement, Gtxn[0].sender() == Gtxn[1].receiver(), Gtxn[2].receiver() == asset_c_sink, Gtxn[1].sender() == Gtxn[2].sender(), Gtxn[2].sender() == Gtxn[3].sender(), Gtxn[3].sender() == Gtxn[3].receiver(), Gtxn[3].receiver() == Gtxn[4].receiver()) +main_l7: // 136 Global.group_size() == Int(5) +return // (529) 146 Compilation(dutch_auction(), mode=Mode.Signature, version=2).compile(with_sourcemap=True, pcs_in_sourcemap=True, annotate_teal=True, annotate_teal_headers=True, annotate_teal_concise=False) \ No newline at end of file diff --git a/pyteal/ast/tmpl.py b/pyteal/ast/tmpl.py index 6d7061094..ae9dd65ce 100644 --- a/pyteal/ast/tmpl.py +++ b/pyteal/ast/tmpl.py @@ -1,5 +1,8 @@ +from enum import Enum from typing import TYPE_CHECKING +from algosdk.constants import ZERO_ADDRESS + from pyteal.types import TealType, valid_tmpl from pyteal.ir import TealOp, Op, TealBlock from pyteal.ast.leafexpr import LeafExpr @@ -8,16 +11,26 @@ from pyteal.compiler import CompileOptions +class TmplKind(Enum): + Int = 0 + Bytes = 1 + Addr = 2 + + class Tmpl(LeafExpr): """Template expression for creating placeholder values.""" - def __init__(self, op: Op, type: TealType, name: str) -> None: + _session_templates: dict[str, TmplKind] = {} + + def __init__(self, op: Op, type: TealType, name: str, kind: TmplKind) -> None: super().__init__() valid_tmpl(name) self.op = op self.type = type self.name = name + self._session_templates[name] = kind + def __str__(self): return "(Tmpl {} {})".format(self.op, self.name) @@ -28,6 +41,15 @@ def __teal__(self, options: "CompileOptions"): def type_of(self): return self.type + @classmethod + def session_templates(cls) -> list[str]: + return list(cls._session_templates.keys()) + + @classmethod + def clear_session_templates(cls): + """Clear all session templates.""" + cls._session_templates = {} + @classmethod def Int(cls, placeholder: str): """Create a new Int template. @@ -36,7 +58,7 @@ def Int(cls, placeholder: str): placeholder: The name to use for this template variable. Must start with `TMPL_` and only consist of uppercase alphanumeric characters and underscores. """ - return cls(Op.int, TealType.uint64, placeholder) + return cls(Op.int, TealType.uint64, placeholder, TmplKind.Int) @classmethod def Bytes(cls, placeholder: str): @@ -46,7 +68,7 @@ def Bytes(cls, placeholder: str): placeholder: The name to use for this template variable. Must start with `TMPL_` and only consist of uppercase alphanumeric characters and underscores. """ - return cls(Op.byte, TealType.bytes, placeholder) + return cls(Op.byte, TealType.bytes, placeholder, TmplKind.Bytes) @classmethod def Addr(cls, placeholder: str): @@ -56,7 +78,23 @@ def Addr(cls, placeholder: str): placeholder: The name to use for this template variable. Must start with `TMPL_` and only consist of uppercase alphanumeric characters and underscores. """ - return cls(Op.addr, TealType.bytes, placeholder) + return cls(Op.addr, TealType.bytes, placeholder, TmplKind.Addr) + + @classmethod + def zero(cls, placeholder) -> str: + """Return a zero value for the given template placeholder.""" + if placeholder not in cls._session_templates: + raise ValueError(f"Unknown template: {placeholder}") + + match (kind := cls._session_templates[placeholder]): + case TmplKind.Int: + return "0" + case TmplKind.Bytes: + return "0x00" + case TmplKind.Addr: + return ZERO_ADDRESS + case _: + raise ValueError(f"Unknown template kind: {kind}") Tmpl.__module__ = "pyteal" diff --git a/pyteal/compiler/sourcemap.py b/pyteal/compiler/sourcemap.py index ef98dca1e..0f54c162f 100644 --- a/pyteal/compiler/sourcemap.py +++ b/pyteal/compiler/sourcemap.py @@ -937,7 +937,12 @@ def _build_pc_sourcemap(self): algod = algod_with_assertion( self.algod, msg="Adding PC's to sourcemap requires live Algod" ) - algod_compilation = algod.compile(self.compiled_teal(), source_map=True) + + teal: str = self.compiled_teal() + for template in pt.Tmpl.session_templates(): + teal = teal.replace(template, pt.Tmpl.zero(template)) + + algod_compilation = algod.compile(teal, source_map=True) raw_sourcemap = algod_compilation.get("sourcemap") if not raw_sourcemap: raise TealInternalError( From 1c389fc47ec3a5ace5ad0e681ce88de4fc3fb2a1 Mon Sep 17 00:00:00 2001 From: Zeph Grunschlag Date: Wed, 22 Mar 2023 14:16:04 -0500 Subject: [PATCH 5/5] Update pyteal/compiler/sourcemap.py --- pyteal/compiler/sourcemap.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyteal/compiler/sourcemap.py b/pyteal/compiler/sourcemap.py index 0f54c162f..c745c2a46 100644 --- a/pyteal/compiler/sourcemap.py +++ b/pyteal/compiler/sourcemap.py @@ -939,8 +939,8 @@ def _build_pc_sourcemap(self): ) teal: str = self.compiled_teal() - for template in pt.Tmpl.session_templates(): - teal = teal.replace(template, pt.Tmpl.zero(template)) + for placeholder in pt.Tmpl.session_templates(): + teal = teal.replace(placeholder, pt.Tmpl.zero(placeholder)) algod_compilation = algod.compile(teal, source_map=True) raw_sourcemap = algod_compilation.get("sourcemap")